Bytecode - Bytecode
Bytecode , también denominado 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.
Ejecución del programa |
---|
Conceptos generales |
Tipos de codigo |
Estrategias de compilación |
Tiempos de ejecución notables |
|
Compiladores y cadenas de herramientas notables |
|
El nombre se deriva de código de bytes conjuntos de instrucciones que tienen de uno de bytes códigos de operación seguido 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 puede ejecutarse directamente en una máquina virtual (una máquina de código p , es decir, un intérprete), o puede compilarse 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).
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 bytecode y luego pasando el bytecode 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 de
- 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 #
- El código de bytes de Dalvik , diseñado para la plataforma Android , es ejecutado por la máquina virtual de Dalvik
- Dis bytecode, diseñado para el 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 incorporado de Lisp . Estas características se compilan en código de bytes. Esta arquitectura permite a los usuarios personalizar el editor con un lenguaje de alto nivel, que después de compilar en código de bytes produce un rendimiento razonable.
- La implementación embebible de Common Lisp de Common Lisp puede compilarse en código byte o código C
- La implementación de Ericsson de Erlang usa 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 utilizó la máquina Z para hacer que sus aplicaciones de software fueran más portátiles
- Código de bytes de Java , que es ejecutado por la máquina virtual de Java
- KEYB , el controlador de teclado DOS de MS-DOS / PC 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.
- LSL, un lenguaje de secuencias de comandos utilizado en mundos virtuales, se compila en 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 código de bytes basada en registros
- código m del lenguaje MATLAB
- Malbolge es un lenguaje de máquina esotérico para una máquina virtual ternaria.
- 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
- Máquina virtual Parrot
- Elija BÁSICO también denominado BÁSICO de datos o BÁSICO de múltiples valores
- 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 R 2.13.0. Es posible compilar esta versión de R para que los paquetes base y recomendados aprovechen esto.
- Juego de aventuras Pyramid 2000
- Los scripts de Python se compilan al ejecutarse en el lenguaje de código de bytes de Python, y los archivos compilados (.pyc) se almacenan en caché dentro de la carpeta del script.
El código compilado se puede analizar e investigar utilizando una herramienta incorporada para depurar el código de bytes de bajo nivel. La herramienta se puede inicializar desde el shell, por ejemplo:
>>> import dis # "dis" - Disassembler of Python byte code into mnemonics.
>>> dis.dis('print("Hello, World!")')
1 0 LOAD_NAME 0 (print)
2 LOAD_CONST 0 ('Hello, World!')
4 CALL_FUNCTION 1
6 RETURN_VALUE
- Implementación de Scheme 48 de Scheme utilizando un intérprete de código de bytes
- Bytecodes 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.
- DULCES 16
- Tcl
- Diminuto BÁSICO
- Visual FoxPro se compila en código de bytes
- WebAssembly
- YARV y Rubinius para Ruby