2009-07-13 14 views
40

Esiste un compilatore di codice macchina nativo per JavaScript? Non sto parlando di una VM. Se non esiste può essere fatto?
Mi chiedo se possa essere compilato in binario a causa della natura dinamica della lingua.Esiste un compilatore di codice macchina nativo per JavaScript?

+0

Stavi parlando di JScript.NET? – Shimmy

+0

Mi chiedo un piccolo chiarimento: con "compilatore nativo di codice macchina", intendi un compilatore che accetta un programma Javascript e produce un eseguibile (Static Compilation), o vuoi solo dire che è tutto possibile tradurre codice javascript in macchina codice (ad esempio i compilatori JIT in Tracemonkey (Firefox) e V8 (Chrome) produrranno il codice macchina nativo dall'attuale javascript in esecuzione, quindi non è necessario interpretarli più volte.) – Falaina

+1

Sto chiedendo la compilazione statica . –

risposta

26

Per quanto ne so, non ci sono compilatori statici per JavaScript. È certamente teoricamente possibile; tuttavia, una compilazione statica di JavaScript richiede un runtime molto pesante per supportare tutte le sue funzionalità (come la digitazione dinamica e l'eval). A parte il piccolo, quando si presentava la necessità di compilare staticamente Python (un altro linguaggio dinamico), gli sviluppatori PyPy hanno finito per creare un linguaggio che era un sottoinsieme molto ristretto di Python (chiamato RPython), privo di alcune delle funzionalità più dinamiche di Python, che era in grado di essere compilato staticamente.

Se lo stai chiedendo allo scopo di creare un eseguibile standalone dal codice JavaScript, sono sicuro che ci devono essere wrapper che essenzialmente creerebbero un eseguibile contenente il tuo script e una VM JavaScript incorporata (purtroppo, non lo faccio ne conosco in modo casuale).

+1

Il primo JIT basato su browser è stato rilasciato con FF 3.5 circa un mese prima della risposta a questa domanda. –

+0

+1 per PyPy. 'RPython' non è compilato staticamente di per sé, invece, il programma' RPython' è avviato in 'CPython', e viene catturata un'istantanea di tutti gli oggetti attualmente in memoria. Ciò garantisce che tutti i tipi di specializzazione ecc. Siano già stati eseguiti. Ciò significa anche che l'input del programma RPython è severamente limitato, ad es. non è possibile 'json.load' qualcosa e ottenere i tipi al volo. –

2

È teoricamente possibile, ma ci sarà un sacco di bagaglio di supporto in fase di esecuzione (e anche un compilatore o interprete Javascript completo per supportare eval).

Stai cercando un compilatore di codice nativo o stai cercando qualcosa che possa unire codice Javascript insieme a un runtime in un singolo binario eseguibile?

+3

Sto cercando un compilatore di codice nativo attuale –

25

E 'sicuramente fattibile, anche se l'unico modo che conosco come farlo in questo momento è un processo in due fasi ...

  1. Compilare il javascript per Java utilizzando Mozilla Rhino JSC.
  2. Compilare il file di classe java risultante in eseguibile utilizzando qualcosa come GNU's GCJ.

Perché vorresti, però? Quale vantaggio ti aspetti di trovare?

+12

È solo per curiosità. Mi piace molto il javascript. –

1

TraceMonkey in FF3.5 fare questo per alcune parti del codice javascript. Potresti essere in grado di ottenere alcune indicazioni da lì!

+0

Non proprio. Non ho trovato nulla di utile lì. –

+0

Ciò non aiuta, poiché Tracemonkey non è in grado di eseguire questa operazione su * tutte * le parti del codice. – Bergi

2

Sono sicuro che Microsoft ha un Jscript scaricabile ("javascript Microsoft") compilatore

se si dispone di Windows: Se si scrive un file di testo javascript è possibile compilarlo da: aprendo il prompt dei comandi utilizzando cd per arrivare alla directory dei file di testo (se avete Windows) tipo: C: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ jsc.exe textfile.js

altrimenti: scaricare un compilatore jscript digitare la directory del compilatore jscript e quindi il nome del javascript tex t file

è possibile aggiungere variabili di ambiente se non si desidera digitare l'intero nome della directory sul compilatore.

questo ragazzo spiega meglio: http://www.phpied.com/make-your-javascript-a-windows-exe/

io personalmente penso che questo è davvero cool. Spero solo che ci fosse più documentazione per questo.

Sono quasi sicuro che questo è quello che stai cercando, ma sono un po 'nuovo.

+2

La compilazione su .net IL-code non viene compilato in una lingua nativa come interrogato, il codice IL è in realtà interpretato (Just in time). Solo così sai;) – Remco

+0

@Remco: IL è ** sempre ** compilato per le istruzioni del codice macchina, prima che venga eseguito. A differenza del bytecode Java, IL non viene mai interpretato. – IInspectable

4

Si prega di notare che tutte queste soluzioni sono DOM meno, in modo che nessun librerie come angular.js o jquery, solo underscore.js/lodash

In seguito alla risposta Falaina s', PyPynon ha un dist per JavaScript

Inoltre, Appcelerator Titanium ha un js>JavaBit >android

Infine, node.js può usare nexe spiegato in questo altro answer

8

motore V8 di Google compila JavaScript in codice macchina nativo. Questa funzione è utilizzata nel compilatore EncloseJS che ho scritto per i progetti node.js e io.js.

+0

Come posso farlo? –

+2

(* Meta *) Non è e non dovrebbe essere invadente, ma un semplice * mio * al posto giusto è sufficiente. Sono andato avanti e modifica la tua risposta qui. Si prega di tenere questo in mente per le risposte future. –

1

Il compilatore AOT di Adobe AIR per iOS compila staticamente un superset di JavaScript denominato Actionscript 3.0 fino al codice byte ABC, quindi il codice macchina tramite LLVM. Se dovessi scrivere il tuo codice AS3 senza classi e senza annotazioni di tipo, sarebbe essenzialmente JavaScript, e quindi il compilatore sarebbe felice di compilarlo fino al codice macchina. Purtroppo questo non è un software open source e non si ha accesso a nessun DOM (a cui molti pensano quando pensano di JavaScript) perché è in esecuzione essenzialmente in un'istanza di Flash Player.

Problemi correlati