2009-08-25 64 views
103

En el pasado he usado C++ como lenguaje de programación. Sé que el código escrito en C++ pasa por un proceso de compilación hasta que se convierte en código objeto "código máquina".¿Java es un lenguaje de programación compilado o interpretado?

Me gustaría saber cómo funciona Java en ese sentido. ¿Cómo se escribe el código Java escrito por el usuario?

+12

C++ podría interpretarse. Hay algunos intérpretes de C por ahí. –

Respuesta

38

Java se compila en bytecode, que luego va a Java VM, que lo interpreta.

+0

respuesta simple y buena –

+24

... pero no estrictamente precisa. –

+1

JVM puede optar por no "interpretar" bytecode. Puede JIT compilarlo y ejecutarlo directamente. –

10

Java es un lenguaje de programación compilado, pero en lugar de compilarse directamente en código máquina ejecutable, se compila en una forma binaria intermedia denominada código de bytes JVM. El código de bytes luego se compila y/o interpreta para ejecutar el programa.

0

Java es un lenguaje compilado en bytes que se dirige a una plataforma llamada Java Virtual Machine que se basa en la pila y tiene algunas implementaciones muy rápidas en muchas plataformas.

+0

¿Qué significa "compilado en bytes"? – Jesper

+2

@Jesper: "Byte-compiled" generalmente significa "compilado a bytecode". "Bytecode" es un término general que cubre cualquier tipo de código intermedio no textual (generalmente no ejecutable en máquina). –

12

Tipo de ambos. En primer lugar compila Java (algunos preferirían decir "traducido") a bytecode, que luego compila o interpreta según el estado de ánimo de JIT.

+22

Es una pieza avanzada de software, que ha desarrollado estados de ánimo :) – Thorarin

+4

El JIT es de hecho un software muy sofisticado, que puede hacer optimizaciones basadas en información de tiempo de ejecución (como un generador de perfiles), que un compilador anticipado puede ' t do (porque no tiene información sobre el comportamiento del tiempo de ejecución de un programa con anticipación). Pero probablemente no tiene estados de ánimo ... :-) – Jesper

141

Las implementaciones Java generalmente utilizan un proceso de compilación de dos pasos. El código fuente de Java se compila en bytecode por el compilador de Java. El bytecode es ejecutado por una Máquina Virtual Java (JVM). Las JVM modernas utilizan una técnica llamada Just-in-Time (JIT) compilation para compilar el código de bytes a las instrucciones nativas entendidas por la CPU del hardware sobre la marcha en tiempo de ejecución.

Algunas implementaciones de JVM pueden optar por interpretar el bytecode en lugar de JIT compilarlo en código máquina, y ejecutarlo directamente. Aunque esto todavía se considera un "intérprete", es bastante diferente de los intérpretes que leen y ejecutan el código fuente de alto nivel (es decir, en este caso, el código fuente de Java no se interpreta directamente, el bytecode, el resultado del compilador Java).

Es técnicamente posible compilar Java en código nativo antes de tiempo y ejecutar el binario resultante. También es posible interpretar el código de Java directamente.

En resumen, dependiendo del entorno de ejecución, el código de bytes puede ser:

  • compilado antes de tiempo y ejecutarse como código nativo (similar a la mayoría de los compiladores de C++)
  • compilado justo a tiempo y ejecutados
  • interpretarse
  • directamente ejecutado por un procesador compatible (bytecode es el conjunto de instrucciones nativas de algunas CPUs)
+12

En realidad, algunas JVM de HotSpot comienzan interpretando códigos de bytes, y solo los compila en código nativo después de descubrir qué es lo que vale la pena compilar, y recopilaron algunas estadísticas sobre cómo el código se está ejecutando; p.ej. para descubrir la ruta más común tomada en cada rama condicional. –

+0

De ahí el término 'Hotspot' :) Lo hace a lo que se ejecuta a menudo, para obtener una optimización. –

+4

Puede apagar el intérprete en HotSpot con -Xcomp. Vale la pena probar una aplicación para ver qué mala idea es. –

43

Los términos "lenguaje interpretado" o "lenguaje compilado" no tienen sentido, porque cualquier lenguaje de programación puede ser interpretado y/o compilado.

En cuanto a las implementaciones existentes de Java, la mayoría implica un paso de compilación a bytecode, por lo que implican la compilación. El tiempo de ejecución también puede cargar bytecode dinámicamente, por lo que siempre se necesita alguna forma de intérprete de bytecode. Ese intérprete puede o no, a su vez, usar internamente la compilación del código nativo.

Actualmente, la compilación parcial just-in-time se utiliza para muchos idiomas que antes se consideraban "interpretados", por ejemplo, Javascript.

+0

