jre - oracle java
¿Es JDK "hacia arriba" o "hacia atrás" compatible? (8)
Debe ser compatible con versiones anteriores.
Compatibilidad binaria hacia atrás (o compatibilidad hacia abajo ): la capacidad de los clientes creados con una versión anterior de la API de la biblioteca para ejecutarse en una nueva ( wiki ).
Compatibilidad binaria ascendente (o compatibilidad directa ): capacidad de los clientes creados con una nueva versión de la API de la biblioteca para ejecutarse en la versión anterior ( wiki ).
El documento general de Sun sobre las incompatibilidades de JDK en J2SE 5.0 desde 1.4.2 (y la compatibilidad de Java SE 6 también con J2SE 5.0 ) describe la compatibilidad de JDK de la siguiente manera:
JDK 5.0 es compatible con Binary hacia arriba con Java 2 SDK, v1.4.2 excepto por las incompatibilidades enumeradas a continuación. Esto significa que, a excepción de las incompatibilidades señaladas, los archivos de clase creados con los compiladores de la versión 1.4.2 se ejecutarán correctamente en JDK 5.0 .
Supongo que los escritores de documentación han mezclado los términos "hacia arriba" y "hacia atrás" en esta oración. Describen una compatibilidad "hacia atrás", pero llaman a esta característica como compatibilidad "hacia arriba".
¿Es esto un error tipográfico, un error o un término previsto aquí? ¿Es JDK "hacia arriba" o "hacia atrás" compatible?
Extendiendo respuestas para incluir el Java más reciente ...
Compatibilidad con Java SE 7 y JDK 7
Citas de la página sin fecha de Oracle:
La compatibilidad es un problema complejo. Este documento analiza tres tipos de incompatibilidades potenciales relacionadas con un lanzamiento de la plataforma Java:
- Fuente : La compatibilidad de la fuente se refiere a la traducción del código fuente de Java en archivos de clase, incluido si el código aún se compila o no.
- Binario : la compatibilidad binaria se define en Especificación del lenguaje Java como la preservación de la capacidad de enlace sin error.
- Comportamiento : la compatibilidad de comportamiento incluye la semántica del código que se ejecuta en tiempo de ejecución.
... y
Las incompatibilidades entre Java SE 7 y Java SE 6 Java SE 7 son muy compatibles con las versiones anteriores de la plataforma Java. Casi todos los programas existentes deberían ejecutarse en Java SE 7 sin modificaciones. Sin embargo, existen algunas incompatibilidades fuente y binarias potenciales menores en JRE y JDK que implican circunstancias poco comunes y "casos de esquina" que se documentan aquí para completar.
Incompatibilidades de Java SE 7 en el lenguaje, la JVM o la API Java SE
... y
Incompatibilidades entre JDK 7 y JDK 6
JDK 7 Incompatibilidades en javac, en HotSpot o API Java SE
(No hay preámbulo allí, solo una lista de incompatibilidades).
JDK es compatible con versiones anteriores según la definición de wiki.
JDK es compatible con versiones anteriores, es decir, el código de bytes que cumple con la especificación 1.4.2 se ejecutará en Java 5 JVM
Java (VM) es compatible con versiones anteriores. El código creado por Java 1.4.2 se ejecutará en 1.5 y 6 máquinas virtuales. El compilador JDK no es compatible con versiones anteriores. Entonces el código no puede ser compilado por Java 1.5 para ejecutar en 1.4.2, por ejemplo.
Solo hacia atrás Forward compat ("aceptar con gracia la entrada destinada a versiones posteriores de sí mismo") requeriría que la 1.5 JVM pueda ejecutar el código compilado 1.6, que no puede.
El retroceso requiere "si puede funcionar con la entrada generada por un dispositivo anterior", lo que es cierto ya que una JVM 1.6 puede ejecutar el código compilado de 1.5.
Cada versión del JDK / JRE coincide con una versión del bytecode de Java. Cada compilador produce código de una versión específica de bytecode. Cada JVM comprende una versión y todas las versiones anteriores de una versión específica de bytecode.
Cuando la JVM carga una clase, comprueba la versión de bytecode y si es> que la última versión comprendida de la JVM obtendrá un error. (ClassVersionError o algo así).
Tenga en cuenta que para que algo sea compatible con versiones anteriores debe haber una contraparte que sea compatible con versiones anteriores (ya sea intencionalmente o no). Por ejemplo: ¿los lectores de DVD son compatibles con versiones anteriores de CD o son compatibles con lectores de DVD?
En este caso, depende si observa el compilador (o el bytecode que genera) o la máquina virtual.
El compilador no es compatible con versiones anteriores porque bytecode generado con Java5 JDK no se ejecutará en Java 1.4 jvm (a menos que se compile con el indicador -target 1.4
). Pero la JVM es compatible con versiones anteriores, ya que puede ejecutar bytecodes más antiguos.
Así que supongo que eligieron considerar la compatibilidad desde el punto de vista de javac (ya que es la parte específica del JDK), lo que significa que el bytecode generado se puede ejecutar en futuras versiones del jvm (que está más relacionado con el JRE). , pero también incluido en el JDK).
En resumen, podemos decir:
- Los JDK son (generalmente) compatibles con versiones anteriores.
- Los JRE son (por lo general) compatibles con versiones anteriores.
(Y también sirve como una lección que debería aprenderse hace mucho tiempo: las personas que escriben los compiladores generalmente tienen razón, y nosotros, las personas que los usan, corremos xD)
Por cierto, ¿no tiene más sentido emparejar hacia atrás / adelante y hacia abajo / hacia arriba en lugar de mezclarlos?
jdk es compatible con versiones anteriores: la nueva versión puede ejecutarse en una versión anterior