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.

  1. 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 →
  2. 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 →
  3. 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 →
  4. 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.

  1. 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 →
  2. 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 →
  3. 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 →
  4. 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 →
  5. 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.

  1. 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 →
  2. 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 →
  3. 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 →
  4. 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 →
  5. 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 →
  6. 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 →
  7. 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 →
  8. 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 →
  9. 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 →
  10. 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 →
  11. 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 →
  12. 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.

  1. 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 →
  2. 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 →
  3. 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 →
  4. 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 →
  5. 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 →
  6. 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 →
  7. 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.

  1. 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 →
  2. 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 →
  3. 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 →
  4. 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 →
  5. 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.

  1. 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 →
  2. 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 →
  3. 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 →
  4. 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 →
  5. 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 →
  6. 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 →
  7. 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 →
  8. 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 →
  9. 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 →
  10. 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.