Bytecode
Bytecode (también llamado código intermedio, código portátil o p-code) 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 bytecodes son códigos numéricos compactos, constantes y referencias (normalmente direcciones numéricas) que codifican el resultado del análisis del compilador y la realización de análisis semánticos de elementos como el tipo, el alcance y la profundidad de anidamiento de los objetos del programa.
El nombre bytecode 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, pueden generarse mediante implementaciones de lenguaje de programación para facilitar la interpretación, o pueden usarse para reducir la dependencia del hardware y del sistema operativo al permitir que el mismo código se ejecute entre 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 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. A menudo, las diferentes partes se pueden almacenar en archivos separados, de forma similar a los módulos de objetos, pero se cargan 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, llamados traductores dinámicos o justo a tiempo(JIT), traducen bytecode en código de máquina según sea necesario en tiempo de ejecución. Esto hace que el hardware de la máquina virtual sea específico, pero no pierde la portabilidad del código de bytes. Por ejemplo, el código Java y Smalltalk normalmente se almacena en formato de código de bytes, que normalmente se compila 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 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 en un orden de magnitud (10x).
Debido a su ventaja de rendimiento, hoy en día 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ódigo de bytes de este tipo para Java, Raku, Python, PHP, Tcl, mawk y Forth (sin embargo, Forth rara vez se compila a través de 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 realizan compilación JIT directa desde el código fuente al código de máquina sin intermediario de bytecode.
Ejemplos
- ActionScript se ejecuta en la máquina virtual de ActionScript (AVM), que forma parte de Flash Player y AIR. Un compilador suele transformar el código ActionScript en formato de código de bytes. Los ejemplos de compiladores incluyen uno integrado en Adobe Flash Professional y otro 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 creación de interfaz, pero también se usa como lenguaje
- Filtro de paquetes de Berkeley
- Berkeley Pascual
- 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 solía 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 de CMUCL y Scieneer Common Lisp de Common Lisp pueden compilarse en código nativo o en bytecode, que es mucho más compacto
- Common Intermediate Language ejecutado por Common Language Runtime, utilizado por lenguajes.NET como C#
- El bytecode de Dalvik, diseñado para la plataforma Android, es ejecutado por la máquina virtual Dalvik
- Dis bytecode, diseñado para Inferno (sistema operativo), es ejecutado por la máquina virtual Dis
- EiffelStudio para el lenguaje de programación Eiffel
- EM, la máquina virtual Amsterdam Compiler Kit utilizada como lenguaje de compilación intermedio y como lenguaje de código de bytes moderno
- Emacs es un editor de texto con la mayoría de sus funciones implementadas por Emacs Lisp, su dialecto integrado de Lisp. Estas características se compilan en bytecode. Esta arquitectura permite a los usuarios personalizar el editor con un lenguaje de alto nivel, que después de compilar en bytecode ofrece un rendimiento razonable.
- La implementación incrustable de Common Lisp de Common Lisp puede compilarse en código de bytes o código C
- Common Lisp proporciona una
disassemble
función que imprime en la salida estándar el código subyacente de una función específica. El resultado depende de la implementación y puede o no resolverse en bytecode. Su inspección se puede utilizar con fines de depuración y optimización. Steel Bank Common Lisp, por ejemplo, produce:
(desensamblar ' (lambda (x) (imprimir x))) ; desmontaje para (LAMBDA (X)) ; 2436F6DF: 850500000F22 PRUEBA EAX, [#x220F0000]; punto de entrada sin análisis de argumentos ; E5: 8BD6 MOVEDX, ESI ; E7: 8B05A8F63624 MOV EAX, [#x2436F6A8]; #<objeto FDEFINITION para IMPRIMIR> ; ED: B904000000 MOV ECX, 4 ; F2: FF7504 EMPUJAR DWORD PTR [EBP+4] ; F5: FF6005 JMP DWORD PTR [EAX+5] ; F8: CC0A PAUSA 10; trampa de errores ; FA: 02 BYTE #X02 ; FB: 18 BYTE #X18; INVALID-ARG-COUNT-ERROR ; FC: 4F BYTE #X4F; ECX
- La implementación de Ericsson de Erlang utiliza códigos de bytes BEAM
- La máquina virtual de Ethereum (EVM) es el entorno de tiempo de ejecución, que utiliza su propio código de bytes, para la ejecución de transacciones en Ethereum (contratos inteligentes).
- Lenguajes de programación Icon y Unicon
- Infocom usó la máquina Z para hacer que sus aplicaciones de software sean más portátiles
- Código de bytes de Java, que es ejecutado por la máquina virtual de Java
- MAPE
- BCEL
- Asistente de Java
- Código de bytes de Keiko utilizado por el lenguaje de programación Oberon-2 para hacerlo más portátil y el sistema operativo Oberon.
- KEYB, el controlador de teclado MS-DOS/PC DOS con su archivo de recursos KEYBOARD.SYS que contiene información de diseño y secuencias cortas de código p ejecutadas por un intérprete dentro del controlador residente.
- LLVM IR
- LSL, un lenguaje de secuencias de comandos utilizado en mundos virtuales, se compila en un código de bytes que se ejecuta en una máquina virtual. Second Life tiene la versión Mono original, Inworldz desarrolló la versión Phlox.
- El lenguaje Lua utiliza una máquina virtual de bytecode basada en registros
- código m del lenguaje MATLAB
- Malbolge es un lenguaje de máquina esotérico para una máquina virtual ternaria.
- Código P de Microsoft utilizado en Visual C++ y Visual Basic
- Multiplan
- Código O del lenguaje de programación BCPL
- El lenguaje OCaml se compila opcionalmente en un formato de código de bytes compacto
- código p de UCSD Pascal implementación del lenguaje Pascal
- maquina virtual loro
- Elija BASIC también conocido como Data BASIC o MultiValue BASIC
- El entorno R para la computación estadística ofrece un compilador de código de bytes a través del paquete del compilador, ahora estándar con la versión 2.13.0 de R. Es posible compilar esta versión de R para que los paquetes base y recomendados exploten esto.
- juego de aventuras piramide 2000
- Las secuencias de comandos de Python se compilan durante la ejecución en el lenguaje de código de bytes de Python, y los archivos compilados (.pyc) se almacenan en caché dentro de la carpeta de la secuencia de comandos.
El código compilado se puede analizar e investigar utilizando una herramienta integrada para depurar el código de bytes de bajo nivel. La herramienta se puede inicializar desde el shell, por ejemplo:
>>> import dis # "dis" - Desensamblador de código de bytes de Python en mnemónicos. >>> dis. dis ('print("¡Hola, mundo!")') 1 0 LOAD_NAME 0 (imprimir) 2 LOAD_CONST 0 ('¡Hola, mundo!') 4 CALL_FUNCTION 1 6 RETURN_VALUE
- Implementación de Scheme 48 de Scheme usando un intérprete de código de bytes
- Códigos de bytes de muchas implementaciones del lenguaje Smalltalk
- El intérprete Spin integrado en el microcontrolador Parallax Propeller
- El motor de base de datos SQLite traduce las declaraciones SQL a un formato de código de bytes personalizado.
- manzana dulce16
- Tcl
- Los compiladores utilizan TIMI en la plataforma IBM i.
- Pequeño BÁSICO
- Visual FoxPro compila a bytecode
- Asamblea web
- YARV y Rubinius para Ruby
- ZCODE
Contenido relacionado
Cuerpo de conocimientos de ingeniería de software
Internet interplanetario
Identificador uniforme de recursos