È un modo per progettare compilatori moderni, ovvero avere un front-end
separato dal backend
.
Il compilatore front-end
traduce la lingua in una lingua intermedia che il back-end può selezionare e compilare in modo nativo.
Questo rende il compilatore modulare dove è più facile passare da implementazioni back-end. Ad esempio, in Java esistono troppe JVM e il motivo per cui esistono è dovuto al fatto che javac
non ne sa nulla, produce solo codice byte che la macchina virtuale può elaborare.
In .Net per esempio, C # e VB.Net producono IL che il CLR può compilare ed eseguire. Ciò significa che Microsoft ha creato una VM per qualsiasi lingua che produce IL.
Ritorno a Java, ci sono troppe lingue JVM. Perché pensi che sia il caso? Poiché il progettista di linguaggi non ha bisogno di preoccuparsi di scrivere una VM che è molto difficile, può progettare la propria lingua, compilare in IL e farla girare su qualsiasi VM.
Avere la VM o il back-end è un modulo completamente separato è così vantaggioso, è possibile avere team che lavorano sul backend facendo ottimizzazioni di codice, JIT, GC, ecc. e altri che lavorano sulla progettazione della lingua.
Tuttavia, penso che GC sia un'eccezione qui, dove penso che la lingua dovrebbe sapere se un GC esiste o meno (non sono a conoscenza di un linguaggio che ti permette di disattivare il GC), ma questa è l'unica cosa il linguaggio deve saperlo, ad esempio in Java è possibile passare dall'implementazione GC con pochi argomenti del programma. Non è fantastico?
......