2012-08-07 22 views
16

¿Cómo es posible que el código escrito en Java deba compilarse en un código byte interpretado por la JVM, pero no es necesario que el código esté escrito en un lenguaje como JavaScript? compilado y puede ejecutarse directamente en un navegador?¿Por qué es necesario compilar el código Java pero el código JavaScript no?

¿Hay alguna manera fácil de entender esto?

¿Cuál es la diferencia fundamental entre la forma en que se escriben estos dos idiomas, que pueden ayudar a comprender este comportamiento?

No soy un estudiante de CS, por lo que le pido disculpas por la ingenuidad de la pregunta.

+3

JavaScript es interpretado por el navegador, no por el hardware real de la computadora (como el conjunto C) para uno. – thatidiotguy

+2

@thatidiotguy wat. JavaScript rara vez se interpreta en estos días (la V8 de la fama de Chrome ni siquiera * tiene * un intérprete), "ensamblaje en C" no tiene ningún sentido, y el código de ensamblaje no se ejecuta en absoluto, es simplemente simple de convertir en codigo de maquina. Aunque tengo que darte apoyos para darte cuenta de que el código de la máquina también se interpreta al final del día. – delnan

+1

posible duplicado de [Compiled vs. Interpreted Languages] (http://stackoverflow.com/questions/3265357/compiled-vs-interpreted-languages) – jbabey

Respuesta

19

Históricamente, JavaScript era un lenguaje interpretado. Lo que significa que un intérprete acepta el código fuente y lo ejecuta todo en un solo paso. La ventaja aquí es la simplicidad y la flexibilidad, pero los intérpretes son muy lentos. Los compiladores convierten el lenguaje de alto nivel en un lenguaje de nivel inferior que el procesador nativo o una VM (en este caso, la VM de Java) pueden ejecutar directamente. Esto es mucho más rápido.

JavaScript en navegadores modernos ahora se compila sobre la marcha. Entonces, cuando se carga el script, lo primero que hace el motor de JavaScript es compilarlo en un bytecode y luego ejecutarlo. La razón por la cual todo el paso de compilación falta desde la perspectiva del usuario final se debe a que los desarrolladores de los navegadores (afortunadamente) han mantenido el requisito de que JavaScript no se compila explícitamente.

Java era del getgo, un lenguaje que siempre tenía un paso de compilación explícito. Pero en muchos casos eso ya no es verdad. Los IDE como IntelliJ o Eclipse pueden compilar Java sobre la marcha y en muchos casos eliminar el paso de compilación explícito.

3

JavaScript y Java no son lo mismo. Pueden compartir un nombre similar, pero lo remito al JS guru - Douglas Crockford para ayudar a aclarar el hecho de que en realidad no están relacionados.

La realidad es que no hay nada que Java es un lenguaje interpretado, y hay igualmente nada que impida JavaScript es un lenguaje compilado (motor JavaScript de Chrome sí hace la compilación para mejorar la velocidad, y hace un muy buen trabajo de ella).

En el contexto del navegador, Java se ejecuta de la misma manera que Flash o Silverlight: se requiere un complemento y el navegador actúa como un host para ese complemento; que aloja un entorno de tiempo de ejecución de Java.

Javascript fue diseñado para ser un lenguaje de scripting para el navegador, y es por eso que el navegador puede entenderlo de manera nativa. Cómo el navegador realmente logra la ejecución de ese código, sin embargo, depende exclusivamente del navegador. Es decir, puede operar puramente a nivel de script, suponiendo que no tiene conocimiento de la siguiente línea de código y ejecuta una pila puramente basada en software; o puede realizar algunos JIT para acercar el código al hardware y (con suerte) mejorar la velocidad.

2

Se puede compilar e interpretar cualquier idioma. En ambos casos, una pieza de software tiene que leer el código fuente, dividirlo, analizarlo, etc. para verificar ciertos requisitos y luego asignar un significado a cada parte del programa. La única diferencia es que el compilador procede a generar código con (casi) el mismo significado en otro idioma (código de bytes JVM o JavaScript, o código de máquina, o algo completamente distinto) mientras el intérprete lleva a cabo el significado del programa inmediatamente.

Ahora, en la práctica, es más simple y más complicado.Es más fácil en muchos idiomas prestarse mejor a uno de los dos: Java tiene un tipo estático y hay relativamente poca dinámica sobre el significado de un programa, por lo que puede compilarlo y así hacer algún trabajo que de otro modo tendría que hacerse en tiempo de ejecución JavaScript se escribe de forma dinámica y no se pueden decidir muchas cosas (por ejemplo, si + es una adición o una concatenación) hasta el tiempo de ejecución, por lo que la compilación no ofrece mucho rendimiento. Sin embargo, una mezcla de compilador e intérprete (compilar a una representación intermedia simplificada, luego interpretar y/o compilar eso) es cada vez más popular entre las implementaciones de lenguaje dinámico. Y luego está el hecho de que las implementaciones modernas de JavaScript compilan, y de hecho V8 nunca interpreta nada.

0

Debido a la complejidad del nivel de compilación entre Java y Javascript, hay algunas limitaciones en Javascript. Dado que bytecode se ejecuta en la plataforma JVM, que se escribe para sistemas operativos específicos, la ejecución de bytecode de hardware tiene más ventajas para acceder a los recursos del sistema. Incluso el código C puede ser incrustado en Bytecode de Java también. Por otro lado, como JavaScript solo se ejecuta en el navegador, tiene menos que ver con eso.

hay dos partes principales en la plataforma Java. Lenguaje de programación Java y JVM. Hace que cada parte enfoque solo su propia área. Es por eso que JVM no tiene problemas con la sintaxis de programación de Java. Es similar a cuando ejecutar el enlace de código C no trata con el código C, sino con el ensamblado.

Bytecode en plataforma JVM es probable un conjunto en C.

Eventualmente todas las representaciones se convierten en una representación binaria y luego las señales electirical de alguna manera. Demuestra que necesitamos niveles de programación.

+0

El código C no se puede incrustar en el código JVM. Bueno, probablemente sí, pero no se ejecutará. El CLR permite el código 'inseguro', pero eso es completamente diferente. Además, con respecto a JS y el mundo exterior, vea V8, node.js y common.js. – delnan

+0

Me refiero a usar JNI. Puede llamar a cualquier método en archivos de objetos (dll, etc.) –

+0

Bien, eso es cierto (aunque no llamaría a eso "incrustación en bytecode de java"). Pero también puede exponer el código nativo a través de cualquier motor de JavaScript. – delnan

Cuestiones relacionadas