Saltar al contenido

LDP | §1.2 - Lenguajes informáticos

§1.1 Introducción

En la introducción hemos ya presentado la idea de que no todos los lenguajes de computadora o lenguajes informáticos son lenguajes de programación. En este capítulo intentaremos precisar estas nociones.

Un lenguaje informático es un "idioma formal" creado expresamente para describir información de una manera práctica, apta para el proceso por parte de una computadora o sistema informático, y al mismo tiempo con cierto grado de legibilidad para un ser humano.

Es decir, un lenguaje de este tipo es un idioma sintético creado con el doble propósito de ser apropiado para su lectura y proceso para una computadora, pero también debe ser entendible para una persona. En la práctica estos lenguajes se materializan como un texto en el que se emplean un conjunto de palabras (vocabulario) con un significado muy preciso (semántica), articuladas según reglas bien definidas (sintaxis). Esta analogía con un idioma humano normal es el que derivó en el uso de la palabra lenguaje[1] para este tipo de descripción.

No todos los lenguajes informáticos tienen la capacidad de expresar algoritmos. Aquéllos que la tienen son un subconjunto al que llamamos lenguajes de programación:

Un lenguaje de programación es un lenguaje informático capaz de expresar un algoritmo.

Históricamente, los primeros lenguajes fueron en realidad de programación, ya que surgieron como una comodidad para la programación de las primitivas computadoras, construidas expresamente para resolver problemas mediante algoritmos.

Posteriormente fue apareciendo la necesidad de presentar o intercambiar información de manera puramente descriptiva, sin estar asociada directamente con ningún algoritmo particular. Para esta aplicación se concibieron lenguajes que podríamos llamar de descripción:

Un lenguaje de descripción es un lenguaje creado para expresar información estructurada, sin relación con (o sin especificar) algoritmo alguno, a través de un documento que emplea la sintaxis y semántica indicada por el lenguaje.

Fue algún tiempo después cuando se desarrolló su estudio formal, y con él su diferenciación y clasificación.

Evolución de los lenguajes de programación

Dada su estrecha vinculación con los equipos de cómputo para los cuales fueron concebidos, los lenguajes de programación estuvieron atados por un tiempo a la evolución de aquéllos. Comienza con una etapa "prehistórica", donde las primeras computadoras se programaban manipulando directamente sus circuitos, y paulatinamente dio paso a sistemas cuya configuración podía ser leída externamente. Aquí surge por primera vez el concepto de "programa" como lo entendemos hoy, es decir, una descripción que existe fuera de la máquina pero con la cual está íntimamente relacionada, lo que derivó en el término software (insumos "no materiales") como contraste con hardware (Insumos materiales) con los cuales una computadora se construye.

Podemos rastrear a grandes rasgos la evolución de los lenguajes de programación a través de diferentes etapas o generaciones:

  • Lenguajes de primera generación: Las máquinas cuentan con una serie de operaciones identificadas con un código numérico binario (por ejemplo, 01 = suma, 11 = resta, 00 = leer un dato, etc), por lo cual estos primeros lenguajes no son más que una sucesión de códigos binarios que representan las operaciones y datos que forman el programa. Este tipo de programación en bajo nivel es la que produce los programas más eficientes en términos de velocidad de ejecución, pero son difíciles de aprender y escribir para un operador humano. Además son muy específicos del equipo, y por lo tanto no es sencillo "traducir" (portar) un programa de este tipo a un hardware diferente.
  • Lenguajes de segunda generación: En un primer paso para "alejarnos" del hardware, estos lenguajes reemplazan los códigos binarios por abreviaturas textuales llamadas nemónicos (por ejemplo ADD para la suma), lo que permite por un lado analizar más fácilmente un programa, y por otro traducir directamente esta serie de símbolos en los códigos binarios equivalentes, proceso que se conoce como ensamblado (assembly). Por esta razón, estos lenguajes también se llaman de ensamblador (assembly languages).

