2012-07-11 9 views
11

Sto lavorando al mio linguaggio di programmazione giocattolo. Per ora sto interpretando il linguaggio sorgente da AST e mi chiedo quali vantaggi compili per un codice byte e quindi l'interpretazione possa fornirmi.Quali sono le motivazioni alla base della compilazione in byte-code?

Per ora ho tre cose in mente:

  • Lettura delle centinaia di alberi di sintassi di tempo può essere più lenta esecuzione istruzioni in una matrice, in particolare se il supporto di matrice O (1) ad accesso casuale (es. saltare 10 istruzioni su e giù).
  • In ambiente di esecuzione tipizzato, ho alcuni costi di runtime perché il mio AST è digitato, e lo sto attraversando costantemente (cioè ho 10 tipi di nodi e devo controllare di che tipo sono ora per eseguire). Forse la compilazione di un codice byte non tipizzato potrebbe aiutare a migliorare questo, poiché dopo il controllo dei tipi e la compilazione, avrei un valore e un codice non tipizzato.
  • La compilazione a byte-code può fornire una migliore portabilità.

I miei punti sono corretti? Quali sono alcune altre motivazioni dietro la compilazione in bytecode?

+0

Correndo su un interprete aumenta la portabilità del tuo codice – Luis

+0

@Luis, sì questo era già nella mia mente, ho dimenticato di aggiungere .. – sinan

+0

@Luis: è falso. Gli AST serializzati possono essere resi ugualmente portabili. Bytecode potrebbe infatti non essere portatile; Bytecode Python è specifico per ogni versione dell'interprete. –

risposta

5

La velocità è la ragione principale; interpretare gli AST è troppo lento in pratica.

Un altro motivo per utilizzare bytecode è che può essere banalmente serializzato (memorizzato su disco), in modo da poterlo distribuire. Questo è ciò che fa Java.

+0

hmm, quindi è fondamentalmente questo. Speravo di trovare altre motivazioni interessanti. – sinan

+0

"Questo è ciò che fa Java". python no? –

6

Il punto di generazione del codice byte (o di qualsiasi altra forma "facilmente interpretabile" come il codice filettato) è essenzialmente prestazioni.

Per un interprete AST per decidere cosa fare dopo, è necessario attraversare l'albero, ispezionare i nodi, determinare il tipo di nodi, controllare il tipo di qualsiasi operando, verificare la legalità e decidere quale caso speciale dell'AST- l'operatore designato si applica (dice "+", ma significa 16 bit add o string concatenate?), prima che alla fine esegua qualche azione.

Se si prende l'azione finale e si genera una sorta di struttura facilmente interpretabile, allora al momento dell'esecuzione l'interprete può concentrarsi semplicemente sull'esecuzione di azioni senza tutto quel controllo/determinazione del caso speciale.

Un'altra scusa recente è che se si genera codice byte per una delle numerose macchine virtuali note (JVM, MSIL, Parrot, ecc.) Non è necessario codificare l'interprete. Per JVM e MSIL, hai anche il vantaggio dei compilatori JIT ad essi associati, e con un'attenta progettazione del tuo linguaggio, compatibilità con enormi librerie, che sono la vera attrazione di Java e C#.

Problemi correlati