Dalla sorgente C al bytecode Java? [chiuso]
-
19-08-2019 - |
Domanda
Sto cercando un modo per compilare il codice sorgente C in bytecode Java ad alte prestazioni. Ho usato con successo NestedVM , ma l'hit performance non è accettabile per un progetto lavorandoci. Ho anche visto vari progetti open source volti a questo problema e un paio di prodotti commerciali. Questa domanda SO tratta del problema generale della conversione non Java nel sorgente Java, ma voglio solo passare dal bytecode C al codice Java.
Qual è il modo migliore per compilare il codice sorgente C in bytecode Java puro ad alte prestazioni?
Soluzione
Uhm, questo è chiamato " un compilatore " ;. Stai chiedendo un compilatore C che abbia come target la JVM.
Altri suggerimenti
Essendo l'autore di Cibyl , potrei essere distorto qui. Ad ogni modo, ho esaminato il bytecode java generato dal compilatore assiomatico C, e non è efficiente. NestedVM e Cibyl funzionano entrambi compilando i binari MIPS e quindi traducendo il binario in bytecode Java. È sorprendentemente efficiente, con il principale problema è l'accesso alla memoria di valori di 8 e 16 byte (che deve essere fatto in più passaggi).
NestedVM e Cibyl hanno caratteristiche di prestazione leggermente diverse, con Cibyl che in genere è più veloce per carichi di lavoro a numero intero mentre NestedVM gestisce i galleggianti e raddoppia meglio. Questo perché Cibyl utilizza il supporto soft-float GCC (sebbene utilizzi le istruzioni in virgola mobile del bytecode Java "reale") mentre NestedVM traduce le istruzioni FPU MIPS.
Cibyl è anche più mirato agli ambienti J2ME, sebbene sia sicuramente utilizzabile anche su altre piattaforme. Suppongo che avresti più fortuna con entrambi che con il compilatore Axiomatic C.
Non è esattamente quello che hai chiesto, ma Cibyl converte compilato programmi C nel bytecode JVM. È la stessa idea di NestedVM (che hai menzionato) ma potrebbe essere più veloce per il tuo compito in quanto è un'implementazione indipendente.
Credo che alcuni progetti abbiano tentato questo, ma non c'è modo di gestire i puntatori senza alcune restrizioni piuttosto severe su ciò che può accedere a ciò (essenzialmente devono essere convertiti in indici di array e array allocati anziché in memoria)
Se hai C senza fare troppo affidamento sui puntatori e lo vuoi in JVM, potresti semplicemente convertirlo in Java - dovrebbe essere abbastanza facile e le prestazioni non dovrebbero essere troppo cattive. C batte ancora Java nella maggior parte delle aree di circa 2 volte con alcune aree molto peggio e in alcune aree Java batte effettivamente C (gestione della memoria heap, per uno), ma rispetto alla maggior parte delle altre lingue (almeno interpretate), java e c sono 100 volte più veloce, quindi la differenza tra loro è piuttosto insignificante da quel punto di vista.
prova il software C2J ................
digita c in traduttore java in google. otterrai il link per il download