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
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. –