Da un punto di vista tecnico, JavaScript potrebbe essere compilato anziché interpretato?

1

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?

    
posta neelsg 28.08.2014 - 16:49
fonte

3 risposte

6

È 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.
  • I campi di qualsiasi oggetto sono dinamici (e no, non è sempre possibile dedurli), il che significa che il codice può aggiungere e rimuovere campi in fase di esecuzione. Quindi gli oggetti rimangono tabelle hash glorificate, e dato che il compilatore è statico non può davvero tirare trucchi come "classi nascoste" in V8 (che accelera notevolmente l'accesso agli attributi per la maggior parte degli oggetti).
  • new Function(str) e altri equivalenti morali a eval .
  • L'intero sistema prototipo, e quindi tutti i metodi sono impostati in fase di esecuzione, il che significa che non è possibile utilizzare vtables o simili, o persino assumere di conoscere tutti i prototipi.
risposta data 28.08.2014 - 17:15
fonte
5

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.

    
risposta data 28.08.2014 - 17:19
fonte
-2

Node.js usa il motore V8, che è un puro compilatore. Non interpreta mai. Non c'è nemmeno un interprete in V8, solo due compilatori.

    
risposta data 29.08.2014 - 00:21
fonte

Leggi altre domande sui tag