Qué diferencia hay entre compilador e intérprete
Escribimos código con palabras humanas como "add", "if" o "nombre". Pero lo que una máquina entiende por dentro son solo instrucciones diminutas al nivel de encendido y apagado. Hay una gran brecha entre el lenguaje humano y el de la máquina, y los compiladores y los intérpretes son los que tienden el puente.
Las palabras humanas y las de la máquina son distintas
El "add" y el "if" que escribimos son palabras fáciles de leer para las personas.
Pero lo que una máquina conoce de verdad son solo instrucciones diminutas hechas de filas de encendidos y apagados.
Entre el texto que escribimos y el trabajo que hace la máquina hay una gran brecha, así que nuestro texto no puede ejecutarse tal cual.
Arriba, una línea que escribimos; abajo, las instrucciones diminutas que conoce la máquina. Pulsa "ver la brecha" para mostrar la distancia entre ambas.
Lo de arriba y lo de abajo son muy distintos.
Las palabras humanas se leen de un vistazo, mientras que las de la máquina cuesta descifrarlas.
Alguien tiene que cruzar esta brecha por nosotros, y hay dos formas de hacerlo.
Dos formas de tender el puente
Para cruzar la brecha hace falta alguien que traduzca.
Una forma es traducir todo el texto de antemano; la otra es leer una línea cada vez sobre la marcha y ejecutarla enseguida.
La primera es un compilador, y la segunda, un intérprete.
Pulsa compilador y luego intérprete, y verás dibujados de forma distinta "traducir todo primero" y "línea a línea, sobre la marcha".
Cruzan la misma brecha de maneras muy distintas.
Uno trabaja de antemano; el otro, sobre la marcha.
Empecemos mirando de cerca la traducción completa por adelantado, que es como trabaja un compilador.
Compilar: traducirlo todo de antemano
Un compilador lee nuestro texto de principio a fin y lo convierte de una vez en un producto terminado que la máquina puede usar directamente.
La traducción se hace una sola vez, de antemano, y el resultado se puede ejecutar rápido muchas veces.
Si algo está mal, incluso puede avisarte antes de ejecutarlo.
Es como traducir un libro entero por adelantado y luego entregárselo a los lectores.
Pulsa compilar y todo el texto se convierte en un producto terminado; pulsa ejecutar y ese producto corre rápido de una vez.
Como todo se tradujo de antemano, la ejecución es limpia y rápida.
A cambio, al principio hay que esperar a que termine la traducción.
Entonces, ¿hay alguna forma de empezar enseguida sin esperar? Eso es el intérprete.
Interpretar: línea a línea, sobre la marcha
Un intérprete no crea un producto terminado aparte.
Lee una línea de nuestro texto desde arriba, hace ese trabajo enseguida, luego lee la siguiente y la hace, avanzando sobre la marcha.
Así puedes empezar al instante sin esperar, y probar cosas es fácil.
Es como un intérprete junto a alguien que habla, traduciendo frase a frase.
Pulsa ejecutar y lee una línea, la hace enseguida y pasa a la siguiente. Avanza paso a paso, sobre la marcha.
Empezar enseguida e ir línea a línea resulta muy cómodo.
A cambio, cada vez que se ejecuta vuelve a leer las líneas desde el principio.
Compilar es por adelantado y rápido; interpretar, sobre la marcha y sencillo.
Entonces, ¿cuál es mejor?
No es que uno sea mejor: es un intercambio
Ninguno es siempre mejor; es un intercambio.
Compilar empieza despacio, pero ejecuta rápido y detecta los errores de antemano.
Interpretar empieza enseguida y facilita las pruebas, pero vuelve a leer las líneas cada vez.
Por eso, en la práctica, a menudo se mezclan los dos, y se elige según lo que más importe.
Toca un aspecto para ver cómo se reparten entre los dos el inicio, la velocidad de ejecución, el momento de los errores y el resultado.
Ya vimos cómo nuestro texto se convierte en el trabajo de una máquina.
Pero mientras se ejecuta, ¿dónde están exactamente los valores y los objetos que creamos?
¿Y qué significa que "esto apunte a aquello"?
En la última lección de esta sección miraremos dentro de ese lugar.