2013-07-29 17 views
7

Stavo leggendo il codice sorgente di Lua e sorprendentemente ho scoperto che era stato implementato per generare alcune istruzioni dispari (ad esempio GETUPVAL, FORLOOP, ecc.) Quindi questi opcode sono eseguiti da una macchina virtuale. C'è qualche vantaggio per farlo (rispetto al puro interprete basato su AST?)Perché Lua è progettato per generare opcode intermedi?

Grazie.

risposta

9

L'utilizzo di macchine virtuali è una vecchia tecnica di implementazione per le lingue, che risale ad almeno USCD Pascal, BCPL e Smalltalk. La maggior parte dei linguaggi di scripting ora utilizza una macchina virtuale. Alcuni usano una macchina virtuale generica. Lua usa una macchina virtuale per scopi speciali che riflette la semantica della lingua. Da qui gli opcode specializzati. Lua ha introdotto novità in questo settore spostando la versione 5.0 in una macchina virtuale basata su registri, invece di una tradizionale basata su stack.

+0

Molto utile. Grazie :) – babel92

10

Per il confronto generale degli interpreti bytecode e degli interpreti dell'albero della sintassi astratta, vedere Wikipedia:Interpreter.

Lua è stato utilizzando una macchina virtuale fin dalla sua nascita, e ha introdotto una macchina virtuale basato su registri in Lua 5.0 (che è la prima macchina virtuale basato su registri di avere un ampio utilizzo.) The Evolution of Lua, scritto da degli autori Lua, fornisce molte risorse su questo argomento.

Un altro documento scritto da di Lua autori, The Implementation of Lua 5.0 fornisce un sacco di dettagli in merito all'attuazione, Capitolo 7 Virtual Machine sarebbe particolarmente utile a voi, questo lavoro è anche un grande riferimento per la lettura del codice sorgente di Lua.

+0

Grazie mille! Quei fogli sono abbastanza utili. – babel92