2012-05-04 17 views
5

¿El código de bytes será el mismo si el mismo archivo java es compilado por diferentes compiladores de Java? No se realizan cambios en el archivo Java de origen.¿Compilar el mismo código usando diferentes JDKs dará como resultado el mismo código de bytes?

+1

¿El código de bytes ser el mismo - No. – Ved

+0

compilador Java producirá el código de bytes de Java no JVM – Maddy

+1

Los compiladores toman el código fuente de Java y lo convierten en código de máquina o lo convierten en código de bytes Java. Por lo general, lo convierten en código de bytes. Las JVM toman el código Java Byte como entrada. El código de Byte que le dice a JVM qué hacer. – Maddy

Respuesta

-1

Sí, pero: puede experimentar problemas si utiliza paquetes como com.sun etc., porque son propietarios.
Además, hace un tiempo tropecé con Object (In | Out) putStream trabajando de manera diferente en Sun JDK e IBM JDK, sin embargo, tal vez, hice algo mal allí, así que no estoy seguro de esto.
Prueba: http://docs.oracle.com/javase/specs/ - La especificación de máquina virtual de Java, Java SE 7 Edición
Actualización: Lo siento. De hecho, no es exactamente el mismo bytecode, pero todas las JVM certificadas lo entenderán y darán el mismo resultado.

+1

Usted habla sobre la portabilidad del código fuente, este no es el punto. – gd1

1

Nope. El código de bytes diferirá en qué compilador lo use, pero solo ligeramente y dentro de las especificaciones. Puede que esté equivocado, pero hasta donde yo sé, los cambios están relacionados principalmente con la optimización de javac en diferentes JDK. El código de bytes es de todos modos JVM interoperable.

+0

Bytecode no siempre es JVM interoperable. Considere el problema del número de versión del archivo classfile. Una JVM anterior no ejecutará bytecodes con un número de versión más nuevo. –

+0

¿No es eso en escenarios como un 1.5 JVM tratando de ejecutar el código 1.6 JDK? – Thihara

2

No, en absoluto.

PS .: probable que significa "JDK", no "JVM"

0

Es JVM específica, así como JVM reside en qué plataforma (sistema operativo). En cada caso, es algo diferente. No sé si compilar la misma fuente dos veces usando el mismo javac en el mismo jvm. ¿Alguien tiene idea?

5

¿El código de bytes será el mismo si el mismo archivo Java se compila en diferentes JVM? No se realizan cambios en el archivo Java de origen.

No está del todo claro qué quiere decir, pero la respuesta es muy probablemente "no".

  • Diferentes JDK tendrán diferentes compiladores de Java que pueden emitir diferentes códigos de bytes para el mismo código fuente. El compilador javac ha evolucionado con el tiempo.

  • Las diferentes versiones principales de Java a menudo emiten archivos de clase que se ajustan a las diferentes versiones de la especificación del archivo de clase.

  • Incluso si se limita a una instalación JDK, dos ejecuciones del compilador en el mismo archivo fuente producirán archivos .class no idénticos. (El archivo de clase incluye una marca de tiempo de compilación ...)

La única manera de que la respuesta podría ser "sí" sería si estuviera haciendo caso omiso de la marca de tiempo de compilación y (posiblemente) otros metadatos en la comparación, se Emitían códigos de bytes para la misma versión de destino, y las versiones de JDK estaban lo suficientemente cerca como para que la generación de códigos de bytes de los compiladores de Java no hubiera cambiado entre las versiones.

+0

Un ejemplo es que el javac de IBM y el javac de Sun/Oracle tienen diferentes formas de calcular el 'serialVersionUID' Esto puede conducir a problemas de serialización si el mismo código se compila con dos compiladores diferentes. –

0

No, con cada nuevo JDK. En general, el compilador de Java también se actualiza para realizar algunas optimizaciones durante la compilación. El código de bytes será diferente cuando se compile con diferentes versiones de Java.

2

El código de bytes es producido por el compilador de Java cuales no es parte de la implementación JVM específica.El código de bytes es el nombre del lenguaje intermedio ejecutado por el motor de ejecución de una JVM, por lo que la JVM no produce sino que ejecuta este código. Lo que la JVM puede hacer es compilar el código de bytes en el código máquina, que puede diferir. Este compilador se llama compilador Just-In-Time (JIT).

Lo que puede dar lugar a diferentes códigos de bytes, sin embargo, es diferente compiladores Java - los más importantes se enumeran allí: http://en.wikipedia.org/wiki/Java_compiler

Cuestiones relacionadas