2012-04-22 19 views
8

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

7

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.

+1

Che cosa vuoi dire che IR è stato digitato? Anche C non è digitato? – Dan

+3

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

0

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.

1

dubito che si possa implementare il supporto di debug corretto per la lingua quando il targeting C.

+0

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

2

vantaggi LLVM:

  1. 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.
  2. È possibile eseguire i propri passaggi di ottimizzazione sull'IR generato.
  3. Riflessione gratuita: l'ispezione del codice generato è molto più semplice con LLVM.
  4. La libreria LLVM non è grande come la maggior parte dei compilatori C (senza contare lo tcc, ovviamente).

svantaggi LLVM:

  1. codice non è portatile, si devono cambiare leggermente a seconda della destinazione. Esiste un sottoinsieme un po 'portatile di LLVM, ma è ancora una pratica dubbia.
  2. La dipendenza di runtime dalle librerie C++ potrebbe essere un po 'un problema.
+0

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