Per scrivere un compilatore, quali sono i vantaggi e gli svantaggi dell'utilizzo di LLVM IR vs C per una lingua di destinazione? So che entrambi sono usati, e immagino che il codice macchina finale sarebbe simile se dovessi usare clang per compilare la C. Quindi quali sono le altre cose da considerare?Lingua di output del compilatore - LLVM IR vs C
risposta
Ho usato LLVM IR per alcuni back-end del compilatore e ho lavorato con i compilatori che usano C come back-end. Una cosa che ho trovato che ha dato a LLVM IR un vantaggio è che è stata digitata. È difficile creare output completamente mal formati senza ottenere errori dalle librerie LLVM.
È anche più semplice mantenere una stretta correlazione tra il codice sorgente e l'IR per il debug, a mio parere.
Inoltre, si ottengono tutti i fantastici strumenti da riga di comando LLVM per analizzare ed elaborare l'IR emesso dal front-end.
Architetture e sistemi operativi per i quali non esiste CLANG ovviamente o per il quale è in uno stato sperimentale.
C è più ampiamente accettato, ma LLVM IR consente di alimentare il motore LLVM. Non tutti i percorsi verso IR sono uguali.
dubito che si possa implementare il supporto di debug corretto per la lingua quando il targeting C.
Questo era esattamente il motivo per cui stavo cercando questo thread. Non vedo come possano esserci "mappe di origine" sui simboli di debug, perché ci sono dei cambiamenti incompatibili con i generatori di simboli di debug dei compilatori C. Si dovrebbe aggiornare il software di mappatura dei simboli di debug con ogni modifica dei compilatori C supportati. –
vantaggi LLVM:
- JIT - è possibile compilare ed eseguire il codice in modo dinamico. Certo, lo stesso è possibile con C (ad es. Usando un
tcc
incorporato), ma è un'opzione molto meno robusta e portatile. - È possibile eseguire i propri passaggi di ottimizzazione sull'IR generato.
- Riflessione gratuita: l'ispezione del codice generato è molto più semplice con LLVM.
- La libreria LLVM non è grande come la maggior parte dei compilatori C (senza contare lo
tcc
, ovviamente).
svantaggi LLVM:
- codice non è portatile, si devono cambiare leggermente a seconda della destinazione. Esiste un sottoinsieme un po 'portatile di LLVM, ma è ancora una pratica dubbia.
- La dipendenza di runtime dalle librerie C++ potrebbe essere un po 'un problema.
hai dimenticato: se vuoi l'interoperabilità C (che lingua no?) Devi codificare tutti quei brutti C ABI tu stesso perché llvm non fa tutto da solo (divide quel lavoro 50/50 con clang) – cap
- 1. Debug LLVM IR
- 2. Conversione da GCC IR a LLVM IR
- 3. Lingua per compilatore basato su LLVM
- 4. Documentazione opcode IR LLVM
- 5. Come convertire llvm IR in codice c?
- 6. chiamate vs Invoke in codici IR di LLVM
- 7. frontend al compilatore basato su LLVM
- 8. Come compilare clang in llvm IR
- 9. Esiste un debugger per LLVM IR?
- 10. Capire il più semplice IR LLVM
- 11. Avvio automatico di una lingua su LLVM
- 12. Analisi e modifica codice LLVM IR
- 13. Bug di ottimizzazione del compilatore LLVM o cosa?
- 14. È possibile generare automaticamente llvm codice C++ api da LLVM-IR?
- 15. Accesso membri struct e array di struct da LLVM IR
- 16. IR LLVM: identificazione di variabili con nodi di metadati
- 17. Infrastruttura del compilatore LLVM per architetture VLIW
- 18. Rappresentare il tipo di puntatore vuoto in llvm ir
- 19. GWT directory di output del compilatore maven
- 20. Compilatore Apple LLVM 4.1 Errore
- 21. SpecFlow vs Cuke4Nuke vs Cetriolo + IR
- 22. Come implementare in modo efficiente chiusure in LLVM IR?
- 23. Configurare Eclipse CDT o Codeblocks per ottenere LLVM IR intellisense
- 24. Errore LLVM 3.1 Apple compilatore
- 25. Quanto è stabile la lingua dell'assemblaggio LLVM?
- 26. IR vs Data mining vs ML
- 27. LLVM (3.5+) PassManager vs LegacyPassManager
- 28. Cancellare una prima istruzione in Basic Block da LLVM IR?
- 29. Come verificare se l'istruzione è un'istruzione PHI in LLVM IR
- 30. Porting del compilatore da x86 Assembly a LLVM
Che cosa vuoi dire che IR è stato digitato? Anche C non è digitato? – Dan
Destra, C è stato digitato. Ma non ottieni un'indicazione dell'errore finché non provi a compilare il codice C. Con LLVM IR si ottiene un'indicazione dell'errore quando si genera l'IR. Molto più facile da eseguire il debug. –