Che cos'è esattamente LLVM?


Risposte:


369

LLVM è una libreria utilizzata per costruire, ottimizzare e produrre codice macchina intermedio e / o binario.

LLVM può essere utilizzato come framework di compilazione, in cui viene fornito il "front-end" (parser e lexer) e il "back-end" (codice che converte la rappresentazione di LLVM in codice macchina effettivo).

LLVM può anche fungere da compilatore JIT - ha il supporto per la generazione di assiemi x86 / x86_64 e PPC / PPC64 con rapide ottimizzazioni del codice volte alla velocità di compilazione.

Se sei interessato, puoi giocare con il codice macchina di LLVM che viene generato dal codice C o C ++ nella loro pagina demo , ma la pagina demo è attualmente disabilitata dall'anno 2013.


39
Se vuoi giocarci, guarda questo fantastico articolo: gnuu.org/2009/09/18/writing-your-own-toy-compiler
LiraNuna

29
Il link fornito nella risposta dice "La pagina demo di LLVM è attualmente disabilitata".
EngrStudent,

5
ellcc.org/demo/index.cgi è un altro modo di giocare con la compilazione di C / C ++ attraverso LLVM su vari target, incluso il codice intermedio
Tom Goodfellow,

1
puoi fare un vero esempio di cosa significhi?
Migrate2Lazarus guarda il mio profilo il

112

Un buon riassunto di LLVM è questo:

inserisci qui la descrizione dell'immagine

Al frontend hai Perl e molte altre lingue di alto livello. Nel backend, hai il codice nativo che viene eseguito direttamente sulla macchina.

Al centro è la rappresentazione del codice intermedio. Se ogni linguaggio di alto livello può essere rappresentato in questo formato IR LLVM, gli strumenti di analisi basati su questo IR possono essere facilmente riutilizzati - questa è la logica di base.


39
l'immagine vale più di mille parole 👍
ipatch

3
Quindi sembra che LLVM sia utile per i progettisti di compilatori. Un programmatore dovrebbe preoccuparsi se si compila con un compilatore standard o uno basato su LLVM, oltre ad analizzare il codice generato indipendentemente dal codice sorgente?
jinawee,

4
se puoi compilare con LLVM sul suo IR, allora molti strumenti potrebbero essere aperti per analizzare l'IR. Ma se il tuo strumento è in grado di analizzare solo i binari nativi (ad esempio x86), allora se si tratta di binari generati da LLVM o binari generati da gcc o generati da compilatori Intel, non ha alcuna differenza.
Peter Teoh,

73

LLVM (usato per indicare "Macchina virtuale di basso livello" ma non più) è un'infrastruttura di compilazione, scritta in C ++, progettata per l'ottimizzazione in fase di compilazione, tempo di collegamento, tempo di esecuzione e "tempo di inattività" dei programmi scritti in linguaggi di programmazione arbitrari. Originariamente implementato per C / C ++, il design indipendente dal linguaggio (e il successo) di LLVM da allora ha generato una grande varietà di front-end, tra cui Objective C, Fortran, Ada, Haskell, Java bytecode, Python, Ruby, ActionScript, GLSL , e altri.

Leggi questo per ulteriori spiegazioni Guarda
anche Unladen Swallow


13
.. quindi cosa stanno cercando di dire i documenti; mentre LLVM è l'acronimo di Low Level Virtual Machine , il progetto è semplicemente chiamato LLVM , non le parole completamente scritte.
Jochem Kuijpers,

2
In precedenza aveva sopra l'abbreviazione ma in seguito rimosso en.wikipedia.org/wiki/LLVM
VVB

2
Riassumendo i commenti. "La macchina virtuale di basso livello (LLVM)" dovrebbe essere qualcosa come "LLVM (che significava" macchina virtuale di basso livello "all'inizio della durata del progetto)"
ssokolow,

52

Secondo il libro "Introduzione a LLVM Core Libraries" (c):

In effetti, il nome LLVM potrebbe riferirsi a uno dei seguenti:

  • Il progetto / infrastruttura LLVM: questo è un ombrello per diversi progetti che, insieme, formano un compilatore completo: frontend, backend, ottimizzatori, assemblatori, linker, libc ++, compilatore-rt e un motore JIT. La parola "LLVM" ha questo significato, ad esempio, nella seguente frase: "LLVM comprende diversi progetti".

  • Un compilatore basato su LLVM: questo è un compilatore creato parzialmente o completamente con l'infrastruttura LLVM. Ad esempio, un compilatore potrebbe utilizzare LLVM per il frontend e il backend ma utilizzare le librerie di sistema GCC e GNU per eseguire il collegamento finale. LLVM ha questo significato nella frase seguente, ad esempio: "Ho usato LLVM per compilare programmi C su una piattaforma MIPS".

  • Librerie LLVM: questa è la parte di codice riutilizzabile dell'infrastruttura LLVM. Ad esempio, LLVM ha questo significato nella frase: "Il mio progetto usa LLVM per generare codice attraverso il suo framework di compilazione Just-in-Time".

  • Core LLVM: le ottimizzazioni che si verificano a livello di linguaggio intermedio e gli algoritmi di backend formano il core LLVM da cui è partito il progetto. LLVM ha questo significato nella seguente frase: "LLVM e Clang sono due progetti diversi".

  • IR LLVM: questa è la rappresentazione intermedia del compilatore LLVM. LLVM ha questo significato quando usato in frasi come "Ho costruito un frontend che traduce la mia lingua in LLVM".


35

LLVM è fondamentalmente una libreria utilizzata per compilare compilatori e / o software orientati al linguaggio. L'essenza di base è che sebbene tu abbia gcc che è probabilmente la suite di compilatori più comune, non è costruita per essere riutilizzabile, ad es. è difficile prendere componenti da gcc e usarlo per creare la propria applicazione. LLVM affronta bene questo problema costruendo una serie di "tecnologie di compilatore e toolchain modulari e riutilizzabili" che chiunque potrebbe usare per costruire compilatori e software orientato al linguaggio.


6
Quindi LLVM è la libreria e Clang è il compilatore?
Abdul,

11
Clang è il compilatore frontend C / C ++ di LLVM. Converte il codice C in bitcode LLVM, che viene tradotto in un linguaggio Assembly da un compilatore back-end.
Boris Mulder,

6

L'infrastruttura del compilatore LLVM è particolarmente utile per eseguire ottimizzazioni e trasformazioni sul codice. Consiste anche in una serie di strumenti che servono usi distinti. llvm-prof è uno strumento di profilazione che consente di eseguire la profilazione dell'esecuzione al fine di identificare gli hotspot del programma. Opt è uno strumento di ottimizzazione che offre vari passaggi di ottimizzazione (eliminazione del codice morto ad esempio).

È importante sottolineare che LLVM ti fornisce le librerie per scrivere i tuoi Pass. Ad esempio, se è necessario aggiungere un controllo di intervallo su determinati argomenti passati a determinate funzioni di un programma, è sufficiente scrivere un semplice passaggio LLVM.

Per ulteriori informazioni sulla scrittura del proprio pass, consultare questo http://llvm.org/docs/WritingAnLLVMPass.html

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.