Gracias por la * única * respuesta correcta y correcta en toda la página. Estaba comenzando a cuestionar seriamente la inteligencia de la comunidad SO. Solo algunas adiciones rápidas: no todas las implementaciones de Java se compilan en bytecode de JVM. GNU GCJ puede compilar directamente a código nativo. Además, no todas las JVM interpretan bytecode. Sunine Maxine Research VM no contiene un intérprete, en cambio contiene dos compiladores: uno muy rápido que genera código lento que se usa cuando otras JVM usarían su intérprete, y uno lento que genera código rápido que se usa para optimizaciones de punto de acceso . –

+2

Además, el motor de ejecución de JavaScript V8 de Google no solo realiza una compilación parcial justo a tiempo. * Siempre * compila con código nativo, de hecho, V8 ni siquiera * tiene * un intérprete. Tiene * solo * el compilador (similar a Maxine, pero a diferencia de Maxine V8 tiene solo un compilador). Estos tres ejemplos (GCJ, Maxine y V8) prueban su punto aún más: no existe un lenguaje interpretado o compilado. Un idioma no es interpretado o compilado. Un idioma solo * es * (Esa es en realidad una cita de Shriram Krishnamurthi). –

+2

¿Por qué estás hablando de javascript en una pregunta de java? –

-1

Cita de: https://blogs.oracle.com/ask-arun/entry/run_your_java_applications_faster

desarrolladores de aplicaciones pueden desarrollar el código de la aplicación en cualquiera de los diferentes sistemas operativos que están disponibles en el mercado hoy en día. El lenguaje Java es agnóstico en esta etapa para el sistema operativo. El brillante código fuente escrito por el desarrollador de la aplicación Java ahora se compila en el código Java Byte, que en la terminología de Java se conoce como compilación del lado del cliente. Esta compilación al código de Java Byte es lo que permite a los desarrolladores de Java 'escribir una vez'. El código de Java Byte se puede ejecutar en cualquier sistema operativo y servidor compatible, lo que hace que el código fuente sea independiente de OS/Server. Después de la creación del código de Java Byte, la interacción entre la aplicación Java y el sistema operativo subyacente es más íntima. El viaje continúa: el marco de aplicaciones empresariales ejecuta estos códigos de Java Byte en un entorno de tiempo de ejecución que se conoce como Máquina virtual Java (JVM) o Entorno de ejecución de Java (JRE). La JVM tiene vínculos cercanos con el sistema operativo y el hardware subyacentes porque aprovecha los recursos ofrecidos por el sistema operativo y el servidor. El código de Java Byte ahora se compila en un código ejecutable de lenguaje de máquina que es específico de la plataforma. Esto se conoce como compilación del lado del servidor.

Así que yo diría que Java es definitivamente un lenguaje compilado.

31

[1] continuación imagen lo explica todo ...

enter image description here

El código escrito en Java es:

  • primer compilado a bytecode por un programa llamado javac como se muestra en la sección izquierda de la imagen ab ove;
  • Entonces, como se muestra en la sección derecha de la imagen de arriba, [2] otro programa llamado java inicia el entorno de ejecución de Java y puede de compilación y/o interpretar el código de bytes mediante el uso de Java Intérprete/compilador JIT.

¿Cuándo se interpretan el código de bytes de Java y cuando lo hace su compilación?[3] El código de la aplicación se interpreta inicialmente, pero la JVM supervisa qué secuencias de bytecode se ejecutan con frecuencia y las traduce en código de máquina para su ejecución directa en el hardware. Para bytecode que se ejecuta solo unas pocas veces, esto ahorra tiempo de compilación y reduce la latencia inicial; para bytecode ejecutado con frecuencia, la compilación JIT se utiliza para ejecutar a alta velocidad, después de una fase inicial de interpretación lenta. Además, dado que un programa pasa la mayor parte del tiempo ejecutando una minoría de su código, el tiempo de compilación reducido es significativo. Finalmente, durante la interpretación inicial del código, las estadísticas de ejecución se pueden recopilar antes de la compilación, lo que ayuda a realizar una mejor optimización.


Haga clic en los números en superíndice en la respuesta para las referencias.

+0

¿Es debido al bytecode en caché que Java usa mucha memoria? –

+2

@sedulam: Una "gran cantidad de memoria" es una afirmación confusa. La administración de memoria de Java es bastante sencilla: las tres generaciones son lo que la JVM usa para la creación y el mantenimiento de sus objetos. Esta [otra respuesta SO] (https://stackoverflow.com/q/3496442) puede ser útil para usted. – displayName

+0

Con la explicación anterior, teóricamente, el código compilado en C++ siempre será más rápido que el código java lógicamente similar, ya que siempre habrá alguna porción del archivo .class que JIT decida no transformar en código máquina. En otras palabras, java nunca puede atrapar la velocidad de ejecución de metal desnudo que C++ ha demostrado. ¿Es esta suposición correcta? – DevdattaK

Cuestiones relacionadas