Perché LLVM ha un IR simile a un assieme piuttosto che un IR simile a un albero? Oppure: perché i progetti hanno come obiettivo LLVM IR invece di AST di clang?

14

Perché la rappresentazione intermedia di LLVM (LLVM IR) è simile all'assemblaggio piuttosto che ad albero?

In alternativa, perché le implementazioni linguistiche hanno come target LLVM IR piuttosto che l'AST di clang?

Non sto cercando di porre due domande diverse contemporaneamente se sembra che sia così. Per me, sembra semplicemente che sia i programmatori di client che di biblioteca abbiano raggiunto il consenso sul fatto che l'API di LLVM, niente di più e niente di meno, è ovviamente un buon design del software e la mia domanda è "perché?".

La ragione per cui chiedo è che sembra che LLVM potrebbe fornire più funzionalità ai frontend se è IR come AST, perché allora gli strumenti basati su AST di clang potrebbero essere utilizzati per qualsiasi frontend. In alternativa, le lingue che hanno come target LLVM IR potrebbero ottenere più funzionalità se mirassero all'AST di clang.

Clang ha classi e funzioni per creare e lavorare con AST ed è il progetto di frontend solo che è strongmente legato al progetto LLVM, quindi perché la funzionalità AST di clang è esterna a LLVM?

In cima alla mia testa, so che Rust (ruggine), D (ldc) e Haskell (GHC) possono tutti usare LLVM come back-end ma non usano il Clang AST (per quanto ne so , Potrei sbagliarmi). Non conosco tutti i dettagli interni di questi compilatori, ma almeno Rust e D sembrano certamente essere compilati per fare clang di AST. Forse anche Haskell potrebbe farlo, ma io ne sono molto meno certo.

Questo è dovuto a motivi storici (LLVM originariamente era una "macchina virtuale di basso livello" e si verificava un clang in seguito)? Questo perché altri frontend vogliono avere il maggior controllo possibile su ciò che alimentano a LLVM? Ci sono delle ragioni fondamentali per cui l'AST di clang è inappropriato per le lingue "non simili a C"?

Non intendo che questa domanda sia un esercizio di mindreading. Voglio solo che sia utile per quelli di noi che sono curiosi, ma non già fluenti, nella progettazione del compilatore. Dato che i progetti LLVM e clang sono sviluppati in pubblico, spero che qualcuno che abbia familiarità con lo sviluppo di questi progetti possa rispondere o che la risposta sia abbastanza ovvia per alcuni nerd compilati che si sentono abbastanza sicuri di rispondere.

Per anticipare alcune risposte ovvie ma insoddisfacenti:

Sì, avere un IR simile a un assembly dà più controllo a chiunque faccia l'IR (forse X lang ha un codice e un formato AST migliori di clang) ma se questa è l'unica risposta, allora la domanda diventa "perché LLVM solo hanno un IR simile a un assieme invece di un IR ad alto livello e un IR di basso livello come un assembly? ".

Sì, non è così difficile analizzare un linguaggio di programmazione in un AST (almeno rispetto agli altri passaggi della compilazione). Anche così, perché utilizzare AST separati? Se non altro, l'utilizzo dello stesso AST consente di utilizzare strumenti che operano su AST (anche solo cose semplici come le stampanti AST).

Sì, io con forza sono d'accordo sul fatto che essere più modulare è una buona cosa, ma se questa è l'unica ragione, allora perché le implementazioni di altre lingue tendono a colpire LLVM IR invece dell'AST di clang?

Queste pre-emption potrebbero essere errate o trascurare i dettagli, quindi sentiti libero di dare queste risposte se hai maggiori dettagli o se le mie supposizioni sono sbagliate.

Per tutti coloro che desiderano rispondere a una domanda più definitiva: quali sono i vantaggi e gli svantaggi di un IR simile a un assieme o un IR simile a un albero?

    
posta Praxeolitic 16.08.2017 - 12:09
fonte

1 risposta

13

Qui c'è una serie di domande correlate, cercherò di separarle nel miglior modo possibile.

Perché gli altri linguaggi si basano su LLVM IR e non su CHANG AST?

Questo è semplicemente perché clang è un front end C / C ++ e l'AST che produce è strettamente accoppiato a C / C ++. Un altro linguaggio potrebbe usarlo, ma avrebbe bisogno di una semantica identica a qualche sottoinsieme di C / C ++ che è molto limitante. Come fai notare, l'analisi di un AST è abbastanza semplice, quindi è improbabile che limitare le tue scelte semantiche valga il piccolo risparmio.

Tuttavia, se stai scrivendo tooling per C / C ++ ad es. analizzatori statici, quindi riutilizzare l'AST ha molto senso poiché è molto più semplice lavorare con AST rispetto al testo non elaborato se si lavora con C / C ++.

Perché LLVM IR è il modulo che è?

LLVM IR è stato scelto come forma appropriata per scrivere ottimizzazioni del compilatore. In quanto tale, la sua caratteristica principale è che si trova nel modulo SSA . È un IR piuttosto basso, quindi è applicabile a una vasta gamma di lingue, ad es. non scrive memoria in quanto varia molto da lingua a lingua.

Ora, accade che scrivere ottimizzazioni del compilatore è un compito piuttosto specialistico ed è spesso ortogonale alla progettazione delle caratteristiche linguistiche. Tuttavia, avere un linguaggio compilato eseguito velocemente è un requisito abbastanza generale. Inoltre, la conversione da LLVM IR a ASM è abbastanza meccanica e non è in generale interessante per i progettisti di linguaggi.

Pertanto, l'abbassamento di una lingua in LLVM IR offre a un progettista di linguaggio un sacco di "materiale gratuito" che è molto utile in pratica, lasciando loro a concentrarsi sulla lingua stessa.

Sarebbe utile un IR diverso (OK, non chiesto ma in qualche modo implicito)?

Assolutamente! Gli AST sono abbastanza buoni per certe trasformazioni sulla struttura del programma, ma sono molto difficili da usare se si desidera trasformare il flusso del programma. Un modulo SSA è generalmente migliore. Tuttavia, LLVM IR è un livello molto basso, quindi gran parte della struttura di alto livello è persa (di proposito, quindi è più generalmente applicabile). Avere un IR tra AST e IR di basso livello può essere utile qui. Sia Rust che Swift adottano questo approccio e hanno un IR di alto livello tra i due.

    
risposta data 16.08.2017 - 15:30
fonte

Leggi altre domande sui tag