2009-07-13 27 views
40

¿Hay un compilador de código de máquina nativo para JavaScript? No estoy hablando de una VM. Si no existe, ¿se puede hacer?
Me pregunto si se puede compilar en binario debido a la naturaleza dinámica del lenguaje.¿Hay un compilador nativo de código de máquina para JavaScript?

+0

¿Estaba hablando de JScript.NET? – Shimmy

+0

Pido una pequeña aclaración: por "compilador nativo de código de máquina", ¿te refieres a un compilador que toma un programa Javascript y produce un ejecutable (Compilación estática), o simplemente quieres decir que es posible traducir el código javascript a la máquina? código en absoluto (Por ejemplo, los compiladores JIT en Tracemonkey (Firefox) y V8 (Chrome) generarán código de máquina nativo a partir de la ejecución actual de javascript, por lo que no tiene que interpretarlos varias veces). – Falaina

+1

Estoy pidiendo compilación estática . –

Respuesta

26

Por lo que sé, no hay compiladores estáticos para JavaScript. Ciertamente es teóricamente posible; sin embargo, una compilación estática de JavaScript necesitaría un tiempo de ejecución muy pesado para admitir todas sus características (como el tipado dinámico y la evaluación). Como pequeño detalle, cuando se presentó la necesidad de compilar estáticamente Python (otro lenguaje dinámico), los desarrolladores de PyPy terminaron creando un lenguaje que era un subconjunto muy restringido de Python (llamado RPython), sin algunas de las características más dinámicas de Python, eso fue capaz de ser compilado estáticamente.

Si está pidiendo esto con el propósito de crear un ejecutable independiente a partir del código JavaScript, estoy seguro de que debe haber envoltorios que esencialmente crearían un ejecutable que contiene su script y una máquina virtual JavaScript incorporada (por desgracia, no saber cualquier cosa improvisada).

+1

El primer JIT basado en navegador fue lanzado con FF 3.5 aproximadamente un mes antes de que se respondiera esta pregunta. –

+0

+1 para PyPy. 'RPython' no está compilado estáticamente per se, sino que el programa' RPython' se inicia en 'CPython' normal, y se toma una instantánea de todos los objetos actualmente en la memoria. Eso asegura que todo tipo de especialización, etc. ya está hecho. Eso también significa que la entrada del programa RPython está severamente restringida, p. no es posible 'json.load' algo y obtener tipos sobre la marcha. –

2

Teóricamente es posible, pero habrá una gran cantidad de equipaje de soporte en tiempo de ejecución involucrado (e incluso un compilador o intérprete completo de Javascript para admitir eval).

¿Está buscando un compilador de código nativo real, o está buscando algo que pueda agrupar código JavaScript junto con un tiempo de ejecución en un solo binario ejecutable?

+3

Estoy buscando un compilador de código nativo real –

25

Es sin duda factible, aunque la única manera que sé cómo hacerlo en este momento es un proceso de dos pasos ...

  1. Compila el javascript para Java usando Mozilla Rhino JSC.
  2. Compila el archivo resultante de la clase Java en ejecutable usando algo como GNU's GCJ.

¿Por qué querrías, sin embargo? ¿Qué ventaja esperas encontrar?

+12

Es solo por curiosidad. Me gusta mucho javascript. –

1

TraceMonkey en FF3.5 hacen esto en algunas partes del código javascript. ¡Podrás obtener algunas indicaciones desde allí!

+0

No realmente. No he encontrado nada útil allí. –

+0

Esto no ayuda, ya que Tracemonkey no puede hacer esto a * todas * partes del código. – Bergi

2

Estoy seguro de que Microsoft tiene un JScript descargable ("javascript de Microsoft") compilador

si tiene ventanas: Si se escribe un archivo de texto javascript Se puede compilar por: abrir el símbolo del sistema usando cd para llegar al directorio de archivos de texto (si tiene ventanas) escriba: C: \ wINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ jsc.exe textfile.js

lo contrario: descargar un compilador de JScript escriba el directorio del compilador jscript y luego el nombre del javascript tex t archivo

puede agregar variables de entorno si no desea escribir todo el nombre del directorio en el compilador.

este tipo lo explica mejor: http://www.phpied.com/make-your-javascript-a-windows-exe/

personalmente creo que esto es realmente genial. Solo desearía que hubiese más documentación para eso.

Estoy bastante seguro de que es lo que estás buscando, pero soy un poco nuevo.

+2

Compilación de .net IL-code no se está compilando en un idioma nativo como cuestionado, IL-code también es interpretado (Justo a tiempo). Para que lo sepas;) – Remco

+0

@Remco: IL ** siempre ** compilado a las instrucciones del código de la máquina, antes de que se ejecute. A diferencia del bytecode de Java, IL nunca se interpreta. – IInspectable

4

Tenga en cuenta que todas estas soluciones son DOM menos, así que no hay bibliotecas como angular.js o jquery, solamente underscore.js/lodash

En seguimiento a la respuesta Falaina 's, PyPytiene una dist para JavaScript

Además, Appcelerator Titanium tiene js>JavaBit >android

Por último, node.js puede utilizar nexe se explica en este otro answer

8

motor V8 de Google compila JavaScript en código máquina nativo. Esta característica se utiliza en el compilador EncloseJS que escribí para los proyectos node.js y io.js.

+0

¿Cómo puedo hacerlo? –

+2

(* Meta *) No es ni debe ser molesto, pero un simple * my * en el lugar correcto es suficiente. Seguí adelante y edité tu respuesta aquí. Por favor, tenga esto en cuenta para futuras respuestas. –

1

El compilador AOT de Adobe AIR para iOS compila estáticamente un superconjunto de JavaScript llamado Actionscript 3.0 hasta el bytecode ABC, luego el código de máquina a través de LLVM. Si tuviera que escribir su código AS3 sin clases y sin anotación de tipo, sería esencialmente JavaScript, y luego el compilador lo compilaría felizmente en código máquina. Lamentablemente, este no es un software de código abierto, y no tiene acceso a ningún DOM (que muchas personas piensan cuando piensan en JavaScript) porque se ejecuta esencialmente dentro de una instancia de Flash Player.

Cuestiones relacionadas