tabla quién que maquina interprete extension estructura eficiente cursos codigo java .net bytecode

java - quién - tabla de codigo bytecode



¿Cuáles son las ventajas de bytecode sobre el código nativo? (8)

Parece que todo lo que puedes hacer con bytecode lo puedes hacer igual de fácil y mucho más rápido en código nativo. En teoría, incluso podría conservar la independencia de la plataforma y el lenguaje al distribuir programas y bibliotecas en bytecode y luego compilar en código nativo durante la instalación, en lugar de JITing it.

Entonces, en general, ¿cuándo quieres ejecutar bytecode en lugar de native?



Bytecode crea un nivel extra de indirección.

Las ventajas de este nivel extra de indirección son:

  • Independencia de la plataforma
  • Puede crear cualquier cantidad de lenguajes de programación (sintaxis) y hacer que se compilen en el mismo bytecode.
  • Podría crear fácilmente convertidores de idiomas cruzados
  • x86, x64 e IA64 ya no necesitan ser compilados como binarios separados. Solo se debe instalar la máquina virtual adecuada.
  • Cada sistema operativo simplemente necesita crear una máquina virtual y tendrá soporte para el mismo programa.
  • La compilación justo a tiempo le permite actualizar un programa simplemente reemplazando un único archivo fuente parchado. (Muy beneficioso para páginas web)

Algunas de las desventajas:

  • Actuación
  • Más fácil de descompilar

Creo que acabas de responder a tu propia pregunta: independencia de la plataforma. El bytecode independiente de la plataforma se produce y distribuye a su plataforma objetivo. Cuando se ejecuta, se compila rápidamente en el código nativo antes de que comience la ejecución o simultáneamente ( Just In Time ). La Java JVM y, presumiblemente, los tiempos de ejecución de .NET operan según este principio.


El rendimiento de prácticamente cualquier programa mejorará si se compila, se ejecuta con perfiles y los resultados se vuelven a introducir en el compilador para una segunda pasada. Las rutas de código que realmente se utilizan se optimizarán de forma más agresiva, los bucles se desenrollarán exactamente al grado correcto y las rutas de instrucciones activas se organizarán para maximizar los hits de $ 1.

Todo es bueno, pero casi nunca se hace porque es molesto pasar por tantos pasos para construir un binario.

Esta es la ventaja de ejecutar bytecode por un tiempo antes de compilarlo en código nativo: la información de perfil está automáticamente disponible. El resultado después de la compilación Just-In-Time es un código nativo altamente optimizado para los datos específicos que el programa está procesando.

Ser capaz de ejecutar el bytecode también permite una optimización nativa más agresiva que la que un compilador estático puede usar con seguridad. Por ejemplo, si se observa que uno de los argumentos de una función siempre es NULL, todo el manejo de ese argumento se puede omitir simplemente del código nativo. Habrá una breve verificación de validez de los argumentos en el prólogo de la función, si ese argumento no es NULL, la VM cancela de nuevo el bytecode y comienza a perfilar de nuevo.


Hank Shiffman de SGI dijo (hace mucho tiempo, pero es hasta cierto):

