Código intermedio o bytecode: qué es y para qué sirve
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
Sistemas MES: qué es, origen y funciones
Un Sistema de Ejecución de Manufactura (MES, por sus siglas en inglés) es una solución de software que proporciona una visión en tiempo real de los procesos de manufactura
¿En qué consiste un menú sticky y cómo implementarlo en una web?
Actualmente, la experiencia del usuario dentro de una página web es uno de los elementos más importantes, tanto para disciplinas como el SEO, pero también para que exista una mayor
Todo lo que debes saber sobre un ataque Man-in-the-Middle
¿No sabes qué es un ataque Man-in-the-Middle?