Las dos generaciones anteriores se consideran lenguajes de bajo nivel, ya que están basados directamente en la máquina. Los que siguen, por buscar operar "por encima" y, en la medida de lo posible, abstraerse del hardware específico, se consideran lenguajes de alto nivel.

  • Lenguajes de tercera generación: Los lenguajes de esta categoría son los primeros en lograr cierta abstracción del hardware subyacente, y a diferencia de los anteriores, están diseñados para favorecer el trabajo del programador ofreciéndole ciertas facilidades orientadas más a la expresión de un algoritmo que a las particularidades de la computadora donde el programa resultante deba correr. Esta característica trajo la necesidad de crear a su vez programas capaces de leer un programa escrito en este tipo de lenguaje para convertirlo en los códigos binarios que el equipo entiende, proceso que se denomina compilar, y así los programas que lo realizan se llaman compiladores (compilers). La ventaja de esta estrategia, al menos del punto de vista teórico, es que contando con un compilador para cada tipo de hardware es posible escribir programas que potencialmente puedan ejecutarse en una variedad de sistemas. Los primeros lenguajes populares como FORTRAN, C, ALGOL, COBOL, BASIC y otros pertenecen a esta generación.
    Para ciertos lenguajes de este tipo, también existe la posibilidad de traducir y ejecutar un programa en tiempo real, a medida que se lee el texto del programa. Estos lenguajes se llaman interpretados, y su ejecución requiere el uso de un intérprete (interpreters). Ejemplos actuales de este tipo de lenguajes son Javascript, Python, Pearl y VBScript, entre otros.
  • Lenguajes de cuarta generación: Mientras los lenguajes de la generación precedente apuntaban a la expresión de cualquier tipo de algoritmo, por eso llamados también lenguajes de propósito general o GPL (general purpose languages), el siguiente paso fue crear lenguajes diseñados para problemas específicos. A principios de los '70, la idea general partía de la suposición que sería "màs sencillo para un experto en un área de conocimiento usar un lenguaje de alto nivel para expresar un algoritmo propio de esa área, que volver experto a un programador de un lenguaje estándar". Estos lenguajes en principio abandonan el modelo "procedural" de las generaciones previas, que hacen hincapié en describir las tareas que deben ejecutarse, para pensar en descripciones "de alto nivel", donde el programador se concentra más en lo que quiere obtener que en cómo obtenerlo. Lenguajes típicos de esta era incluyen los creados para el manejo de bases de datos como SQL, especializados en matemática como MATLAB, etc.
  • Lenguajes de quinta generación: El objetivo de estos lenguajes es "omitir al programador" y permitir la descripición del problema como una serie de hechos y condiciones que la solución debe satisfacer, en lugar de decirle a la máquina cómo debe ser resuelto. En la década de 1980 esta idea cobró mucha fuerza y varios países, con Japón a la cabeza, pensaron que el futuro estaba en tipo de lenguajes, corriendo en máquinas especialmente construídas para ellos. La realidad es que esta estrategia probó ser poco eficiente para problemas complejos, de manera que aún hoy no tenemos un lenguaje que funcione como un "resolvedor de problemas universal". De todas formas, estos lenguajes encontraron un ámbito de aplicación en las investigaciones de inteligencia artificial. El mejor y más famoso ejemplo de esta generación es Prolog.

La inmensa mayoría de los desarrollos actuales dependen de lenguajes de tercera y cuarta generación, aunque los límites entre ellos no están siempre tan claramente demarcados. Cada nuevo lenguaje que se crea (y se inventan miles todos los años) hace uso de todas las características que el autor considere útiil a su propósito, sin intención de que el lenguaje así creado se ajuste a esta descripción histórica.

§1.3 Clasificación elemental de lenguajes informáticos >

1 El término inglés language, originalmente empleado en la literatura de origen, debería traducirse normalmente a idioma. Es muy probable que la introducción del término lenguaje en la literatura en español haya sido una apresurada traducción basada solamente en el parecido entre ambos términos.