2010-02-04 18 views
13

Oí muchas veces que Java implementa la compilación JIT (just-in-time) y sus códigos de bytes que son portátiles en las plataformas son "interpretados" por JVM. Sin embargo, realmente no sé qué son los códigos de bytes, y qué significa realmente la JVM en la arquitectura de lenguaje Java; Me gustaría saber más sobre ellos.¿Qué son los bytecodes y cómo los maneja JVM?

+3

Espero que http://en.wikipedia.org/wiki/Bytecode ayude. – Jichao

Respuesta

36

La JVM (Java Virtual Machine) tiene un conjunto de instrucciones igual que una máquina real. El nombre dado a este conjunto de instrucciones es Java Bytecode. Se describe en el Java Virtual Machine Specification. Otros idiomas se traducen en un bytecode antes de la ejecución, por ejemplo ruby ​​y python. El bytecode de Java está en un nivel bastante bajo mientras que el de python es mucho más alto.

La interpretación y la compilación JIT son dos estrategias diferentes para ejecutar bytecode. Los procesos de interpretación codifican byte uno a la vez realizando los cambios en el estado de la máquina virtual que están codificados en cada instrucción. La compilación JIT traduce el bytecode en instrucciones nativas de la plataforma de host que llevan a cabo operaciones equivalentes.

La interpretación generalmente es rápida pero lenta durante la ejecución, mientras que JIT tiene más sobrecarga de inicio, pero se ejecuta más rápido después. Las JVM modernas usan una combinación de técnicas de interpretación y JIT para obtener el beneficio de ambas. El bytecode primero se interpreta mientras el JIT lo está traduciendo en el fondo. Una vez que se completa la compilación de JIT, la JVM cambia a usar ese código en lugar del intérprete. A veces, la compilación JIT puede producir mejores resultados que la compilación anticipada utilizada para C y C++ porque es más dinámica.La JVM puede realizar un seguimiento de la frecuencia con la que se llama el código y cuáles son las rutas típicas a través del código y utilizar esta información para generar un código más eficiente mientras se ejecuta el programa. La JVM puede cambiar a este nuevo código al igual que cuando inicialmente cambia del intérprete al código JIT.

Al igual que hay otros lenguajes que se compilan con código nativo, como C, C++, Fortran; hay compiladores para otros idiomas que emiten bytecode JVM. Un ejemplo es el lenguaje scala. Creo que groovy y jruby también se pueden convertir en bytecode java.

+1

+1 muy bien explicado – stacker

+1

_El bytecode se interpreta por primera vez mientras el JIT lo está traduciendo en segundo plano_. ¿Es este un concepto de múltiples hilos o un proceso secuencial? – jmishra

+2

@ ladiesMan217 eso es, por supuesto, hasta la implementación particular; pero espero que las JVM modernas ejecuten el compilador JIT en una secuencia paralela –

13

Bytecode es un paso entre su código fuente y el código de máquina real. La JVM es lo que toma el bytecode y lo traduce en código máquina.

JIT se refiere al hecho de que la JVM hace esto traducción sobre la marcha cuando se ejecuta el programa, en lugar de en un solo paso (lenguaje como en un tradicionalmente compilado/ligado como C o C++)

El punto de bytecode es que obtienes un mejor rendimiento que un lenguaje estrictamente interpretado (como PHP, por ejemplo) porque el bytecode ya está parcialmente compilado y optimizado. Además, dado que el bytecode no necesita ser interpretado directamente por la CPU, no necesita estar vinculado a ninguna arquitectura de CPU específica que lo haga más portátil.

La desventaja, por supuesto, es que generalmente será un poco más lenta que una aplicación nativamente compilada, ya que la JVM todavía tiene que trabajar un poco para traducir el código de bytes a código de máquina.

+0

"La JVM es lo que toma el bytecode y lo traduce en código de máquina". No siempre, ¿no? –

0

Cuando compila algo en Java, el compilador genera bytecode. Este es un código nativo para la Máquina Virtual de Java. La JVM luego traduce el bytecode a código nativo para su procesador/arquitectura, aquí es donde ocurre el JIT. Sin JIT, la JVM traduciría el programa una instrucción a la vez, que es muy lenta.

0

jcyang ya proporciona un enlace a la Wikipedia, pero éste es un partido mejor a su pregunta:

Java Bytecode

El compilador Java compila el código fuente Java para archivos de clase. Los métodos de la clase se traducen en Byte Code y la máquina virtual Java (JVM) interpreta este código de bytes. Se puede usar un compilador Just In Time (JIT) para traducir el código de bytes a código de máquina para acelerar la ejecución de los métodos de clase.

0

Bytecode es el equivalente JVM de las instrucciones del lenguaje de la máquina.

0

JVM es una máquina virtual que se utiliza para ejecutar código Java. Podemos comparar JVM con un compilador, ya que sin él no podemos compilar código Java y hacer aplicaciones. JVM no es más que una pieza de código que testificará su código Java. La tarea principal de JVM es convertir el código de Java en bytecode de Java y compilarlo. Esto hace que el desarrollo de Java sea fácil. Consulte this article si quiere saber más sobre cómo funciona la máquina virtual Java.

0

Oracle jdk

código de programación que, una vez compilado, se ejecuta a través de una máquina virtual en lugar del procesador de computadoras. Al utilizar este enfoque, el código fuente se puede ejecutar en cualquier plataforma una vez que se haya compilado y ejecutado a través de la máquina virtual.

Bytecode es el formato compilado para los programas de Java. Una vez que un programa Java se ha convertido a bytecode, puede transferirse a través de una red y ejecutarse mediante Java Virtual Machine (JVM). Los archivos de bytecode generalmente tienen una extensión .class.