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.

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

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

Ver también

Notas

Referencias