La maggior parte dei compilatori ha un front-end, un codice/struttura di qualche tipo e il back-end. Quando si prende il programma C e si usa clang e si compila in modo tale che si finisca con un programma x86 non-JIT che si può semplicemente eseguire, si è passati da frontend a middle a backend. Lo stesso vale per gcc, gcc passa da frontend a middle thing e backend. La cosa intermedia di Gccs non è ampia e utilizzabile come quella di LLVM.
Ora una cosa che è divertente/interessante su llvm, che non puoi fare con gli altri, o almeno gcc, è che puoi prendere tutti i moduli del tuo codice sorgente, compilarli in un bytecode di llvms, unirli in un unico grande il file bytecode, quindi ottimizza l'intera cosa, anziché l'ottimizzazione per ogni file o funzione che ottieni con altri compilatori, con llvm puoi ottenere qualsiasi livello di ottimizzazione del programma da compilare a tuo piacimento. allora puoi prendere quel codice bytecode e usare llc per esportarlo nell'assembler dei bersagli. Io di solito lo faccio in modo embedded, quindi ho il mio codice di avvio che mi avvolge, ma in teoria dovresti essere in grado di prendere quel file assembler e con gcc compilarlo e collegarlo ed eseguirlo. gcc myfile.s -o miofile.Immagino che ci sia un modo per ottenere gli strumenti llvm per farlo e non dover usare binutils o gcc, ma non mi ci è voluto del tempo.
Mi piace llvm perché è sempre un compilatore incrociato, a differenza di gcc non è necessario compilarne uno nuovo per ogni obiettivo e gestire le sfumature per ciascun target. Non so che ho alcun uso per la cosa JIT è quello che sto dicendo che lo uso come cross compilatore e come compilatore nativo.
Quindi il tuo primo caso è il fronte, il centro, la fine e il processo è nascosto da te, inizi con la fonte e ottieni un binario, fatto. Il secondo caso è se capisco la parte anteriore e quella centrale e si fermano con un file che rappresenta il centro. Quindi il medio verso la fine (il processore di destinazione specifico) può avvenire appena in tempo in fase di esecuzione. La differenza è che il backend, l'esecuzione in tempo reale della seconda lingua del secondo caso, è probabilmente diverso dal backend del caso uno.
fonte
2010-08-20 00:44:00
Quindi, per usare LLVM come JIT che c'è bisogno di collegarlo nella vostra applicazione, giusto? Ci sono applicazioni che lo fanno? – zaharpopov