Programación en Ada/Texto completo

De Wikilibros, la colección de libros de texto de contenido libre.

Esta es la versión para imprimir de Programación en Ada.
  • Si imprimes esta página, o eliges la opción de Vista preliminar de impresión de tu navegador, verás que desaparecen este cuadro y los elementos de navegación de arriba y de la izquierda, pues no son útiles en una versión impresa.
  • Pulsando antes en Refrescar esta página te asegurarás de obtener los últimos cambios del libro antes de imprimirlo.
  • Para más información, puedes ver Wikilibros:Versión para imprimir.


Logotipo

Tabla de contenidos


Programación en Ada

Prólogo

El objetivo de este libro es aprender a programar en el lenguaje Ada, desde sus características más sencillas hasta las más avanzadas. Ada es un lenguaje potente, pero no por ello es más complicado que Pascal, por poner un ejemplo.

Los prerrequisitos son: nociones generales de programación y experiencia en otro lenguaje. Aunque si aún no se sabe programar se puede complementar con la lectura de otro manual destinado a ello.

Hay dos maneras de leer este libro. Una es desde el principio hasta el final, siguiendo el orden establecido en el índice y en los encabezados de cada sección. Otra es utilizar los enlaces libremente para saltar a los temas de interés elegidos por el lector.

Acerca de este libro

Este manual que se está editando ahora en Wikilibros, deriva del libro escrito por José Alfonso Malo Romero, antiguo profesor de la Universidad de Alcalá, para sus clases. Esa versión ya estaba licenciada según la GFDL, la misma licencia que usamos en Wikilibros, y se puede encontrar en varios formatos en MicroAlcarria.

El estado actual de desarrollo es: Grado de desarrollo: 75% (a fecha de 2 jun 2005), lo que indica que aún hay trabajo por hacer. Recuerda que esto es un wiki: estás invitado a colaborar en la escritura de este libro. Es fácil, lee la bienvenida a los nuevos autores.

Si no quieres o no puedes contribuir pero quieres hacer sugerencias, como qué capítulos te gustaría ver más desarrollados o qué tema echas de menos, puedes hacerlo en la página de discusión.


Créditos y licencia

Los autores de «Programación en Ada» son:

Si quieres colaborar, sigue los consejos de «Cómo colaborar». Cuando hayas contribuido a la escritura del libro, añade tu nombre a la lista de autores.


GNU Heckert Se autoriza la copia, la distribución y la modificación de este documento bajo los términos de la licencia de documentación libre GNU, versión 1.2 o cualquier otra que posteriormente publique la Fundación del Software Libre (Free Software Fundation); sin secciones invariantes (Unvariant Sections), textos de portada (Front-Cover Texts), ni textos de contraportada (Back-Cover Texts).

Se incluye una copia en inglés de esta licencia en el artículo Text of the GNU Free Documentation License.

Introducción

← Contenido Texto completo Historia →


La programación de computadores, esto es, la creación de software para ellos, es un proceso de escritura. Así como los escritores de libros y artículos de revistas, los programadores (escritores de programas) deben expresar sus ideas por medio de una lengua escrita. Sin embargo, a diferencia de los escritores de novelas, los programadores deben expresar sus textos en lenguajes de propósito especial, basados en las matemáticas, conocidos como lenguajes de programación.

Ada, es uno de entre muchos posibles lenguajes de programación. Fue diseñado con un claro propósito en mente: la calidad del producto. Entendiéndose por calidad, la confianza que los usuarios van a poder depositar en el programa.

Si bien es posible escribir cualquier programa en Ada, éste ha sido utilizado principalmente, en el desarrollo de software de control, de tiempo real y de misión crítica. Típicamente, estos sistemas son responsables de procesos industriales y militares, muy costosos, y en los cuales incluso vidas humanas dependen del buen funcionamiento del software. Es vital en tales sistemas, utilizar un lenguaje que como Ada, ayuda en la creación de software de alta calidad.

Por otro lado, Ada, como lenguaje que promueve las buenas prácticas en ingeniería del software, es muy usado en la enseñanza de la programación en muchas universidades de todo el mundo.

Veamos cuáles son las características más destacables del lenguaje.

Características principales

