Il titolo della domanda parla da solo. Sto pensando in modo specifico in termini di un server Node.js. Inoltre, questa domanda presuppone che non ti serva eval()
.
Inoltre, se questo non è possibile, perché no?
È facile compilare qualsiasi linguaggio, non importa quanto dinamico, al codice macchina. Semplicemente non sarà un codice macchina efficiente , dato che di solito esegue molti dispatch in base ai tag di tipo run time e cerca i valori nelle tabelle hash, proprio come un interprete (bytecode).
Nel caso più semplice, basta compilare il codice C come
#include <some_js_vm.h>
static char[] source = "... JavaScript ...";
int main() {
js_run(source);
return 0;
}
Per JavaScript senza eval
, ci sono ancora diverse funzionalità che richiedono un codice macchina inefficiente quando vengono compilate staticamente:
with
, che modifica l'ambito e la semantica delle variabili in base ai membri di un oggetto. Questo è solo un problema a causa del prossimo punto. new Function(str)
e altri equivalenti morali a eval
. Infatti, Javascript è (all'interno di diversi browser principali) spesso "compilato" usando la compilation Just-in-Time tecniche (leggi sul motore Javascript V8 ). Ma come spiegato delnan , ci sono casi in cui non ne vale la pena. AFAIK alcune implementazioni utilizzano tecniche Tracciamento JIT .
E eval
potrebbe essere implementato chiamando il compilatore. Diverse implementazioni Lisp (in particolare SBCL ) lo fanno (e Lisp può essere dinamico come Javascript).
E asmjs.org definisce una specifica di un sottoinsieme di Javascript progettato per essere facile da compilare.
Node.js usa il motore V8, che è un puro compilatore. Non interpreta mai. Non c'è nemmeno un interprete in V8, solo due compilatori.
Leggi altre domande sui tag programming-languages javascript compiler