Existe una confusión entre “compilar un programa” y “lenguajes compilados”. En este artículo aclaramos que “compilar un programa” significa “convertirlo en un formato optimizado para el ordenador” y que este formato es una secuencia de instrucciones para el microprocesador en el caso de “lenguajes compilados”.

Una duda que surge frecuentemente entre los usuarios de Java es: ¿Java es un lenguaje interpretado o compilado? Obviamente se compila el programa a un formato que se llama byte-code, por lo tanto debería ser un lenguaje compilado. Pero no lo es. Java es un lenguaje interpretado. El intérprete de Java es la “máquina virtual de Java”. Sin ella el byte-code no es ejecutable.

La confusión resulta de usar la palabra “compilar” para dos cosas distintas aunque similares. Un significado de “compilar” es “convertir un programa a un formato óptimo para el ordenador” y el otro es “convertir un código a un programa ejecutable”. Un programa ejecutable es obviamente la forma más óptima para un ordenador, porque ya no necesita ninguna transformación adicional.

Los compiladores de los “lenguajes compilados” como C o Fortran traducen el código fuente directamente a instrucciones para el microprocesador. Esto trae la ventaja que se puede utilizar el programa compilado independiente del lenguaje que lo originó. No necesito instalar ningún intérprete para ejecutar programas en estos lenguajes. La desventaja es que el programa sólo funcionará en la plataforma para que se compiló.

El contrario vale para un lenguaje interpretado. El programa es inpendiente de la plataforma pero depende de la previa instalación de un intérprete porque un programa en un lenguaje interpretado no puede existir por sí sólo. El programa de un lenguaje interpretado no es un programa ejecutable. Es meramente un fichero de datos de entrada para el intérprete. El intérprete “interpreta” el fichero de entrada y ejecuta las instrucciones correspondientes en el microprocesador. El intérprete es el enlace entre un programa independiente de la plataforma y una plataforma. El byte-code de Java, por ejemplo, es el mismo en Windows o Linux, pero la máquina virtual de Java es distinta. Se necesita una específica para cada plataforma.

Entonces ¿qué significa “compilar” el código Java? Pues, “compilar un programa” signífica “convertirlo en un formato optimizado para el ordenador”. Esto significa en caso de un lenguaje compilado convertirlo a una secuencia de instrucciones para el microprocesador. Para un lenguaje como Java signífica convertirlo a un formato optimizado para la interpretación. Por ejemplo, una palabra clave como while se puede sustituir por un sólo byte en el byte-code. Así la máquina virtual sólo necesita leer y entender un byte en lugar de cinco.

Se pueden compilar hasta lenguajes puramente textuales como JavaScript. En este caso el compilador no hace mucho más que borrar todos los comentarios y espacios innecesarios. El resultado es un programa con quizá 20.000 caracteres en una sola línea. Esto no es un formato práctico para visualizarlo en pantalla pero el intérprete de JavaScript puede trabajar un poco más deprisa por no perder tiempo con comentarios y espacios que no aportan nada a la funcionalidad.

Lectura adicional