Legibilidad 
Los programas profesionales se leen muchas más veces de las que se escriben, por tanto, conviene evitar una notación que permita escribir el programa fácilmente, pero que sea difícil leerlo excepto, quizás, por el autor original y no mucho tiempo después de escribirlo.
Tipado fuerte 
Esto asegura que todo objeto tenga un conjunto de valores que esté claramente definido e impide la confusión entre conceptos lógicamente distintos. Como consecuencia, el compilador detecta más errores que en otros lenguajes.
Construcción de grandes programas 
Se necesitan mecanismos de encapsulado para compilar separadamente y para gestionar bibliotecas de cara a crear programas transportables y mantenibles de cualquier tamaño.
Manejo de excepciones 
Los programas reales raramente son totalmente correctos. Es necesario proporcionar medios para que el programa se pueda construir en capas y por partes, de tal forma que se puedan limitar las consecuencias de los errores que se presenten en cualquiera de las partes.
Abstracción de datos 
Se puede obtener mayor transportabilidad y mejor mantenimiento si se pueden separar los detalles de la representación de los datos y las especificaciones de las operaciones lógicas sobre los mismos.
Procesamiento paralelo 
Para muchas aplicaciones es importante que el programa se pueda implementar como una serie de actividades paralelas. Dotando al lenguaje de estos mecanismos, se evita tener que añadirlos por medio de llamadas al sistema operativo, con lo que se consigue mayor transportabilidad y fiabilidad.
Unidades genéricas 
En muchos casos, la lógica de parte de un programa es independiente de los tipos de los valores que estén siendo manipulados. Para ello, se necesita un mecanismo que permita la creación de piezas de programa similares a partir de un único original. Esto es especialmente útil para la creación de bibliotecas.

Historia

← Introducción Historia Manual de referencia →
Gráfico de la historia de los lenguajes de programación. Las flechas indican relaciones de influyó a
Gráfico de la historia de los lenguajes de programación. Las flechas indican relaciones de influyó a

La historia de Ada comienza en 1974 cuando el Ministerio de Defensa de los Estados Unidos llevó a cabo un estudio de los lenguajes de programación utilizados en sus proyectos y concluyó que COBOL era un estándar para procesado de datos y FORTRAN para cálculo científico. Sin embargo, la situación con respecto a los sistemas empotrados era diferente: el número de lenguajes en uso era enorme. Ante esta falta de estandarización que provocaba gastos inútiles, se propuso el uso de un único lenguaje para estos sistemas.

El primer paso del desarrollo fue la redacción en 1975 de un documento que perfilaba los requisitos que debía satisfacer el lenguaje. Después de varias modificaciones, en 1976 se produjo una versión de la que ningún lenguaje existente cumplía todos sus requisitos, así pues, el paso siguiente fue la aceptación de propuestas de diversos contratistas, de los que se eligieron cuatro de ellos. El siguiente paso fue el refinamiento de las propuestas elegidas y se revisaron las especificaciones para dar la versión definitiva conocida como Steelman.

Ada Lovelace (1838)
Ada Lovelace (1838)

La elección final del lenguaje se hizo en 1979 cuando se declaró vencedor el desarrollo de CII Honeywell Bull. Se decidió que se llamaría Ada en honor a Augusta Ada Byron, condesa de Lovelace (1815-1852), hija de Lord Byron, quien fue ayudante y patrocinadora de Charles Babbage trabajando en su máquina analítica mecánica, de hecho, está considerada por muchos como el primer programador de la historia.

En 1983 se publicó el primer estándar ISO de Ada, el conocido Manual de referencia de Ada o ARM.

La revisión del lenguaje vino en 1995, marcando las dos versiones que existen hasta el momento: Ada 83 y Ada 95. Actualmente se está trabajando en una próxima versión que se llamará Ada 2005.

Enlaces externos

Más sobre la historia de Ada en:

Manual de referencia

A menudo abreviado ARM o RM, el manual de referencia de Ada (nombre completo: Ada Reference Manual, ISO/IEC 8652:1995(E)), es el estándar del lenguaje. A diferencia de otros documentos oficiales de ISO, el manual de Ada se puede reproducir libremente.

