# Teoría de lenguajes de programación

La teoría de lenguajes de programación es una rama de la ciencias de la computación que se encarga del diseño, implementación, análisis, caracterización y clasificación de lenguajes de programación y sus características. Es un campo multidisciplinar, que depende de (y en algunos casos afecta a) las matemáticas, la ingeniería del software, la lingüística, e incluso las ciencias cognitivas. Es una rama bien reconocida de la informática, y a fecha de 2006, un área activa de investigación, con resultados publicados en un gran número de revistas dedicadas a la PLT, así como en general en publicaciones de informática e ingeniería. La mayoría de los programas de los estudiantes universitarios de informática requieren trabajar en este tema.
Un símbolo no oficial de la teoría de lenguajes de programación es la letra griega lambda en minúsculas. Este uso deriva del cálculo lambda, un modelo computacional ampliamente usado por investigadores de lenguajes de programación. Muchos textos y artículos sobre programación y lenguajes de programación utilizan lambda de una u otra manera. Ilustra la portada del texto clásico Estructura e Interpretación de Programas de Ordenador, y el título de muchos de los llamados Artículos Lambda, escritos por Gerald Jay Sussman y Guy Steele, creadores del lenguaje de programación Scheme. Un sitio muy conocido sobre teoría de lenguajes de programación se llama Lambda the Ultimate (Lambda el primordial), en honor al trabajo de Sussman y Steele.

## Historia

Desde el punto de vista de la Teoría de la computabilidad, la historia de la teoría de lenguajes de programación precede incluso al desarrollo de los propios lenguajes de programación. El cálculo lambda, desarrollado por Alonzo Church y Stephen Cole Kleene en la década de 1930, es considerado uno de los primeros lenguajes de programación del mundo, incluso pese a que tenía intención de «modelar» la computación más que ser un medio para que los programadores «describan» algoritmos para un sistema informático. Muchos lenguajes de programación funcional se han caracterizado por proveer una «fina apariencia» al cálculo lambda, y muchos se describen en sus términos.
El primer lenguaje de programación (como tal) que se propuso fue Plankalkül, que fue diseñado por Konrad Zuse en los años 40, pero no fue conocido públicamente hasta 1972 (y no implementado hasta 2000, cinco años después de la muerte de Zuse). El primer lenguaje de programación ampliamente conocido y exitoso fue Fortran, desarrollado entre 1954 y 1957 por un equipo de investigadores en IBM liderados por John Backus. El éxito de FORTRAN condujo a la creación de un comité de científicos para desarrollar un lenguaje de programación «universal»; el resultado de su esfuerzo fue ALGOL 58. Separadamente, John McCarthy del MIT desarrolló el lenguaje de programación Lisp (basado en el cálculo Lambda), el primer lenguaje con orígenes académicos en conseguir el éxito. Con el triunfo de estos esfuerzos iniciales, los lenguajes de programación se convirtieron en un tema candente en la investigación en la década de 1960 y en adelante.
Algunos otros eventos claves en la historia de la teoría de lenguajes de programación desde entonces:
* En la década de 1950, Noam Chomsky desarrolló la Jerarquía de Chomsky en el campo de la lingüística; un descubrimiento que impactó directamente a la teoría de lenguajes de programación y otras ramas de la informática.
* En la década de 1960, el lenguaje Simula fue desarrollado por Ole-Johan Dahl y Kristen Nygaard; muchos consideran que es el primero lenguaje orientado a objetos; Simula también introdujo el concepto de corrutinas.
* Durante 1970:
** Un pequeño equipo de científico en Xerox PARC encabezado por Alan Kay elaboran Smalltalk, un lenguaje orientado a objetos muy conocido por su novedoso (hasta ese momento desconocido) entorno de desarrollo.
** Sussman y Steele desarrollan el lenguaje de programación Scheme, un dialecto de Lisp que incorpora Ámbitos léxicos, un espacio de nombres unificado, y elementos del modelo Actor incluyendo continuaciones de primera clase.
** Backus, en la conferencia del Premio Turing de 1977, asedió el estado actual de los lenguajes industriales y propuso una nueva clase de lenguajes de programación ahora conocidos como lenguajes de programación funcional.
** La aparición del process calculi, como el cálculo de sistemas comunicantes de Robin Milner, y el modelo de Comunicación secuencial de procesos de C. A. R. Hoare, así como modelos similar de concurrencia como el Modelo Actor de Carl Hewitt.
** La aplicación de la teoría de tipos como una disciplina a los lenguajes de programación, liderada por Milner; esta aplicación ha conducido a un tremendo avance en la teoría de tipos en cuestión de años.
* En la década de 1990:
** Philip Wadler introdujo el uso de monads para estructurar programas escritos en lenguajes de programación funcional.

## Subdisciplinas y campos relacionados

Hay varios campos de estudio que o bien caen dentro de la teoría de lenguajes de programación, o bien tienen una profunda influencia en ella; muchos de estos se superponen considerablemente.
* La Teoría de autómatas es la base formal sobre la escritura de compiladores (o más generalmente traductores); programas que traducen un programa escrito en un lenguaje a otra forma. Las acciones de un compilador se dividen tradicionalmente en análisis sintáctico (escanear y analizar), análisis semántico (determinando que es lo que debería de hacer un programa), optimización (mejorando el rendimiento indicado por cierta medida, típicamente la velocidad de ejecución) y generación de código (generando la salida de un programa equivalente en el lenguaje deseado; a menudo el conjunto de instrucciones de una CPU).
* La Teoría de tipos es el estudio de sistemas de tipos, que son "métodos sintácticos tratables para proveer la ausencia de ciertos comportamientos de programa mediante la clasificación de frases según los tipos de valores que computan." (Types and Programming Languages, MIT Press, 2002). Muchos lenguajes de programación se distinguen por las características de sus sistemas de tipos.
* La Semántica formal es la especificación formar del comportamiento de programas de ordenador y lenguajes de programación.
* La transpilación es el proceso de transformar un programa de una forma (lenguaje) a otra forma; el análisis de programas es problema general de examinar un programa mediante la determinación de sus características clave (como la ausencia de clases de errores de programa).
* Sistemas en tiempo de ejecución se refiere al desarrollo de entornos en tiempo de ejecución para lenguajes de programación y sus componentes, incluyendo máquinas virtuales, recolección de basura, e interfaces para funciones externas.
* Análisis comparativo de lenguajes de programación busca clasificar los lenguajes de programación en diferentes tipos basados en sus características; amplias categorías de diferentes lenguajes de programación se conocen frecuentemente como paradigmas de programación.
* Metaprogramación es la generación de programas de mayor orden que, cuando se ejecutan, producen programas (posiblemente en un lenguaje diferente, o en un subconjunto del lenguaje original) como resultado.
* Los lenguajes de dominio específico son lenguajes construidos para resolver problemas en un dominio de problemas en particular de manera eficiente.
Además, PLT hace uso de muchas otras ramas de las matemáticas, ingeniería del software, lingüística, e incluso ciencias cognitivas.

## Revistas y publicaciones específicas sobre PLT

Entre las revistas que publican investigación sobre la teoría de lenguajes de programación están:
* ACM Transactions on Programming Languages and Systems
* Computer Languages, Systems, and Structures
* Journal of Functional Programming, The
* Journal of Functional and Logic Programming, The
* Journal of Symbolic Computation, The
* Theoretical Computer Science
Una bibliografía más completa está disponible aquí; ver también la siguiente lista de publicaciones sobre informática.