Hay tres ventajas de que Java use el código de bytes en lugar de ir al código nativo del sistema:

  1. Portabilidad : cada tipo de computadora tiene su conjunto de instrucciones único. Si bien algunos procesadores incluyen las instrucciones para sus predecesores, generalmente es cierto que un programa que se ejecuta en un tipo de computadora no se ejecutará en ningún otro. Agregue los servicios proporcionados por el sistema operativo, que cada sistema describe de manera única y tiene un problema de compatibilidad. En general, no puede escribir y compilar un programa para un tipo de sistema y ejecutarlo en cualquier otro sin mucho trabajo. Java supera esta limitación insertando su máquina virtual entre la aplicación y el entorno real (computadora + sistema operativo). Si una aplicación se compila en código de bytes Java y ese código de bytes se interpreta de la misma manera en todos los entornos, entonces puede escribir un único programa que funcionará en todas las plataformas diferentes donde se admite Java. (Esa es la teoría, de todos modos. En la práctica, siempre hay pequeñas incompatibilidades al acecho del programador).

  2. Seguridad : una de las virtudes de Java es su integración en la Web. Cargue una página web que use Java en su navegador y el código Java se descargue y ejecute automáticamente. Pero, ¿qué sucede si el código destruye los archivos, ya sea por malicia o por descuido por parte del programador? Java evita que los applets descargados hagan algo destructivo al no permitir operaciones potencialmente peligrosas. Antes de permitir que el código se ejecute, lo examina para intentar eludir la seguridad. Comprueba que los datos se utilizan de manera coherente: el código que manipula un elemento de datos como un entero en una etapa y luego intenta usarlo como un puntero más tarde será capturado y se le impedirá su ejecución. (El lenguaje Java no permite la aritmética del puntero, por lo que no puede escribir el código Java para hacer lo que acabamos de describir. Sin embargo, no hay nada que impida que alguien escriba códigos de bytes destructivos usando un editor hexadecimal o incluso construyendo un byte Java ensamblador de código.) Por lo general, no es posible analizar el código de máquina de un programa antes de la ejecución y determinar si hace algo malo. Trucos como escribir código de auto modificación significan que las operaciones malvadas pueden no existir hasta más tarde. Pero el código de bytes Java fue diseñado para este tipo de validación: no tiene las instrucciones que un programador malicioso usaría para ocultar su asalto.

  3. Tamaño : en el mundo de los microprocesadores, RISC generalmente es preferible a CISC. Es mejor tener un pequeño conjunto de instrucciones y usar muchas instrucciones rápidas para hacer un trabajo que tener muchas operaciones complejas implementadas como instrucciones únicas. Los diseños de RISC requieren menos puertas en el chip para implementar sus instrucciones, lo que permite más espacio para las tuberías y otras técnicas para hacer que cada instrucción sea más rápida. En un intérprete, sin embargo, nada de esto importa. Si desea implementar una sola instrucción para la instrucción switch con una longitud variable según el número de cláusulas de caso, no hay ninguna razón para no hacerlo. De hecho, un conjunto de instrucciones complejo es una ventaja para un lenguaje basado en web: significa que el mismo programa será más pequeño (menos instrucciones de mayor complejidad), lo que significa menos tiempo para transferir a través de nuestra red de velocidad limitada.

Por lo tanto, al considerar el código de bytes frente a los nativos, considere qué ventajas y desventajas desea establecer entre la portabilidad, la seguridad, el tamaño y la velocidad de ejecución. Si la velocidad es el único factor importante, vuélvete nativo. Si alguno de los otros es más importante, vaya con bytecode.

También agregaré que mantener una serie de compilaciones del código base del SO y de la arquitectura para cada lanzamiento puede volverse muy tedioso. Es una gran ventaja usar el mismo código de bytes Java en múltiples plataformas y hacer que "solo funcione".


Idealmente, tendrías un bytecode portátil que compila Just In Time con código nativo. Creo que los intérpretes de código de bytes existen sin JIT debido principalmente al hecho práctico de que la compilación de código nativo agrega complejidad a una máquina virtual. Lleva tiempo crear, depurar y mantener ese componente adicional. No todos tienen el tiempo o los recursos para hacer ese compromiso.

Un factor secundario es la seguridad. Es mucho más fácil verificar que un intérprete no se bloquee que garantizar el mismo para el código nativo.

El tercero es el rendimiento. A menudo puede llevar más tiempo generar código de máquina que interpretar bytecode para pequeños fragmentos de código que solo se ejecutan una vez.


Todas las buenas respuestas, pero mi botón caliente ha sido golpeado - rendimiento.

Si el código que se está ejecutando invierte todo el tiempo llamando a las rutinas de biblioteca / sistema - operaciones de archivo, operaciones de base de datos, envío de mensajes de Windows, entonces no importa mucho si está JITted, porque la mayor parte del tiempo se usa para aquellos operaciones de nivel para completar.

Sin embargo, si el código contiene cosas que generalmente llamamos "algoritmos", que deben ser rápidas y no pasan mucho tiempo llamando funciones, y si se utilizan con la suficiente frecuencia como para ser un problema de rendimiento, entonces JIT es muy importante.


La portabilidad y la independencia de la plataforma son probablemente las ventajas más notables de bytecode sobre el código nativo.