Bytecode

El código de bytes, también denominado código portátil o código p, es una forma de conjunto de instrucciones diseñado para una ejecución eficiente por parte de un intérprete de software. A diferencia del código fuente legible por humanos, los códigos de bytes son códigos numéricos compactos, constantes y referencias (normalmente direcciones numéricas) que codifican el resultado del análisis sintáctico del compilador y la realización de análisis semántico de cosas como el tipo, el alcance y las profundidades de anidación de los objetos del programa. El nombre del código de bytes proviene de conjuntos de instrucciones que tienen códigos de operación de un byte seguidos de parámetros opcionales. Las representaciones intermedias, como el código de bytes, se pueden generar mediante implementaciones de lenguaje de programación para facilitar la interpretación, o se puede utilizar para reducir la dependencia del hardware y del sistema operativo al permitir que el mismo código se ejecute en varias plataformas, en diferentes dispositivos. El código de bytes a menudo se puede ejecutar directamente en una máquina virtual (una máquina de código p, es decir, un intérprete), o se puede compilar más en código de máquina para un mejor rendimiento. Dado que las instrucciones de código de bytes son procesadas por software, pueden ser arbitrariamente complejas, pero a menudo son similares a las instrucciones de hardware tradicionales: las máquinas de pila virtual son las más comunes, pero también se han construido máquinas de registro virtual. Las diferentes partes a menudo se pueden almacenar en archivos separados, similares a los módulos de objetos, pero cargados dinámicamente durante la ejecución.

Ejecución

Un programa de código de bytes se puede ejecutar analizando y ejecutando directamente las instrucciones, una a la vez. Este tipo de intérprete de código de bytes es muy portátil. Algunos sistemas, denominados traductores dinámicos o compiladores Just-In-Time (JIT), traducen el código de bytes a código de máquina según sea necesario en tiempo de ejecución. Esto hace que la máquina virtual sea específica del hardware, pero no pierde la portabilidad del código de bytes. Por ejemplo, el código de Java y Smalltalk se almacena normalmente en formato de código de bytes, que normalmente se compila con JIT para traducir el código de bytes a código de máquina antes de la ejecución. Esto introduce un retraso antes de que se ejecute un programa, cuando el código de bytes se compila en el código de máquina nativo, pero mejora considerablemente la velocidad de ejecución en comparación con la interpretación directa del código fuente, normalmente alrededor de un orden de magnitud (10x). muchas implementaciones de lenguaje ejecutan un programa en dos fases, primero compilando el código fuente en código de bytes y luego pasando el código de bytes a la máquina virtual. Hay máquinas virtuales basadas en códigos de bytes de este tipo para Java, Raku, Python, PHP, Tcl, mawk y Forth (sin embargo, Forth rara vez se compila mediante códigos de bytes de esta manera, y su máquina virtual es más genérica). En cambio, la implementación de Perl y Ruby 1.8 funciona recorriendo una representación de árbol de sintaxis abstracta derivada del código fuente. Más recientemente, los autores de V8 y Dart han desafiado la noción de que se necesita un código de bytes intermedio para una implementación de VM rápida y eficiente. Ambas implementaciones de lenguaje actualmente compilan JIT directamente desde el código fuente al código de máquina sin intermediarios de código de bytes.

Ejemplos

ActionScript se ejecuta en la máquina virtual ActionScript (AVM), que forma parte de Flash Player y AIR. El código ActionScript normalmente se transforma en formato de código de bytes mediante un compilador. Los ejemplos de compiladores incluyen uno integrado en Adobe Flash Professional y uno integrado en Adobe Flash Builder y disponible en Adobe Flex SDK. Objetos de Adobe Flash BANCStar, originalmente código de bytes para una herramienta de construcción de interfaces, pero también se usaba como lenguaje Filtro de paquetes Berkeley Biblioteca de ingeniería de código de bytes Compiladores de máquinas virtuales de C a Java La implementación CLISP de Common Lisp se usó para compilar solo en código de bytes durante muchos años; sin embargo, ahora también admite la compilación en código nativo con la ayuda de GNU Lightning Las implementaciones CMUCL y Scieneer Common Lisp de Common Lisp pueden compilarse en código nativo o en código de bytes, que es mucho más compacto Lenguaje intermedio común ejecutado por Common Language Runtime, utilizado por lenguajes de .NET Framework como C # Código de bytes Dalvik, diseñado para Android