ADA

La historia de Ada comienza en 1974 cuando el Departamento de Defensa de los Estados Unidos (DoD) se percató que estaba gastando demasiado en software. Se llevó a cabo un estudio detallado sobre la distribución de los costos y se descubrió que sobre la mitad de éstos estaba directamente relacionado con sistemas incrustados (embedded)
Se realizó un análisis de los lenguajes utilizados en diferentes áreas. Se descubrió que COBOL era el estandar para el procesamiento de datos y FORTRAN lo era para cálculos científicos y numéricos. Aunque estos lenguajes no eran modernos, el hecho que fueran uniformemente utilizados en sus respectivas áreas evitaba duplicaciones.
La situación con respecto a los sistemas incrustados era diferente. La cantidad de lenguajes utilizados era enorme. No sólo cada unidad militar tenía su lenguaje de alto nivel favorito, sino que usaban varios lenguajes assembler. En resultado era que había gastos innecesarios en compiladores y costos adicionales en entrenamiento y mantención debido a la falta de estandarización.
Se determinó que la única forma de controlar efectivamente los costos en los sistemas incrustados era estandarizar el uso de lenguajes de programación. El primer paso en esta dirección fue la generación de un documento en que se delineaban los requerimientos del lenguaje estandar. La primera versión (Strawman) fue publicada en 1975. Después de recibir comentarios de diversas fuentes el documento fue refinado (Woodenman). En junio de 1976 se produjo una nueva versión (Tinman). Este era un documento más específico e identificaba la funcionalidad que se requería del lenguaje.
En esta etapa se evaluaron varios lenguajes existentes respecto a la especificación Tinman. Como se podría esperar ninguno de éstos satisfacía totalmente los requerimientos; por otro lado la impresión general era que sería necesario crear un nuevo lenguaje basado en conceptos de vanguardia en el área de la programación.
Los lenguajes existentes fueron clasificados en tres categorías:

    1. “no apropiados”: Lenguajes obsoletos u orientados a otras áreas que no fueron considerados en las etapas siguientes. Por ejemplo, FORTRAN y  CORAL 66.
    2. “no inapropiados”: Estos lenguajes tampoco eran satisfactorios, pero tenían algunas características interesantes que podían ser tomadas como “inspiración” para enriquecer el estandar. Por ejemplo,  RTL/2 y LIS.
    3. “bases recomendadas”: Los lenguajes Pascal, PL/I y Algol 68 fueron considerados como posibles puntos de partida para el diseño del lenguaje final.

En este punto el documento de requerimientos fue revisado y reorganizado (Ironman). Se llamó a propuestas para el diseño del lenguaje. Se recibieron diecisiete propuestas de las cuales se eligieron tres para que “compitieran” en paralelo. Los cuatro elegidos fueron CII Honeywell Bull (verde), Intermetrics (Rojo), Softech (Azul) y SRI International (Amarillo). Los códigos de color se introdujeron para que la comparación se realizara anónimamente.
Los diseños iniciales aparecieron a comienzos de 1978 y fueron analizados por varios grupos alrededor del mundo. El DoD juzgó que los diseños Verde y Rojo eran más promisorios que los Azul y Amarillo y éstos últimos fueron eliminados.
Entonces, el desarrollo entró en una segunda fase y se dio a los desarrolladores un año más para refinar sus diseños. Los requerimientos también fueron mejorados a la luz de la retroalimentación recibida de los diseños iniciales (Steelman).
La elección final del lenguaje fue hecha el 2 de mayo de 1979 cuando el “lenguaje verde” desarrollado en CII Honeywell Bull por un equipo internacional liderado por Jean Ichbiah fue declarado ganador.
Entonces el DoD anunció que el nuevo lenguaje sería conocido como Ada en honor de Augusta Ada Byron, condesa de Lovelace (1815-1852). Ada, hija de Lord Byron, fue la asistente y mecenas de Charles Babbage y trabajó en su “máquina analítica”. En un cierto sentido ella fue la primera programadora de la historia.
Entonces el desarrollo de Ada entró a una tercera etapa, el propósito de la cual fue el que los eventuales usuarios hicieran sus comentarios respecto a que tan conveniente era el lenguaje para sus necesidades. Se continuó con otros estudios de los que se concluyó que Ada era un buen lenguaje, pero que en algunas áreas todavía se requerían algunos refinamientos.  Después de esto (en julio de 1980) se publicó la primera versión definitiva del lenguaje y se la propuso a la ANSI (America National Standards Institute) como un estandar.
La estandarización por parte de ANSI tomó unos dos años y se le introdujeron algunos cambios a Ada. El Manual de Referencia del Lenguaje estandar de la ANSI fue finalmente publicado en enero de 1983. A esta versión del lenguaje se le conoce como Ada 83.
Tan pronto como se comenzó a utilizar el lenguaje se iniciaron los estudios para su mejora basada en la experiencia práctica de los usuarios con el lenguaje. A la nueva versión se le denominó Ada 9X, entre las principales mejoras hechas sobre la anterior se cuenta la incorporación de mecanismo de herencia en el manejo de tipos con que contaba Ada 83, el cual, a pesar de ser muy poderoso, al carecer de herencia herencia no se adecuaba al paradigma de Orientación a Objetos. A esta segunda versión de Ada se denomina actualmente como Ada 95.

