Historia
De la Nota G a WebAssembly
Dos siglos convirtiendo texto en programas en marcha: los primeros intérpretes y compiladores, la teoría de gramáticas y autómatas, los optimizadores, las máquinas virtuales y los JIT, y el navegador como destino de compilación. Filtra por capítulo para seguir un hilo.
1843 – 1951
Antes de los compiladores
Los programas se escriben como números, o se cablean a mano. Luego empiezan a vivir en la memoria, y aparecen los primeros intérpretes.
-
1843
La Nota G
Ada Lovelace
En sus notas sobre la Máquina Analítica de Babbage, Lovelace describe paso a paso cómo calcularía la máquina los números de Bernoulli, a menudo considerado el primer programa publicado.
Leer el capítulo 00 · Modelos de ejecución → -
1945
El ordenador de programa almacenado
John von Neumann
El Primer borrador de un informe sobre el EDVAC describe una máquina cuyo programa vive en la memoria junto a sus datos. Los programas se convierten en datos que otros programas pueden escribir.
Leer el capítulo 06 · La ejecución → -
1949
Short Code
John Mauchly, William Schmitt
Los programadores escriben expresiones aritméticas en un código que lleva a cabo un intérprete, a unas cincuenta veces el coste del código máquina.
Leer el capítulo 00 · Modelos de ejecución → -
1951
Sucesos regulares y autómatas finitos
Stephen Kleene
Estudiando redes de neuronas, Kleene muestra que las expresiones regulares describen exactamente lo que reconocen los autómatas finitos: la teoría detrás de todo lexer.
Leer el capítulo 01 · Análisis léxico →
1952 – 1959
Los primeros compiladores
Traducir fórmulas a código máquina de forma automática, y convencer a los programadores de que el resultado puede ser rápido.
-
1952
Autocode
Alick Glennie
Para el Manchester Mark 1, a menudo considerado el primer lenguaje de programación compilado.
Leer el capítulo 00 · Modelos de ejecución → -
1952
El sistema A-0
Grace Hopper
El equipo de Hopper en Remington Rand construye un sistema que ensambla programas a partir de una biblioteca de rutinas, y empieza a llamar «compiladores» a estas herramientas.
Leer el capítulo 00 · Modelos de ejecución → -
1956
Tres modelos para describir el lenguaje
Noam Chomsky
Chomsky clasifica las gramáticas por su potencia. Las independientes del contexto, un nivel por encima de las regulares, se convierten en la forma estándar de describir lenguajes de programación.
Leer el capítulo 02 · Análisis sintáctico → -
1957
FORTRAN
John Backus y su equipo en IBM
El primer compilador de FORTRAN produce código casi tan rápido como el de un experto, y demuestra que los lenguajes de alto nivel pueden ser prácticos.
Leer el capítulo 05 · Optimización → -
1958
Lisp y el primer eval
John McCarthy, Steve Russell
McCarthy define Lisp mediante una función que evalúa Lisp; Russell la implementa en el IBM 704 y crea el primer intérprete de Lisp.
Leer el capítulo 00 · Modelos de ejecución →
1960 – 1979
La teoría se encuentra con la práctica
Gramáticas, autómatas y tipos dan a los compiladores una base matemática; Lex y Yacc los hacen más fáciles de construir.
-
1960
El informe de ALGOL 60 y la BNF
John Backus, Peter Naur y otros
Por primera vez se define con precisión la sintaxis de un lenguaje de programación con una notación gramatical: la forma de Backus–Naur.
Leer el capítulo 02 · Análisis sintáctico → -
1962
Un compilador que se compila a sí mismo
Timothy Hart, Michael Levin
El compilador de Lisp 1.5 está escrito en Lisp: el primer compilador autocompilado.
Leer el capítulo 00 · Modelos de ejecución → -
1965
El análisis LR
Donald Knuth
Knuth define las gramáticas que pueden analizarse de abajo arriba, de forma determinista, leyendo de izquierda a derecha: la familia LR(k).
Leer el capítulo 02 · Análisis sintáctico → -
1968
De las expresiones regulares a los autómatas
Ken Thompson
La construcción de Thompson convierte mecánicamente una expresión regular en un autómata; mueve grep, los editores y los generadores de lexers.
Leer el capítulo 01 · Análisis léxico → -
1969
Tipos principales
Roger Hindley
Toda expresión de la lógica combinatoria tiene un tipo más general que puede calcularse: la semilla de la inferencia de tipos.
Leer el capítulo 03 · Análisis semántico → -
1970
Análisis del flujo de control
Frances Allen
Bloques básicos y grafos de flujo de control: el marco que todo optimizador sigue usando. Con John Cocke publica un año después el catálogo de transformaciones optimizadoras.
Leer el capítulo 05 · Optimización → -
1972
C
Dennis Ritchie
Un lenguaje lo bastante cercano a la máquina para escribir con él un sistema operativo. Unix se reescribe en C en 1973, y C se convierte en el ensamblador portable de la industria.
Leer el capítulo 00 · Modelos de ejecución → -
1973
Precedencia de operadores descendente
Vaughan Pratt
Potencias de ligadura en lugar de niveles gramaticales: el método de análisis de expresiones que usa Wahoo.
Leer el capítulo 02 · Análisis sintáctico → -
1973
Un enfoque unificado de la optimización
Gary Kildall
Los análisis de flujo de datos pasan a ser casos de un único marco iterativo sobre el grafo de flujo de control.
Leer el capítulo 05 · Optimización → -
1975
Lex y Yacc
Mike Lesk, Eric Schmidt, Stephen Johnson
En los Bell Labs, generadores que escriben un lexer a partir de expresiones regulares y un parser LALR a partir de una gramática. Sus descendientes, Flex y Bison, todavía se usan.
Leer el capítulo 01 · Análisis léxico → -
1977
UCSD Pascal y el p-code
Kenneth Bowles y sus estudiantes
Pascal compilado a bytecode para una máquina virtual funciona en muchos microordenadores: «escríbelo una vez, ejecútalo en cualquier parte» veinte años antes de Java.
Leer el capítulo 06 · La ejecución → -
1978
Una teoría del polimorfismo de tipos
Robin Milner
El algoritmo W infiere los tipos más generales de un programa ML completo sin anotaciones. Haskell, OCaml y F# lo heredan.
Leer el capítulo 03 · Análisis semántico →
1980 – 1994
Optimizadores y portables
Asignación de registros, SSA y compiladores libres; los lenguajes dinámicos aprenden a compilarse sobre la marcha.
-
1981
Asignación de registros coloreando grafos
Gregory Chaitin y otros
Los valores vivos a la vez no pueden compartir registro: asignar registros se convierte en colorear un grafo.
Leer el capítulo 04 · Generación de código → -
1984
Reflexiones sobre confiar en la confianza
Ken Thompson
Un compilador puede esconder una puerta trasera en todo programa que compile, incluido él mismo, sin dejar rastro en ningún código fuente.
Leer el capítulo 00 · Modelos de ejecución → -
1984
Traducción dinámica de Smalltalk
Peter Deutsch, Allan Schiffman
El bytecode se traduce a código máquina la primera vez que se llama a un método, y se guarda: un antepasado de la compilación «justo a tiempo».
Leer el capítulo 06 · La ejecución → -
1987
GCC 1.0
Richard Stallman
Un compilador de C optimizador, libre y adaptable a otros procesadores. Crece hasta convertirse en la GNU Compiler Collection.
Leer el capítulo 04 · Generación de código → -
1988
Asignación única estática
Barry Rosen, Mark Wegman, Kenneth Zadeck
Cada variable asignada exactamente una vez: la forma intermedia que usa hoy casi todo compilador optimizador.
Leer el capítulo 05 · Optimización → -
1991
Cachés en línea polimórficas
Urs Hölzle, Craig Chambers, David Ungar
El proyecto Self aprende a optimizar código dinámico a partir de los tipos que ve de verdad: las técnicas detrás de HotSpot y V8.
Leer el capítulo 06 · La ejecución → -
1991
Python 0.9
Guido van Rossum
Un lenguaje dinámico compilado a bytecode para una máquina virtual, que llegará a ser de los más usados del mundo.
Leer el capítulo 00 · Modelos de ejecución →
1995 – 2009
Máquinas virtuales y JIT
El bytecode se generaliza con Java, y los compiladores «justo a tiempo» hacen rápidos los lenguajes dinámicos.
-
1995
Java y JavaScript
James Gosling; Brendan Eich
Java distribuye bytecode portable para la JVM; JavaScript, escrito en diez días, se interpreta dentro de Netscape Navigator.
Leer el capítulo 00 · Modelos de ejecución → -
1999
HotSpot
Sun Microsystems (con el equipo de Self y Strongtalk)
Una JVM que primero interpreta y solo compila los métodos calientes, con optimizaciones basadas en lo que el programa hace de verdad.
Leer el capítulo 06 · La ejecución → -
2003
LLVM 1.0
Chris Lattner, Vikram Adve
Un optimizador y un back end reutilizables en torno a una IR en SSA bien definida. Clang, Rust, Swift y Zig se apoyan en él.
Leer el capítulo 04 · Generación de código → -
2004
GCC abandona su parser generado de C++
Desarrolladores de GCC
GCC 3.4 sustituye su gramática de Bison para C++ por un parser de descenso recursivo escrito a mano; el front end de C le sigue en 2006.
Leer el capítulo 02 · Análisis sintáctico → -
2008
V8
Lars Bak y el equipo de Chrome
JavaScript compilado directamente a código máquina hace las aplicaciones web lo bastante rápidas para sustituir al software de escritorio.
Leer el capítulo 06 · La ejecución →
2010 – hoy
El navegador como destino
Compiladores que se compilan a sí mismos, lenguajes que se compilan a JavaScript y un bytecode portable para la web.
-
2011
Rust se compila a sí mismo
Graydon Hoare y el equipo de Rust
El compilador de Rust, escrito al principio en OCaml, se reescribe en Rust y se compila a sí mismo. Rust 1.0 llega en 2015.
Leer el capítulo 00 · Modelos de ejecución → -
2012
TypeScript
Anders Hejlsberg (Microsoft)
Un lenguaje con tipos que se compila a JavaScript: el comprobador de tipos caza errores y luego los tipos se borran.
Leer el capítulo 00 · Modelos de ejecución → -
2013
asm.js
Luke Wagner, Alon Zakai, David Herman (Mozilla)
Un subconjunto estricto de JavaScript que los motores pueden compilar de antemano demuestra que C y C++ pueden ejecutarse en el navegador a velocidad casi nativa.
Leer el capítulo 06 · La ejecución → -
2015
Errores de compilador para humanos
Evan Czaplicki
Elm rediseña sus mensajes de error como explicaciones claras con sugerencias; Rust y otros le siguen, y los mensajes de Wahoo copian la receta.
Leer el capítulo 03 · Análisis semántico → -
2015
Go se compila a sí mismo
El equipo de Go
Go 1.5 elimina el último C de su compilador y su runtime, traducidos a Go en su mayor parte por un programa.
Leer el capítulo 00 · Modelos de ejecución → -
2017
Llega WebAssembly
Mozilla, Google, Microsoft, Apple
Un bytecode portable y validado, diseñado en común por los cuatro fabricantes de navegadores, funciona en Firefox, Chrome, Edge y Safari.
Leer el capítulo 06 · La ejecución → -
2018
Tree-sitter
Max Brunsfeld (GitHub)
Un generador de parsers incrementales que vuelve a analizar el código mientras escribes y da a los editores árboles sintácticos precisos.
Leer el capítulo 02 · Análisis sintáctico → -
2019
WebAssembly, recomendación del W3C
Grupo de trabajo de WebAssembly del W3C
El cuarto lenguaje de la web, tras HTML, CSS y JavaScript.
Leer el capítulo 06 · La ejecución → -
2024
Un JIT para CPython
Brandt Bucher y el equipo de CPython
Python 3.13 incluye un compilador JIT experimental de tipo «copiar y parchear», desactivado por defecto: el Python de referencia empieza a compilar a código máquina.
Leer el capítulo 00 · Modelos de ejecución → -
2026
Wahoo
Esta web
Un compilador del Reino Champiñón a WebAssembly, escrito en Rust y ejecutándose en tu navegador. Pruébalo en el playground.