En este libro encontrarás enlaces al manual de referencia en cada sección acabada, en relación con el tema tratado. El ARM es el lugar donde todas las preguntas sobre Ada tienen respuesta, aunque puede ser un texto un tanto árido por su carácter de estándar oficial. En cualquier caso es la fuente más completa y exacta de información.

Otros documentos de cabecera de Ada son los Ada Rationale, documentos que acompañan al estándar y explican las justificaciones en el diseño de Ada 83 y 95.

Manual de Referencia y Rationale en la Web:

Instalación de un compilador

← Manual de referencia Instalación Hola Mundo →


En esta sección explicaremos cómo instalar un compilador de Ada. Existen dos opciones gratuitas:

  • GNAT, compilador libre y gratuito.
  • Versión demo de ObjectAda.

GNAT

Wikipedia
Para más información, véase el artículo GNAT en Wikipedia.

GNAT es el único compilador de Ada gratuito completamente funcional. De hecho es parte del GNU Compiler Collection y por tanto es software libre. Sin embargo, la empresa que lo mantiene AdaCore, ofrece contratos de mantenimiento de las últimas versiones, antes de hacerlas públicas.

GNAT es también el único compilador que implementa todos los anexos (capítulos opcionales) del estándar de Ada.

GNAT GPL Edition: Ada 2005

Esta es la versión pública más reciente de AdaCore. Ten en cuenta que esta versión sólo permite distribuir binarios bajo la licencia GPL (la misma que usa Linux). Como ventaja decir que esta versión tiene soporte de las nuevas características de Ada 2005. Esta es la versión recomendable para estudiantes y profesionales que no necesitan soporte y licencian bajo GPL.

Para profesionales que quieren soporte o vender software bajo su propia licencia, AdaCore vende la edición llamada GNAT Pro.

GNAT GPL Edition se puede descargar de libre.adacore.com.

GNAT 3.15p precompilado

Para los que quieren distribuir binarios bajo una licencia distinta a la GPL y no pueden permitirse comprar una licencia de GNAT Pro lo más recomendable es descargar el paquete precompilado de la versión 3.15p, la última publicada por AdaCore bajo licencia GMGPL. Existen versiones para Windows, GNU/Linux y Solaris.

Aunque la versión precompilada no se ha actualizado recientemente, aún es suficiente para la mayoría de usuarios. Esta versión ha pasado el Ada Conformity Assessment Test Suite.

El Libre Site también proporciona el IDE para GNAT: GPS.

Se recomienda descargar estos paquetes adicionalmente:

Paquetes precompilados formando parte de distribuciones

Existen varias distribuciones que contienen una copia del compilador GNAT, pero como consejo deberías comprobar la vesión de GCC:

gcc --version
gcc (GCC) 3.4.3
Copyright (C) 2004 Free Software Foundation, Inc.

Versiones que comiencen con 3.3. tienen muchos problemas por lo que deberías actualizarla a una vesión 3.4..

Mac OS X

GNAT for Macintosh proporciona una versión de GNAT, integración con Xcode y varios bindings.

Linux

La mayoría de las versiones de Linux vienen con paquetes de GNAT como parte de la distribución de GCC. Estas versiones se pueden usar perfectamente en vez de la versión de Libre Site.

SuSE

Todas las versiones tienen un compilador GNAT incluído. La versión SuSE 9.2 y superiores contienen también paquetes de ASIS, Florist y GLADE.

Se necesitan estos paquetes:

gnat
gnat-runtime

Debian GNU/Linux

En Debian, GNAT se puede instalar con esta orden:

apt-get install gnat

