In che modo (s) LLVM è di basso livello?

12

In che modo (s) è LLVM (Low Level Virtual Machine) Basso livello? (Al momento della scrittura, non ho trovato questa espansione dell'abbreviazione "LLVM" sul suo sito web, ma su Wikipedia ).

Si chiama "Basso Livello" in che cosa è progettato (un'infrastruttura del compilatore) o perché funziona su un "livello inferiore" rispetto ad altri strumenti?

Come (una specie) "illustrazione" di questo, è LLVM di livello inferiore rispetto alla JVM e CLR , o è solo progettato per "usi di livello inferiore"?

    
posta Abbafei 31.03.2011 - 04:46
fonte

4 risposte

16

LLVM è un livello inferiore rispetto alle macchine virtuali tipiche come JVM e CLR. Ad esempio, mentre ha hook per un garbage collector, non fornisce un garbage collector.

Allo stesso modo, la JVM ha un compilatore JIT incorporato (tranne che in versioni veramente antiche). LLVM ha alcuni compilatori JIT per LLVM IR, ma è ancora compito dello sviluppatore collegare le cose insieme e in realtà JIT il codice.

Quando la JVM incontra un esterno non risolto, si spegne e trova la classe giusta per soddisfarlo e sa come cercare i file .class direttamente nel file system e nei file .jar 1 . I compilatori JIT di LLVM hanno degli hook in cui puoi decidere come gestire queste cose. Come previsto, alcune persone hanno scritto alcune versioni predefinite, quindi può fare le cose più o meno nello stesso ordine della JVM - ma puoi anche ignorarle e fare le cose diversamente se si sceglie.

In poche parole, se stai sviluppando un compilatore (o qualcosa del genere) ha molti strumenti per semplificarti la vita. Invece di preoccuparti molto dell'ottimizzazione, puoi fare approssimativamente la traduzione più semplice che puoi gestire dal tuo codice sorgente a LLVM IR, quindi utilizzare le librerie LLVM per gestire l'ottimizzazione, JIT, il collegamento, ecc. Tuttavia, sono librerie - fornisce alcune funzioni davvero utili in modo da non dover gestire tutti i dettagli, ma sono comunque funzioni e stai ancora scrivendo il codice per invocarle. Non è un prodotto finito, solo strumenti utili per la costruzione di prodotti in modo relativamente rapido e semplice.

1 Tecnicamente, non tutto questo è incorporato nella JVM propriamente detta. Specifica ciò che in genere viene chiamato il caricatore di classi primordiali come parte della JVM corretta, e quindi ci sono caricatori di classi utente specificati in java.util.ClassLoader che gestiscono altre cose. Alcuni caricatori di classi sono inclusi per impostazione predefinita e, se lo desideri, puoi integrare quelli definendone uno tuo.

    
risposta data 31.03.2011 - 08:34
fonte
12

È livello basso perché è progettato in modo che le macchine virtuali esistenti o future (la JVM) possano utilizzarlo come nucleo della loro implementazione.

Vedi in questo modo: le macchine virtuali di Java e Python sono molto portabili perché sono scritte in C standard e fanno molto affidamento sulle proprie librerie. L'intento di LLVM è quello di fornire un'infrastruttura in modo che sia facile trasferire qualsiasi macchina virtuale su una piattaforma che già supporta LLVM.

LLVM offre supporto per la compilazione statica e JIT e in è progettato in modo che possa essere eseguito nello spazio del sistema operativo attendibile. Ciò significa che, in teoria, l'esecuzione di una macchina virtuale su LLVM dovrebbe significare molto meno lavoro e produrre qualcosa di molto più veloce ed efficiente. In teoria.

Quindi LLVM, essendo di livello più basso, dovrebbe essere più facile da trasferire su architetture OS e hardware differenti.

Ci sono grandi risparmi da ottenere se gli implementatori linguistici potrebbero scrivere su un'unica piattaforma di basso livello facile da trasportare. Le VM più conosciute sono a metà strada tra la lingua che servono e il sistema operativo, e devono implementare le proprie rappresentazioni intermedie e JITC.

    
risposta data 31.03.2011 - 06:14
fonte
5

La parte "low level" del nome LLVM si riferisce al livello del set di istruzioni virtuali utilizzato. Il linguaggio intermedio (IR) utilizzato da LLVM è vicino al livello del codice macchina, sebbene sia indipendente dall'architettura e generale.

Il bytecode di JVM e CLR d'altra parte è abbastanza alto in quanto ha istruzioni che si trovano su un livello di astrazione più alto. Sono entrambi linguaggi di assembly basati sugli oggetti orientati agli oggetti. Ad esempio la JVM ha l'istruzione invokevirtual, che è un'istruzione che deve conoscere il modello di oggetto specifico del linguaggio Java.

    
risposta data 31.03.2011 - 08:04
fonte
3

È certamente un livello inferiore rispetto a qualsiasi VM specifica per la lingua e VM unificate come JVM e CLR. Il suo design è vicino alla rappresentazione intermedia di basso livello in GCC (GIMPLE) e compilatori simili. Non esiste un GC predefinito, non viene applicato alcun sistema specifico di tipo di alto livello, non viene assunto alcun allineamento (deve essere specificato esplicitamente), i tipi di dati integer e floating point sono espliciti (e dipendenti dalla piattaforma) e il livello più basso di tutti è disponibile un'aritmetica puntatore decente.

    
risposta data 31.03.2011 - 11:56
fonte

Leggi altre domande sui tag