Compilador, intérprete y lenguaje de programación

Las computadoras o más precisamente el procesador o CPU solo entienden “Lenguaje de Máquina”. Esto es un conjunto de instrucciones representadas por unos y ceros ej: “0011010111”. Les recomiendo ver los tutoriales “Número binario, hexadecimal, byte, bit y palabra en computación” y “Qué es una computadora u ordenador” antes que este.

Lenguaje de máquina y ensamblador

Cada CPU esta diseñada para entender un conjunto de instrucciones de muy bajo nivel. Estas instrucciones utilizan un número limitado de registros que son como “las variables de la CPU” donde se realizan la mayoría de las operaciones. Es típico mover los datos de la memoria a los registros, realizar las operaciones y mover los resultados de vuelta a la memoria.

La programación de bajo nivel es compleja, de baja productividad y frecuentemente se generan errores difíciles de encontrar.

Para hacer más fácil la programación a cada instrucción máquina se le da un nombre como “add”, “mov”, etc. Esto es lo que se conoce como lenguaje ensamblador.

Compilador

La siguiente gran evolución fue la creación de lenguajes de programación de alto nivel. La idea era que el lenguaje sea más amigable para los humanos. Estos lenguajes son más productivos ya que tienen instrucciones más potentes y sencillas que normalmente equivaldrían a muchas instrucciones de máquina.  

Una vez escrito el programa en lenguaje de alto nivel, un traductor lo convierte a lenguaje máquina. Este traductor es conocido como compilador.

El conjunto de instrucciones de código máquina que entienden diferentes procesadores puede ser distinto. También los programas suelen llamar a rutinas del sistema operativo que son distintas según el sistema.

Estas diferencias obligan a crear un compilador especializado en cada tipo de máquina y sistema operativo aunque el lenguaje de alto nivel sea el mismo.

Los lenguajes más representativos de este tipo son Cobol, C y C++.

Compilador

Intérprete

Una variación de la idea de compilador es la de intérprete. En vez de convertir programa en a código máquina la idea es crear una máquina ficticia que entienda el lenguaje de alto nivel. Le llamó máquina ficticia porque no es una máquina sino un programa el que ejecuta o interpreta las instrucciones de alto nivel.

Podemos pensar en el intérprete como en un procesador que en vez de ejecutar instrucciones máquina ejecuta instrucciones instrucciones de alto nivel.  

Los lenguajes más representativos de este tipo son Smalltalk y Javascript.

Máquina virtual

Este es un concepto intermedio entre el compilador e intérprete popularizado por el lenguaje de programación Java. La idea es escribir los programas en lenguaje de alto nivel pero en vez de compilarlo (traducirlo) a lenguaje máquina se lo traduce a un código intermedio. Este código intermedio es ejecutado por un intérprete conocido como Máquina Virtual.

Los lenguajes más representativos de este tipo son Java y C#.

Máquina Virtual de Java

Ventajas y desventajas de lenguajes compilados e interpretados

Los lenguajes compilados suelen ser considerados de más bajo nivel que los interpretados. Suelen ser más rápidos en ejecución y consumir menos recursos aunque son criticados por su falta de compatibilidad. Es común tener que programar diferentes versiones para diferentes computadoras.  

En contraposición los lenguajes interpretados suelen ser más potentes y flexibles pero a costa de velocidad y consumo de recursos. Los lenguajes interpretados suelen permitir el uso de variable sin tipo definido lo que se suele ver como un incremento en la potencia y productividad aunque puede tener gran costo produciendo errores difíciles de detectar.

Java con su máquina virtual intenta llevarse lo mejor de los dos mundos. Con una eficiencia muy superior a los lenguajes interpretados es un lenguaje de alta productividad. Además clama ser altamente compatible “Write once, run anywhere” traducida la frase sería algo como “escribir una vez, ejecuta donde sea”.