Otros paquetes interesantes para el desarrollo en Ada bajo Debian 3.1 Sarge son:

  • gnat - The GNU Ada 95 compiler
  • ada-mode - Ada mode for GNU Emacs and XEmacs
  • ada-reference-manual - The standard describing the Ada 95 language
  • adabrowse - HTML generator for Ada 95 library unit specifications
  • adacgi - Ada CGI interface
  • asis-programs - Ada Semantic Interface Specification (ASIS) example programs
  • gch - Ada quality & style checker
  • gnade-dev - Develoment files for the GNat Ada Database Environment
  • gnat-3.3 - The GNU Ada compiler
  • gnat-3.4 - The GNU Ada compiler
  • gnat-doc - Documentation for the GNU Ada compiler
  • gnat-gdb - Ada-aware version of GDB
  • gnat-glade - Distributed Systems Annex for GNAT (GNU Ada 95 compiler)
  • gnat-gps - The GNAT Programming System - advanced IDE for C and Ada
  • libadabindx-dev - Ada binding to the X Window System and *tif
  • libadasockets0-dev - bindings for socket services in Ada
  • libasis-3.15p-1-dev - Ada Semantic Interface Specification (ASIS) headers and li braries
  • libaunit-dev - AUnit, a unit testing framework for Ada
  • libaws-dev - Ada Web Server development files
  • libflorist-3.15p-1-dev - POSIX.5 Ada interface to operating system services
  • libgnomeada-2.4 - Ada binding for the Gnome Library
  • libgtkada-2.4 - Ada binding for the GTK library
  • libopentoken-dev - OpenToken lexical analysis library for Ada
  • libtexttools-dev - Ada and C++ library for writing console applications
  • libxmlada1-dev - XML/Ada, a full XML suite for Ada programmers
  • libasis-3.14p-1 - Ada Semantic Interface Specification (ASIS) runtime library
  • libcharles0-dev - Data structure library for Ada95 modelled on the C++ STL

Gentoo GNU/Linux

Bajo Gentoo la instalación de GNAT es muy sencilla gracias al emerge:

emerge gnat

Mandrake

En Mandrake, GNAT se puede instalar con esta orden:

urpmi gnat

Windows

Tanto MinGW para Windows como Cygwin contienen un paquete de GNAT.

MinGW

MinGW - Minimalist GNU for Windows.

Esta lista puede ayudarte a instalarlo:

  1. Instalar MinGW-3.1.0-1.exe.
    1. extraer binutils-2.15.91-20040904-1.tar.gz.
    2. extraer mingw-runtime-3.5.tar.gz.
    3. extraer gcc-core-3.4.2-20040916-1.tar.gz.
    4. extraer gcc-ada-3.4.2-20040916-1.tar.gz.
    5. extraer gcc-g++-3.4.2-20040916-1.tar.gz (opcional).
    6. extraer gcc-g77-3.4.2-20040916-1.tar.gz (opcional).
    7. extraer gcc-java-3.4.2-20040916-1.tar.gz (opcional).
    8. extraer gcc-objc-3.4.2-20040916-1.tar.gz (opcional).
    9. extraer w32api-3.1.tar.gz.
  2. Instalar mingw32-make-3.80.0-3.exe (opcional).
  3. Instalar gdb-5.2.1-1.exe (opcional).
  4. Instalar MSYS-1.0.10.exe (opcional).
  5. Instalar msysDTK-1.0.1.exe (opcional).
    1. extraer msys-automake-1.8.2.tar.bz2 (opcional).
    2. extraer msys-autoconf-2.59.tar.bz2 (opcional).
    3. extraer msys-libtool-1.5.tar.bz2 (opcional).

Se recomienda usar D:\MinGW como directorio de instalación.

Es de notar que la versión para Windows del Libre Site también se basa en MinGW.

Cygwin

Cygwin, el entorno GNU para Windows, también contiene una versión de GNAT, aunque más antigua que la de MinGW, y no soporta DLLs ni multi-tarea (al 11/2004).

MS-DOS

DJGPP es un porte a MS-DOS de una selección de herramientas GNU con extensiones de 32 bits, que está mantenido activamente. Incluye la colección completa de compiladores de GCC, lo cual ahora incluye Ada. Véase el sitio de DJGPP para instrucciones de instalación.

Los programas de DJGPP, a parte de en modo nativo MS-DOS, se pueden ejecutar en ventanas de DOS en Windows.

Solaris 8, 9, 10 sobre SPARC y x86

Descarga GCC de blastwave.org. Es la suite completa con el compilador de GNAT.

Compilarlo uno mismo

Si quieres las últimas características, incluyendo el soporte experimental de Ada 2005, tendrás que compilar tú mismo el GNAT.

Instrucciones:

Aonix ObjectAda

