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

Tabla de contenidos

Resumir con:

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

}

Compartir en:

Artículos relacionados

¿Qué es un modelo de lenguaje LLM y cómo funciona?

Los LLM IA, es decir, los modelos de lenguaje de gran tamaño o Large Language Models, han revolucionado el campo de la inteligencia artificial, demostrando capacidades sorprendentes para comprender y generar texto de manera coherente y precisa. Estos han abierto un abanico de

Rebind: la IA de libros que ofrece una nueva forma de leer

¿Eres un aficionado de la lectura y quieres sacarle más partido a tus libros? La inteligencia artificial se ha colado en nuestro día a día y ahora trae innovaciones hasta para los lectores más ávidos. En este artículo te hablaremos de Rebind, una

Pentesting: hackeando sistemas por un bien común

Definimos una prueba de penetración como una práctica ética de ciberseguridad cuyo fin es descubrir, estudiar y remediar vulnerabilidades dentro de una red de sistemas informáticos. El sentido detrás de las pruebas de penetración es que recurre a las mismas tácticas y argucias

Scroll al inicio