In che modo è LLVM Low Level?


12

In che modo LLVM (Low Level Virtual Machine) Low Level? (Al momento in cui scrivo, non ho trovato questa espansione dell'abbreviazione "LLVM" sul suo sito web, ma su Wikipedia .)

Si chiama "Low Level" in cosa è progettato per (un'infrastruttura di compilazione) o perché funziona su un "livello inferiore" rispetto ad altri strumenti?

Come (tipo di) "illustrazione" di questo, LLVM è di livello inferiore rispetto a JVM e CLR , oppure è progettato solo per usi di "livello inferiore"?

Risposte:


16

LLVM è di livello inferiore rispetto alle VM tipiche come JVM e CLR. Ad esempio, sebbene abbia hook per un Garbage Collector, non fornisce un Garbage Collector stesso.

Allo stesso modo, JVM ha un compilatore JIT integrato (tranne nelle versioni davvero antiche). LLVM ha alcuni compilatori JIT per LLVM IR, ma spetta ancora allo sviluppatore agganciare le cose e in realtà il codice JIT.

Quando JVM incontra un esterno non risolto, esce 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 hook in cui puoi decidere come gestire cose del genere. Come ci si aspetterebbe, alcune persone hanno scritto alcune versioni predefinite, quindi può fare le cose all'incirca nello stesso ordine della JVM, ma sei anche libero di ignorarle e fare le cose in modo diverso se lo desideri.

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


1 Tecnicamente, non tutto questo è integrato nella JVM corretta. Specifica quello che di solito viene chiamato il caricatore di classi primordiale come parte della JVM propria, 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 si desidera, è possibile integrare quelli definendone uno proprio.


12

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

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

LLVM offre supporto per la compilazione statica e JIT ed è progettata in modo tale da poter essere eseguita nello spazio di sistema operativo attendibile. Ciò significa che, in teoria, eseguire 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 inferiore, dovrebbe essere più facile da trasferire su architetture hardware e hardware diverse.

Si possono ottenere grandi risparmi se gli implementatori del linguaggio potessero scrivere su un'unica piattaforma di basso livello facile da trasportare. Le macchine virtuali più conosciute si trovano a metà strada tra la lingua che servono e il sistema operativo e devono implementare le proprie rappresentazioni intermedie e JITC.


5

La parte "basso livello" del nome LLVM si riferisce al livello del set di istruzioni virtuale 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 è invece di livello abbastanza alto in quanto ha istruzioni che si trovano su un livello di astrazione più elevato. Sono entrambi linguaggi di assemblaggio basati su stack orientati agli oggetti. Ad esempio, la JVM ha l'istruzione invokevirtual, che è un'istruzione che deve conoscere lo specifico modello a oggetti del linguaggio Java.


3

È sicuramente di livello inferiore rispetto a qualsiasi VM specifica della 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 di tipo specifico di alto livello, non viene assunto alcun allineamento (deve essere specificato esplicitamente), i tipi di dati interi e in virgola mobile sono espliciti (e dipendenti dalla piattaforma) e il livello più basso di tutti: a l'aritmetica del puntatore decente è disponibile.

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.