De texto a trabajo de la máquina: compiladores e intérpretes
Escribimos código en palabras humanas como 'add', 'if', 'nombre'. Pero por dentro una máquina solo entiende instrucciones diminutas de encendido y apagado. Entre las palabras humanas y las de la máquina hay una gran brecha. Lo que la une es el compilador y el intérprete.
Las palabras humanas y las de la máquina difieren
El 'add', 'if' que escribimos son palabras fáciles de leer para humanos.
Pero lo que una máquina de verdad conoce
son solo instrucciones diminutas hechas de encendido y apagado.
Entre nuestro texto y lo que hace la máquina hay una gran brecha.
Así que nuestro texto no puede ejecutarse tal cual.
Arriba nuestra línea, abajo las instrucciones diminutas de la máquina. Toca la brecha del medio.
Arriba y abajo son tan distintos.
Las palabras humanas se leen de un vistazo; las de la máquina son ilegibles.
Alguien tiene que cruzar esta brecha por nosotros.
Hay dos formas de hacer ese trabajo.
Dos formas de tender el puente
Para cruzar la brecha necesitas a alguien que traduzca.
Hay dos formas.
Una: traducir todo el texto por adelantado.
La otra: leerlo y ejecutarlo línea por línea sobre la marcha.
La primera es un compilador; la segunda, un intérprete.
Toca los dos caminos. 'Traducir todo primero' y 'línea por línea al momento' se ven distintos.
Cruzan la misma brecha, pero de modos muy distintos.
Uno de antemano, otro al momento.
¿Miramos primero de cerca el lado de 'traducir todo por adelantado'?
Así trabaja un compilador.
Compilar: traducir todo de antemano
Un compilador lee nuestro texto de principio a fin
y lo convierte todo de una vez en un producto terminado que la máquina usa directamente.
La traducción ocurre una vez, por adelantado; luego ejecutas ese resultado rápido, muchas veces.
Si algo está mal, suele avisarte antes de ejecutar.
Es como traducir un libro entero por adelantado y entregar a los lectores la versión final.
Pulsa 'compilar' para convertir todo el texto en un producto terminado; 'ejecutar' lo corre rápido de una vez.
Traducir todo de antemano hace la ejecución ligera y rápida.
A cambio, esperas a que termine la traducción inicial.
Entonces, al revés, ¿hay forma de empezar ya sin esperar?
Ese es el intérprete.
Interpretar: línea por línea, al momento
Un intérprete no fabrica un producto terminado aparte.
Lee nuestro texto desde arriba, una línea, y hace esa cosa enseguida,
luego lee la siguiente línea y también la hace, avanzando así al momento.
Así empiezas de inmediato sin esperar y puedes probar cosas con ligereza.
Es como un intérprete en vivo traduciendo una frase a la vez mientras hablas.
Pulsa 'ejecutar': lee una línea, la hace, luego la siguiente. Avanza por turno, al momento.
Empezar enseguida e ir línea por línea resulta cómodo.
A cambio, cada ejecución vuelve a leer línea por línea desde el inicio.
Compilar es por-adelantado-y-rápido; interpretar es al-momento-y-fácil.
¿Entonces cuál es mejor?
No es que uno sea mejor, sino un toma y daca
Ninguno es mejor sin más; se compensan.
Compilar arranca lento pero corre rápido, y avisa de errores por adelantado.
Interpretar empieza ya y es fácil de probar, pero relee línea por línea cada vez.
Así que en la práctica los dos suelen mezclarse según convenga.
Eliges según lo que más valores.
Toca un eje. Mira cómo se reparten arranque, velocidad, momento del error y resultado entre ambos.
Ya vimos cómo nuestro texto se vuelve trabajo de la máquina.
Pero mientras corre así,
¿dónde viven en realidad los valores y objetos que hicimos?
Y ¿qué significa eso de 'esto apunta a aquello'?
En la próxima y última lección, miraremos ese lugar.