Programación en Ada/Texto completo
De Wikilibros, la colección de libros de texto de contenido libre.

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:
, 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:
- José Alfonso Malo Romero, por la versión 1.0.1 (2001 - 2002)
- Por la actual versión de es.wikibooks.org (2004-2005):
- Manuel Gómez (Contribuciones)
- Andrés Soliño (Contribuciones)
- Varios autores de «Ada Programming», por ciertos capítulos que han sido traducidos de ese libro (sus historiales así lo indican).
- Alvaro López Ortega, por la versión inicial de Programación en Ada / GLADE [1] (2001).
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.
| 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
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
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.
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:
- Artículo de Wikipedia
- Steelman language requirements
- Steelman On-Line, incluye el artículo "Ada, C, C++, and Java vs. the Steelman"
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
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
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:
- Linux
- ftp://ftp.cs.kuleuven.ac.be/pub/Ada-Belgium/mirrors/gnu-ada/3.15p/gnat-3.15p-i686-pc-redhat71-gnu-bin.tar.gz
- ftp://ftp.cs.kuleuven.ac.be/pub/Ada-Belgium/mirrors/gnu-ada/3.15p/florist-3.15p-src.tgz
- ftp://ftp.cs.kuleuven.ac.be/pub/Ada-Belgium/mirrors/gnu-ada/3.15p/asis/asis-3.15p-src.tgz
- http://libre.adacore.com/gps/gps-2.1.0-academic-x86-linux.tgz
- Windows
- ftp://ftp.cs.kuleuven.ac.be/pub/Ada-Belgium/mirrors/gnu-ada/3.15p/winnt/gnat-3.15p-nt.exe
- ftp://ftp.cs.kuleuven.ac.be/pub/Ada-Belgium/mirrors/gnu-ada/3.15p/winnt/gnatwin-3.15p.exe
- ftp://ftp.cs.kuleuven.ac.be/pub/Ada-Belgium/mirrors/gnu-ada/3.15p/asis/asis-3.15p-src.tgz
- http://libre.adacore.com/gps/gps-2.1.0-academic-x86-windows.exe
- OS/2
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:
- Instalar MinGW-3.1.0-1.exe.
- extraer binutils-2.15.91-20040904-1.tar.gz.
- extraer mingw-runtime-3.5.tar.gz.
- extraer gcc-core-3.4.2-20040916-1.tar.gz.
- extraer gcc-ada-3.4.2-20040916-1.tar.gz.
- extraer gcc-g++-3.4.2-20040916-1.tar.gz (opcional).
- extraer gcc-g77-3.4.2-20040916-1.tar.gz (opcional).
- extraer gcc-java-3.4.2-20040916-1.tar.gz (opcional).
- extraer gcc-objc-3.4.2-20040916-1.tar.gz (opcional).
- extraer w32api-3.1.tar.gz.
- Instalar mingw32-make-3.80.0-3.exe (opcional).
- Instalar gdb-5.2.1-1.exe (opcional).
- Instalar MSYS-1.0.10.exe (opcional).
- Instalar msysDTK-1.0.1.exe (opcional).
- extraer msys-automake-1.8.2.tar.bz2 (opcional).
- extraer msys-autoconf-2.59.tar.bz2 (opcional).
- 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:
- Linux o Cygwin: véase ada.krischik.com.
- Windows: pendiente
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.
withAda.Text_IO;procedureHola_MundoisbeginAda.Text_IO.Put_Line("¡Hola, mundo!");endHola_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:
- 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í.
- Usar una cláusula renames, para renombrar Ada.Text_IO con un nombre más corto.
-- Con clásula usewithAda.Text_IO;useAda.Text_IO;procedureHola_MundoisbeginPut_Line("¡Hola, mundo!");endHola_Mundo;
-- Con cláusula renameswithAda.Text_IO;useAda.Text_IO;procedureHola_MundoispackageT_IOrenamesAda.Text_IO;beginT_IO.Put_Line("¡Hola, mundo!");endHola_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
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.
_Hora_Del_Día: no, porque comienza por guión bajo.
Inicio_: no, porque termina por guión bajo.
Mañana: sí.
Hora_Del_Día: sí.
Jabalí: sí.
contador: sí.
2a_vuelta: no, porque comienza por número.
ALARMA: sí.
Access: no, es una palabra reservada de Ada.
Precio_en_$: no, contiene un carácter ($) que no es letra, cifra ni guión bajo.
alarma__general: no, porque contiene dos guiones bajos seguidos.
HoraDelDía: sí.
Números
Los literales numéricos constan de:
- dígitos
0 .. 9 - el separador de decimales
. - el símbolo de exponenciación
eoE - 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.