Aonix ObjectAda es un compilador comercial que proporciona una versión gratuita de evaluación, con limitaciones en el número y tamaño de archivos y en el número de controles que se pueden colocar en una ventana.

El IDE de ObjectAda es muy similar al de MS Visual C++ y al de Delphi e incluye un GUI builder.

Enlaces

Un ejemplo básico: Hola Mundo

Un ejemplo común de la sintaxis de un lenguaje es el programa Hola mundo. He aquí una implementación en Ada con la intención de ser un primer contacto.

with Ada.Text_IO;

procedure Hola_Mundo is
begin
   Ada.Text_IO.Put_Line("¡Hola, mundo!");
end Hola_Mundo;

Por ahora puede ser suficiente con aprender a compilar y enlazar un programa escrito en Ada, pero si tienes curiosidad aquí va una explicación del programa.

La cláusula with establece una dependencia con el paquete Ada.Text_IO y hace disponible toda la funcionalidad relacionada con la Entrada/Salida de textos.

Después se define un procedimiento como programa principal. Nótese que en Ada no tiene que tener un nombre especial como main, simplemente ha de estar fuera de cualquier paquete. Al compilar se indica cuál es el programa principal.

Ada.Text_IO.Put_Line llama al procedimiento Put_Line definido en el paquete Ada.Text_IO para imprimir la cadena "¡Hola, mundo!".

Abreviando

Si no deseamos tener sentencias largas, como Ada.Text_IO.Put_Line, se pueden usar dos métodos para abreviar:

  1. Usar una cláusula use para hacer directamente visible todas las entidades definidas en Ada.Text_IO. No es recomendable abusar de esta cláusula por las razones explicadas aquí.
  2. Usar una cláusula renames, para renombrar Ada.Text_IO con un nombre más corto.
-- Con clásula use
with Ada.Text_IO; use Ada.Text_IO;

procedure Hola_Mundo is
begin
   Put_Line("¡Hola, mundo!");
end Hola_Mundo;
-- Con cláusula renames
with Ada.Text_IO; use Ada.Text_IO;

procedure Hola_Mundo is
   package T_IO renames Ada.Text_IO;
begin
   T_IO.Put_Line("¡Hola, mundo!");
end Hola_Mundo;

Compilación

Como ejemplo, con el compilador GNAT este programa se debe escribir en un archivo llamado hola_mundo.adb (el nombre del procedimiento que contiene, más .adb) y se compilaría así:

gnatmake hola_mundo.adb

Naturalmente si usas un entorno integrado de desarrollo la compilación será una opción de menú o un botón de la barra de herramientas.

El resultado es un archivo ejecutable llamado hola_mundo que imprime ¡Hola, mundo! por su salida estándar (normalmente en una ventana en modo texto).

Elementos del lenguaje

← Hola Mundo Elementos del lenguaje Tipos →


Alfabeto

El alfabeto de Ada consta de:

  • Letras mayúsculas: A, ..., Z y minúsculas: a, ..., z.
  • Dígitos: 0, ..., 9.
  • Caracteres especiales.

Es de destacar que en Ada 95 se admiten caracteres como 'Ñ', 'Ç' y vocales acentuadas ya que se permiten los 256 caracteres comprendidos en ISO Latin-1.

El alfabeto de minúsculas puede usarse en vez de o junto con el alfabeto de mayúsculas, pero se considera que los dos son idénticos (a excepción de las cadenas de caracteres y literales tipo carácter).

Componentes léxicos

Se pueden encontrar en Ada los siguientes componentes léxicos:

  • Identificadores
  • Literales numéricos
  • Literales de tipo carácter
  • Cadenas de caracteres
  • Delimitadores
  • Comentarios
  • Palabras reservadas

Hacer constar, que el espacio no constituye nada más que un separador de elementos léxicos, pero es muy importante utilizarlos para una mayor legibilidad, tanto dentro de las sentencias, como elemento de sangrado para ayudar a diferenciar los bloques.

Ejemplo:

Temperatura_Sala := 25;  -- Temperatura que debe tener la sala.

Esta línea contiene 5 elementos léxicos:

  • El identificador Temperatura_Sala
  • El delimitador compuesto :=
  • El número 25
  • El delimitador simple ;
  • El comentario -- Temperatura que debe tener la sala.

