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 [1] , 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 el análisis semántico de cosas como el tipo, el alcance y la profundidad de anidamiento de los objetos del programa.
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 . [2] [3] A menudo, diferentes partes pueden almacenarse en archivos separados, de forma similar a los módulos de objeto , 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). [4]
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 , [a] 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 [1] y Dart [7] 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. [8]
Ejemplos de
>>> import dis # "dis" - Desmontador de código de bytes de Python en mnemónicos. >>> dis . dis ( 'print ("¡Hola, mundo!")' ) 1 0 LOAD_NAME 0 (print) 2 LOAD_CONST 0 ('¡Hola, mundo!') 4 CALL_FUNCTION 1 6 RETURN_VALUE
- 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
- Lenguajes de programación Icon [9] y Unicon [10]
- 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
- ASM
- BCEL
- Javassist
- JMangler
- 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. [11] [12]
- 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 [13]
- Multiplan [14]
- 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. [15]
- Juego de aventuras Pyramid 2000
- 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. [dieciséis]
- DULCES 16
- Tcl
- Diminuto BÁSICO
- Visual FoxPro se compila en código de bytes
- WebAssembly
- YARV y Rubinius para Ruby
Ver también
- Sistema de tiempo de ejecución
- ZCODE
Notas
- ^ PHP tiene compilación justo a tiempo en PHP 8, [5] [6] y antes, aunque no estaba en la versión predeterminada, tenía opciones como HHVM . Para versiones anteriores de PHP: aunque los códigos de operación PHP se generan cada vez que se inicia el programa, y siempre se interpretan y no se compilan justo a tiempo .
Referencias
- ^ a b "Generación dinámica de código de máquina" . Google .
- ^ "La implementación de Lua 5.0" . (NB. Se trata de una máquina virtual basada en registros).
- ^ "Dalvik VM" . Archivado desde el original el 18 de mayo de 2013 . Consultado el 29 de octubre de 2012 . (NB. Esta máquina virtual se basa en registros).
- ^ "Byte Code Vs Machine Code" . www.allaboutcomputing.net . Consultado el 23 de octubre de 2017 .
- ^ O'Phinney, Matthew Weier. "Explorando el nuevo compilador PHP JIT" . Zend de Perforce . Consultado el 19 de febrero de 2021 .
- ^ "PHP 8: El JIT - stitcher.io" . stitcher.io . Consultado el 19 de febrero de 2021 .
- ^ Loitsch, Florian. "¿Por qué no una máquina virtual de código de bytes?" . Google . Archivado desde el original el 12 de mayo de 2013.
- ^ "Mito de JavaScript: JavaScript necesita un código de bytes estándar" . 2ality.com .
- ^ "La implementación del lenguaje de programación de iconos" (PDF) . Archivado desde el original (PDF) el 5 de marzo de 2016 . Consultado el 9 de septiembre de 2011 .
- ^ "La implementación de Icon y Unicon en un compendio" (PDF) .
- ^ Paul, Matthias R. (30 de diciembre de 2001). "Estructura interna de KEYBOARD.SYS" . Grupo de noticias : comp.os.msdos.programmer . Archivado desde el original el 9 de septiembre de 2017 . Consultado el 17 de septiembre de 2016 .
[…] De hecho, el formato es básicamente el mismo en MS-DOS 3.3 - 8.0, PC DOS 3.3 - 2000, incluidos los problemas en ruso, lituano, chino y japonés, así como en Windows NT, 2000 y XP […] . Hay pequeñas diferencias e incompatibilidades, pero el formato general no ha cambiado a lo largo de los años. […] Algunas de las entradas de datos contienen tablas normales […] Sin embargo, la mayoría de las entradas contienen código ejecutable interpretado por algún tipo de intérprete de código p en * tiempo de ejecución *, incluidas las ramas condicionales y similares. Esta es la razón por la que el controlador KEYB tiene una huella de memoria tan grande en comparación con los controladores de teclado controlados por tablas, que se pueden hacer en 3 - 4 Kb obteniendo el mismo nivel de función excepto por el intérprete. […]
- ^ Mendelson, Edward (20 de julio de 2001). "Cómo visualizar el euro en MS-DOS y Windows DOS" . Muestre el símbolo del euro en MS-DOS de pantalla completa (incluido el DOS de pantalla completa de Windows 95 o Windows 98). Archivado desde el original el 17 de septiembre de 2016 . Consultado el 17 de septiembre de 2016 .
[…] Matthias [R.] Paul […] advierte que la versión IBM PC DOS del controlador de teclado utiliza algunos procedimientos internos que no son reconocidos por el controlador de Microsoft , por lo que, si es posible, debe utilizar las versiones de IBM de ambos KEYB .COM y KEYBOARD.SYS en lugar de mezclar las versiones de Microsoft e IBM […]
(NB. Lo que se entiende por "procedimientos" aquí son algunos códigos de bytes adicionales en el archivo IBM KEYBOARD.SYS que no son compatibles con la versión de Microsoft del controlador KEYB). - ^ "Patente de Estados Unidos 6,973,644" .
- ^ Especificaciones de Microsoft C Pcode . pag. 13.
Multiplan no se compiló en código de máquina , sino en una especie de código de bytes que fue ejecutado por un intérprete , con el fin de hacer que Multiplan sea portátil a través del hardware muy variado de la época. Este código de bytes distinguía entre el formato de punto flotante específico de la máquina para calcular y un formato externo (estándar), que era decimal codificado en binario (BCD). Las instrucciones PACK y UNPACK convertidas entre las dos.
- ^ "Instalación y administración de R" . cran.r-project.org .
- ^ "El motor de código de bytes SQLite" . Archivado desde el original el 14 de abril de 2017 . Consultado el 29 de agosto de 2016 .