Antes de 1940
Los primeros lenguajes de programación preceden a la
computadora moderna. En un inicio los lenguajes eran códigos.
La máquina del telar de Jacquard, creada en 1801,
utilizaba los orificios en tarjetas perforadas para representar los movimientos
de un brazo de la máquina de tejer, con el objetivo de generar patrones
decorativos automáticamente.
Durante un período de nueve meses entre 1842 y 1843,
Ada Lovelace tradujo las memorias del matemático italiano Luigi Menabrea acerca
de la nueva máquina propuesta por Charles Babbage, la Máquina Analítica. Con
estos escritos, ella añadió unas notas en las cuales especificaba en detalle un
método para calcular los números de Bernoulli con esta máquina, el cual es
reconocido por muchos historiadores como el primer programa de computadora del
mundo.
Herman Hollerith se percató de que podía codificar
la información en tarjetas perforadas cuando observó a los conductores de
trenes codificar la apariencia de los cricket o tickets mejor conociado del
tren con la posición de los agujeros perforados en estos. En 1890 Hollerith
codificó los datos del censo en tarjetas perforadas.
Los primeros códigos de computadora estaban
especializados según sus aplicaciones. En las primeras décadas del siglo 20,
los cálculos numéricos estaban basados en los números decimales. Eventualmente
se fueron dando cuenta que la lógica podía ser representada con números, no
sólo con palabras. Por ejemplo, Alonzo Church fue capaz de expresar el cálculo
lambda a través de fórmulas. La máquina de Turing estableció las bases para
almacenar programas como datos en la arquitectura de von Neuman de una
computadora. Sin embargo, a diferencia del cálculo lambda, el código de Turing
no serviría satisfactoriamente como base para lenguajes de más alto nivel- su
principal uso es en el análisis riguroso en la complejidad algorítmica.
Como muchos “primeros” en la historia, el primer
lenguaje de programación moderno es difícil de identificar. Desde un inicio,
las restricciones de hardware definían el lenguaje. Las tarjetas perforadas
permitían 80 columnas, pero algunas de estas serían utilizadas para una clasificación
de cada tarjeta. FORTRAN incluía algunas palabras reservadas provenientes del
Inglés, como “IF”, “GOTO” (go to) y “CONTINUE”. El uso del tambor magnético
para la memoria implicaba que los programas informáticos tuvieran que estar
intercalados con las rotaciones del tambor. Por lo tanto los programas eran muy
dependientes del hardware.
Para algunas personas, lo que sería el primer
lenguaje de programación moderno depende de cuánto poder y legibilidad humana
se requería antes de que se concediera el estado de "lenguaje de
programación". Tanto el telar de Jacquard como la Máquina Diferencial de
Babbage, tenían lenguajes muy simples y extremadamente limitados para describir
las acciones que estas máquinas realizaran. Se puede incluso considerar los
agujeros perforados en los rollos de pianola como un limitado lenguaje de
dominio específico, a pesar de no estar diseñado para el consumo humano.
Los años 40
En la década de 1940 fueron creadas las primeras
computadoras modernas, con alimentación eléctrica. La velocidad y capacidad de
memoria limitadas forzaron a los programadores a escribir programas en lenguaje
ensamblador muy afinados. Finalmente se dieron cuenta que la programación en
lenguaje ensamblador requería de un gran esfuerzo intelectual y era muy
propensa a errores.
En 1948, Konrad Zuse publicó un artículo acerca de
su lenguaje de programación Plankalkül. Sin embargo, no fue implementado en su
vida y sus contribuciones fueron aisladas de otros desarrollos.
Entre algunos lenguajes importantes que fueron
desarrollados en este período se encuentran:
1943 - Plankalkül (Konrad Zuse), diseñado, pero sin
implementar durante medio siglo
1943 - el sistema de codificación ENIAC.
1949 - 1954 -- una serie de conjuntos de
instrucciones nemotécnicas, como la de ENIAC, comenzando en 1949 con C-10 para
BINAC (que luego evolucionaría en UNIVAC). Cada conjunto de instrucciones
estaba destinado a un fabricante específico.
Las décadas de 1950 y 1960
En los cincuenta, los tres primeros lenguajes de
programación modernos, cuyos descendientes aún continúan siendo utilizados,
son:
FORTRAN (1955), creado por John Backus et al.;
LISP (1958), creado por John McCarthy et al.;
COBOL (1959), creado por el Short Range Committee,
altamente influenciado por Grace Hopper.
Otro hito a finales de 1950 fue la publicación, por
un comité Americano y Europeo de científicos de la computación, de un nuevo
“lenguaje para algoritmos”; el Reporte de ALGOL 60 ("ALGOrithmic
Language"). Este reporte consolidó muchas ideas que estaban circulando en
aquel entonces, y proporcionó dos innovaciones importantes para los lenguajes
de programación:
Estructuras de bloques anidadas: las secuencias de
código y las declaraciones asociadas se pueden agrupar en bloques sin tener que
pertenecer explícitamente a procedimientos separados;
Ámbito léxico: un bloque puede tener sus propias
variables, procedimientos y funciones, invisible al código fuera de dicho
bloque, por ejemplo, ocultamiento de información.
Otra innovación, relacionada con esto, fue cómo el
lenguaje fue descrito:
Una notación matemática exacta, Backus-Naur Form
(BNF), fue utilizada para describir la sintaxis del lenguaje. Todos los
subsecuentes lenguajes de programación han utilizado una variante de BNF para
describir la porción libre del contexto de su sintaxis.
Algol 60 influenció particularmente en el diseño de
lenguajes posteriores, de los cuales algunos se hicieron más populares. Los
grandes sistemas de Burroughs fueron diseñados para ser programados en un
subconjunto extendido de Algol.
Las ideas fundamentales de Algol se continuaron,
produciendo Algol 68:
la sintaxis y la semántica se hizo aún más
ortogonal, con rutinas anónimas, un sistema de tipificación recursiva con
funciones de orden superior, etc.; y no sólo la parte libre del contexto, sino que
tanto la sintaxis como la semántica del lenguaje completo fueron definidos
formalmente, en términos de una gramática de Van Wijngaarden, un formalismo
diseñado específicamente para este propósito.
Las variadas pero poco usadas características de
Algol 68 (por ejemplo, bloques simultáneos y paralelos) y su complejo sistema
de atajos sintácticos y coerciones automáticas de tipo lo hicieron impopular
entre los ejecutores y se ganó una reputación de ser difícil. Niklaus Wirth
salió del comité de diseño para crear el sencillo lenguaje Pascal.
Algunos de los lenguajes importantes que fueron
desarrollados en este período incluyen:
1951 - Regional Assembly Language
1952 - Autocode
1954 - IPL (precursor de LISP)
1955 - FLOW-MATIC (precursor de COBOL)
1957 - FORTRAN (primer compilador)
1957 - COMTRAN (precursor de COBOL)
1958 - LISP
1958 - ALGOL 58
1959 - FACT (precursor de COBOL)
1959 - COBOL
1959 - RPG
1962 - APL
1962 - Simula
1962 - SNOBOL
1963 - CPL (precursor de C)
1964 - BASIC
1964 - PL/I
1967 - BCPL (precursor de C)
1968-1979: estableciendo paradigmas fundamentales
El período comprendido entre finales de 1960 y
finales de 1970 trajo un gran florecimiento de lenguajes de programación. La
mayoría de los paradigmas de lenguajes de programación más importantes y
actualmente en uso se inventaron en este período:
Simula, inventado en la década de 1960 por Nygaard y
Dahl como un superconjunto de Algol 60, fue el primer lenguaje diseñado para
apoyar la programación orientada a objetos.
C, en principio un lenguaje de programación
sistemas, fue desarrollado por Dennis Ritchie y Ken Thompson en los
Laboratorios Bell entre 1969 y 1973.
Smalltalk (mediados de los 70) proporcionaron un
completo diseño de un lenguaje orientado a objetos.
Prolog, diseñado en 1972 por Colmerauer, Roussel y
Kowalski, fue el primer lenguaje de programación lógica.
ML construyó un sistema de tipos polimórfico
(inventado por Robin Milner en 1973) en el tope de Lisp, pionero en los
lenguajes funcionales de programación con tipado estático.
Cada uno de estos lenguajes generó toda una familia
de descendientes, y los lenguajes más modernos cuentan al menos uno de ellos en
su ascendencia.
En los años 60 y 70 también suscitó un debate
considerable sobre los méritos de la "programación estructurada", que
esencialmente significaba programación sin el uso de GOTO. Este debate estaba
estrechamente relacionado con el diseño del lenguaje: algunos lenguajes no
incluían GOTO, lo que obligó a la programación estructurada en el programador.
Aunque el debate se recrudecía acaloradamente en ese momento, casi todos los
programadores están de acuerdo en que, incluso en lenguajes que ofrecen GOTO,
es una mala práctica de programación usarlo, excepto en raras circunstancias.
Como resultado de ello, las generaciones posteriores de diseñadores de
lenguajes han encontrado el debate sobre programación estructurada tedioso e
incluso desconcertante.
Algunos lenguajes importantes que se desarrollaron
en este período fueron:
1968 - Logo
1969 - B (precursor C)
1970 - Pascal
1970 - Forth
1972 - C
1972 - Smalltalk
1972 - Prolog
1973 - ML
1975 - Scheme
1978 - SQL (inicialmente sólo un lenguaje de
consulta, posteriormente ampliado con construcciones de programación)
La década de 1980: consolidación, módulos, rendimiento
La década de 1980 fueron años de consolidación
relativa en los lenguajes imperativos. En vez de inventar nuevos paradigmas, se
comenzó a trabajar a partir de las ideas inventadas en la década anterior. C++
combinaba la programación orientada a objetos y la programación de sistemas. El
gobierno de Estados Unidos estandarizó Ada, un lenguaje de programación de
sistemas destinado a ser utilizado por contratistas de defensa. En Japón y en
otras partes, se gastaron enormes sumas investigando los llamados lenguajes de
programación de quinta generación que incorporaban construcciones de la
programación lógica. La comunidad de los lenguajes funcionales llevaron a cabo
la estandarización de ML y Lisp. La investigación en Miranda, un lenguaje
funcional, con evaluación perezosa, comenzó a tomar fuerza en esta década.
Una nueva tendencia importante en el diseño de
lenguajes era un mayor enfoque en la programación de sistemas a gran escala a
través del uso de módulos, una organización a gran escala de unidades de
código. Modula, Ada, y ML desarrollaron sistemas de módulos notables en la
década de 1980. Los sistemas de módulos eran relacionados con frecuencia con
construcciones de programación genéricas, que serían, en esencia, módulos
parametrizados (véase también polimorfismo en programación orientada a
objetos).
Aunque no aparecían nuevos paradigmas de lenguajes
de programación imperativos, muchos investigadores expandieron las ideas de los
lenguajes anteriores y las adaptaron a nuevos contextos. Por ejemplo, los
lenguajes de los sistemas Argus y Emerald adaptaron la programación orientada a
objetos para sistemas distribuidos.
La década de 1980 también trajo avances en la
implementación de lenguajes de programación. El movimiento de RISC en la
arquitectura de computadoras postulaba que el hardware debía estar diseñado
para los compiladores más que para los programadores de ensamblador humanos.
Con la ayuda de las mejoras en la velocidad del procesador, permitiendo
técnicas de compilación cada vez más agresivas, el movimiento RISC despertó un
mayor interés en la tecnología de compilación de los lenguajes de alto nivel.
Las tecnologías de los lenguajes continuaron sobre estas líneas entrando en la década de 1990.
Algunos lenguajes importantes que se desarrollaron
en este período son:
1980 - C++ (C con clases, el nombre cambió en Julio
de 1983)
1983 - Ada
1984 - Common
Lisp
1984 - MATLAB
1985 - Eiffel
1986 -
Objective-C
1986 - Erlang
1987 - Perl
1988 - Tcl
1988 -
Mathematica
1989 - FL
(Backus);
La década de 1990: la era de Internet
El rápido crecimiento de Internet en la década de
1990 fue el siguiente gran acontecimiento histórico para los lenguajes de
programación. Con la apertura de una plataforma totalmente nueva para los
sistemas informáticos, Internet creó una oportunidad adoptar nuevos lenguajes.
En particular, el lenguaje de programación Java se hizo popular debido a su
pronta integración con el navegador web Netscape Navigator, y varios lenguajes
de scripting alcanzaron un amplio uso en el desarrollo de aplicaciones personalizadas
para servidores web. La década de 1990 no vio ninguna novedad fundamental en
los lenguajes imperativos, pero sí mucha recombinación y la maduración de
viejas ideas. Esta era comenzó la difusión de los lenguajes funcionales.
Una
filosofía de conducción grande era la productividad del programador. Surgieron
muchos lenguajes de “aplicaciones de desarrollo rápido” (RAD), los cuales
usualmente venían con un IDE, recolector de basura, y eran descendientes de
lenguajes anteriores.
Todos estos lenguajes eran orientados a objeto. Estos
incluían Object Pascal, Visual Basic y Java. Java, en particular, recibió mucha
atención. Pero más radicales e innovadores que los lenguajes de RAD eran los
nuevos lenguajes de script. Estos no descendían directamente de otros lenguajes
y ofrecieron nuevas sintaxis e incorporación más liberal de otras
características. Muchos consideran estos lenguajes de script más productivos
que los lenguajes de RAD, aunque esto se debe a menudo a que es más difícil
escribir y mantener largos programas que pequeños programas simples. Sin
embargo, no es menos cierto que los programas de script llegaron para
convertirse en los más prominentes en la conexión con la Web.
Algunos lenguajes importantes que se desarrollaron
en este período son:
1990 - Haskell
1991 - Python
1991 - Visual Basic
1991 - HTML (lenguaje de marcado de hipertexto)
1993 - Ruby
1993 - Lua
1994 - CLOS (parte del ANSI Common Lisp)
1995 - Java
1995 - Delphi
(Object Pascal)
1995 -
JavaScript
1995 - PHP
1996 - WebDNA
1997 - Rebol
1999 - D
Tendencias actuales
La evolución de los lenguajes de programación
continúa, tanto en la industria como en investigación. Algunas de las
tendencias actuales incluyen:
Aumentar el soporte para la programación funcional
en lenguajes importantes utilizados comercialmente, incluida la programación
funcional pura para hacer el código más fácil de razonar y de paralelizar.
Construir lenguajes para apoyar la programación
concurrente y distribuida.
Mecanismos para añadir al lenguaje verificación en
cuanto a seguridad y confiabilidad:
chequeo sintáctico extendido, control de
flujo de información, seguridad de hilos.
Mecanismos alternativos de modularidad: mixins,
delegados, aspectos.
Desarrollo de software orientado a componentes.
Metaprogramación, la reflexión o el acceso al árbol
de sintaxis abstracta.
Mayor énfasis en cuanto a distribución y movilidad.
Integración con bases de datos, incluyendo XML y
bases de datos relacionales.
Soporte para Unicode para que el código fuente
(texto del programa) no se limite sólo a los caracteres contenidos en el
conjunto de caracteres ASCII, permitiendo, por ejemplo, el uso de caracteres no
latinos basados en guiones o signos de puntuación extendidos.
XML para interfaz gráfica (XUL, XAML).
El código abierto como una filosofía de desarrollo
de lenguajes, incluyendo la colección de compiladores de GNU y lenguajes
recientes, como Python, Ruby, y Squeak.
Programación Orientada a Aspectos (AOP).
Lenguajes que soporten programar sobre los
procesadores de la GPU en paralelo, como OpenCL.
Algunos lenguajes importantes desarrollados durante
este período incluyen:
2000 -
ActionScript
2001 - C#
2001 - Visual
Basic .NET
2002 - F#
2003 - Groovy
2003 - Scala
2003 - Factor
2007 - Clojure
2009 - Go
2011 - Dart
No hay comentarios:
Publicar un comentario