Ada es un lenguaje grande en la medida que enfrenta la mayoría de los aspectos relevantes a la programación de sistemas prácticos en el mundo real. Por ejemplo, es mucho más grande que Pascal, el que a pesar de sus extensiones realmente sólo es adecuado para propósitos de entrenamiento (para lo que fue diseñado) y para programas pequeños. A continuación se enumeran las principales características de Ada:

  1. Legibilidad: se reconoce que los programas profesionales se leen con mayor frecuencia de lo que son escritos. Por lo tanto es importante evitar una notación lacónica como en C, que permite escribir un programa rápidamente, pero que hace casi imposible entenderlo, excepto para el autor al poco tiempo de haberlo escrito.
  2. Tipificación fuerte: esto asegura que cada objeto tiene un conjunto claramente definido de posibles valores y previene la confusión entre conceptos lógicamente distintos. Como consecuencia de esto, muchos errores pueden ser detectados en tiempo de compilación, en otros lenguajes esto podría conducir a programas ejecutables, pero incorrectos.
  3. Programación en gran escala: se necesitan mecanismos de encapsulación, compilación separada y manejo de bibliotecas para escribir  programas portables y  mantenibles.
  4. Manejo de excepciones: es un hecho que los programas raramente son correctos en un cien por ciento. Por este motivo se hace necesario proveer un medio por el cual los programas puedan ser construidos de forma tal que los errores en una parte de éste no repercutan  en las demás.
  5. Abstracción de datos: como ya se ha mencionado, se puede lograr mayor portabilidad y mantenibilidad si los detalles de la representación de los datos puede ser separada de la especificación de las operaciones lógicas sobre los datos.
  6. Tareas: en muchos casos es importante que el programa sea concebido como una serie de actividades paralelas en lugar de una secuencia simple de acciones. Al entregar estas facilidades dentro del lenguaje y no a través de llamadas a un sistema operativo  se  logra  una  mayor portabilidad y mantenibilidad.
  7. Unidades genéricas: es muchos casos la parte lógica de un programa es independiente de los tipos de valores que son manipulados. Por lo tanto se requiere de un mecanismo para la creación de partes lógicamente relacionadas a partir de un prototipo único. Esto es especialmente útil para la creación de bibliotecas.

Tareas en ADA

El último tema principal a ser introducido es tareas. Esto ha sido dejado para el final, no porque no sea importante, pero si porque, aparte de la interacción con excepciones, es una parte bastante independiente dentro del lenguaje.

Excepciones en ADA

Una excepción es una situación que requiere de un tratamiento especial que escapa al funcionamiento normal de un programa (o parte de él). En los capítulos anteriores varias veces se ha indicado que si ocurre un error durante la ejecución de un programa se origina una excepción (generalmente CONSTRAIN _ERROR). En este capítulo se describirá …

Excepciones en ADA Leer más »

Subprogramas en ADA

En Ada existen dos tipos de subprogramas: funciones y procedimientos. Las funciones retornan un valor y son usadas en expresiones, mientras que los procedimientos no retornan valor y son llamados como instrucciones. Las acciones a realizar en un subprograma se describen dentro de lo que se denomina “cuerpo del subprograma”, el que es declarado de …

Subprogramas en ADA Leer más »

Tipos escalares en ADA

En este capítulo se echan las bases de los aspectos a pequeñas escala de Ada. Se comienza con la declaración de objetos, la asignación de valores a ellos y las idea de rango de validez y visibilidad.Se introducen los importantes conceptos de tipo, subtipos y restricciones.

Léxico del lenguaje de programación ADA

Ciertamente no es muy agradable comenzar el estudio de un lenguaje con un tema tan árido como son los detalles de la construcción de cosas tales como identificadores y números, sin embargo ello es esencial para un conocimiento acabado de un lenguaje y, obviamente, para la correcta construcción de programas.