En este artículo te explicamos para qué sirve el código intermedio o bytecode y te ponemos un ejemplo sencillo para que lo comprendas.

Código intermedio o bytecode: qué es y para qué sirve

pablo.blanco
10/06/2024

Un código intermedio o bytecode es un lenguaje de programación que sirve como puente entre un lenguaje de programación de alto nivel y el código máquina que leen los microprocesadores en los ordenadores. Este código intermedio es una traducción del lenguaje de alto nivel que, posteriormente, un intérprete volverá a traducir a un lenguaje máquina que el hardware del ordenador pueda procesar. 

Un ejemplo conocido de código intermedio es el llamado código de tres direcciones, en el que cada instrucción en este código opera sobre tres elementos: dos operandos y un resultado.

¿Y para qué hace falta un código intermedio? Principalmente por razones prácticas de compatibilidad. El código intermedio se genera de forma independiente a cualquier requisito técnico del hardware o de la plataforma en la que se vaya a traducir, por lo que puede convertirse y amoldarse a sistemas operativos y sistemas informáticos diferentes.

¿Cómo funciona el código intermedio?

Imaginemos que queremos programar una aplicación informática en Python. En algún momento, deberemos transformar el código de Python en un lenguaje intermedio o bytecode. Así pues, este sería el proceso para generar código intermedio:

Generación de código de alto nivel

Un desarrollador crea un software programado con Python, o cualquier lenguaje de programación de alto nivel que otros desarrolladores pueden leer. En muchas ocasiones, los desarrolladores escriben el código de los programas en entornos de desarrollo integrados que cuentan con un amplio abanico de herramientas. Sin embargo, en este entorno el código no se puede traducir a un lenguaje legible para el hardware.

Compilación a código intermedio

Es un compilador la herramienta por excelencia que convierte el código fuente a código intermedio. Este programa traduce strings de código fuente a código intermedio, o a código máquina o a cualquier otro lenguaje de programación mediante análisis léxicos, sintácticos y semánticos.

Traducción definitiva a código máquina

Se instala un intérprete, una máquina virtual, en todos los sistemas informáticos donde se vaya a probar la aplicación. Este hará la traducción definitiva del código intermedio a un código máquina compuesto de números binarios (1 o 0) para que los procesadores informáticos pueden procesar el código final y ejecutarlo. 

Cabe mencionar que la máquina virtual que sirve como intérprete no es intercambiable entre diferentes sistemas operativos o arquitecturas de ordenadores, sino que cada cual requiere de un intérprete con características muy específicas.

Lenguajes de programación que utilizan código intermedio

Varios lenguajes de programación utilizan código intermedio como parte de su proceso de compilación o interpretación. Algunos son:

  • Java: El código fuente de Java se compila en bytecode para que después la Máquina Virtual Java lo interprete a código máquina.

  • C#: El código fuente de C# se compila en CIL (Common Intermediate Language), también conocido como MSIL (Microsoft Intermediate Language). El Common Language Runtime ejecuta el código, la máquina virtual de .NET.

  • JavaScript: Particularmente en motores avanzados como V8 en Google Chrome y Node.js, JavaScript también compila el código fuente en bytecode. 

Ejemplo de lenguaje intermedio

Este bytecode está generado en Javac, el compilador de Javay, y es ejecutable en una Máquina Virtual Java (JVM).

Primero, creemos un programa simple en Java ad hoc para el ejemplo que nos atañe:

public class HolaMundo {

    public static void main(String[] args) {

        System.out.println("¡Hola, Mundo!");

    }

}

 

Cuando este código se compila usando el comando javac HolaMundo.java, se genera un archivo de bytecode llamado HolaMundo.class. El contenido de este archivo no está orientado a la legibilidad en términos humanos, pero puede descompilarse con herramientas como javap (incluida en el JDK).

Si ejecutamos javap -c HolaMundo.class, obtendremos una representación del bytecode en un formato más legible. Este bytecode es una representación intermedia entre el código fuente de alto nivel (Java) y el código máquina específico de una plataforma. Posteriormente, la máquina virtual lo interpretará según el hardware específico para el que tenga que traducirlo:

Compiled from "HolaMundo.java"

public class HolaMundo {

  public HolaMundo();

    Code:

       0: aload_0

       1: invokespecial #1   // Method java/lang/Object."<init>":()V

       4: return

 

  public static void main(java.lang.String[]);

    Code:

       0: getstatic     #2   // Field java/lang/System.out:Ljava/io/PrintStream;

       3: ldc           #3   // String ¡Hola, Mundo!

       5: invokevirtual #4   // Method java/io/PrintStream.println:(Ljava/lang/String;)V

       8: return

}

Artículos relacionados

Tanto el QA como el QC son partes integrales de la revisión de la calidad en un proyecto de software. ¿Pero conoces qué diferencia a cada faceta?
pablo.blanco

Diferencias entre QA y QC en un proyecto de software

13/06/2024

La calidad es uno de los aspectos troncales de una empresa que se tiene en estima.

Te hablamos de las 4 principales diferencias entre datos estructurados, no estructurados y semiestructurados, así como de sus implicaciones.
pablo.blanco

Datos estructurados vs. datos no estructurados: diferencias

04/06/2024

El mundo del análisis de datos es un vasto universo en sí mismo dentro de las nuevas tecnologías.

En Educa Open te explicamos todas las habilidades duras y blandas para ser un buen programador. ¿Crees que das la talla?
pablo.blanco

7 habilidades imprescindibles de todo programador

29/05/2024

Es posible que hayas oído alguna vez de algún programador muy benévolo que cualquiera puede ser programador. ¿Es esto cierto?