Identificadores

Definición en BNF:

identificador ::= letra { [ subrayado ] letra | cifra }
letra ::= A | ... | Z | a | ... | z
cifra ::= 0 | ... | 9
subrayado ::= _

Aunque dentro de esta definición entrarían las palabras reservadas que tienen un significado propio en el lenguaje y, por tanto, no pueden ser utilizadas como identificadores.

Nota: en la versión Ada 95 se incorporan los caracteres de Latin-1, con lo que se pueden escribir identificadores como Año o Diámetro.

No hay límite en el número de caracteres de un identificador, aunque todo identificador deberá caber en una única línea.

consejo
Como en cualquier lenguaje, es recomendable utilizar nombres significativos como Hora_Del_Dia y no H, carente de significado.


ejercicio
Problema: ¿Son identificadores Ada validos estas palabras? En caso negativo, ¿por qué razón? _Hora_Del_Día, Inicio_, Mañana, Hora_Del_Día, Jabalí, contador, 2a_vuelta, ALARMA, Access, Precio_en_$, alarma__general, HoraDelDía.



Números

Los literales numéricos constan de:

  • dígitos 0 .. 9
  • el separador de decimales .
  • el símbolo de exponenciación e o E
  • el símbolo de negativo -
  • el separador _

Como ejemplo, el número real 98,4 se puede representar como: 9.84E1, 98.4e0, 984.0e-1 ó 0.984E+2. No estaría permitido 984e-1.

Para representación de número enteros, por ejemplo 1.900, se puede utilizar 19E2, 190e+1 ó 1_900E+0. Sirviendo el carácter _ como mero separador para una mejor visualización.

Una última característica es la posibilidad de expresar un literal numérico en una base distinta de 10 encerrando el número entre caracteres #, precedido por la base: un número entre 2 y 16. Por ejemplo, 2#101# equivale a 101 en base binaria, es decir al número 5 en decimal. Otro ejemplo con exponente sería 16#B#E2 que es igual a 11 × 16² = 2.816 (nótese que es 16² y no 10² porque la base en este caso es 16).

Literales de tipo carácter

Contienen un único carácter, por ejemplo: A. Aquí sí se diferencian mayúsculas de minúsculas. Se delimitan por un apóstrofe.

Ejemplos:

'A' 'ñ' '%'

Cadenas de caracteres

Contienen uno o varios caracteres y se delimitan por el carácter de dobles comillas: ", por ejemplo: "ABC". En este caso se diferencian mayúsculas de minúsculas.

Delimitadores

Los delimitadores pueden ser uno de los siguientes caracteres especiales:

&    '    (    )    *    +    ,    -    .    /    :    ;    <    =    >    

O ser uno de los delimitadores compuestos por dos caracteres especiales:

=>    ..    **    :=    /=    >=    <=    <<    >>    <>

Comentarios

Los comentarios se utilizan para ayudar a comprender los programas y lo constituye toda parte de texto precedida de dos guiones (--) hasta el fin de línea. No existe la posibilidad de insertar otro elemento léxico en la misma línea a partir de los dos guiones, es decir, el resto de la línea se interpreta como comentario en su totalidad.

-- Este comentario ocupa una línea completa.
Mis_Ahorros := Mis_Ahorros * 10.0; -- Este está después de una sentencia.
Mis_Ahorros := Mis_Ahorros * -- Este está entre medias de una sentencia que ocupa dos líneas.
    100_000_000.0;

Palabras reservadas

Como el resto de los elemento léxicos, las palabras reservadas de Ada son equivalentes tanto en mayúsculas como en minúsculas. El estilo más extendido es escribirlas completamente en minúsculas.

En Ada las palabras reservadas pueden tener un uso distinto dependiendo del contexto, los distintos usos de cada una se puede consultar en el capítulo Palabras reservadas.

abort else new return
abs elsif not reverse
abstract end null
accept entry select
access exception of separate
aliased exit or subtype
all others
and for out tagged
array function task
at package terminate
generic pragma then
begin goto private type
body procedure
if protected until
case in use
constant is raise
range