Paradigma | Multiparadigma : estructurado , imperativo , orientado a objetos , orientado a aspectos , [1] concurrente , matriz , distribuido , genérico , procedimental , meta |
---|---|
Familia | Pascal |
Diseñado por |
|
Apareció por primera vez | Febrero de 1980 ( 1980-02 ) |
Versión estable | Ada 2022 / Mayo 2023 |
Disciplina de mecanografía | estático , fuerte , seguro , nominal |
Sistema operativo | Multiplataforma o multiplataforma |
Extensiones de nombre de archivo | .adb, .ads |
Sitio web | www.adaic.org |
Implementaciones principales | |
AdaCore GNAT , [2] compilador optimizado Ada 95 de Green Hills Software , PTC ApexAda y ObjectAda, [3] cambiador Ada-C/C++ de MapuSoft, [4] anteriormente conocido como "AdaMagic con C Intermediate", [5] puntuación DDC-I | |
Dialectos | |
SPARK , perfil de Ravenscar | |
Influenciado por | |
ALGOL 68 , Pascal , Simula 67 , [6] C++ (Ada 95), Smalltalk (Ada 95), Modula-2 (Ada 95) Java (Ada 2005), Eiffel (Ada 2012) | |
Influenciado | |
C++ , Chapel , [7] Drago, [8] D , Eiffel , Griffin, [9] Java , Nim , ParaSail , PL/SQL , PL/pgSQL , Python , Ruby , Seed7 , SPARforte, [10] Sparkel , SQL/PSM , VHDL | |
Ada es un lenguaje de programación de alto nivel estructurado , de tipado estático , imperativo y orientado a objetos , inspirado en Pascal y otros lenguajes. Tiene soporte de lenguaje integrado para diseño por contrato (DbC), tipado extremadamente fuerte , concurrencia explícita, tareas, paso de mensajes sincrónico, objetos protegidos y no determinismo . Ada mejora la seguridad y la capacidad de mantenimiento del código al usar el compilador para encontrar errores en favor de los errores de tiempo de ejecución . Ada es un estándar técnico internacional , definido conjuntamente por la Organización Internacional de Normalización (ISO) y la Comisión Electrotécnica Internacional (IEC). A partir de mayo de 2023 , el estándar, llamado Ada 2022 informalmente, es ISO/IEC 8652:2023. [11] [actualizar]
Ada fue diseñado originalmente por un equipo dirigido por el científico informático francés Jean Ichbiah de Honeywell bajo contrato con el Departamento de Defensa de los Estados Unidos (DoD) de 1977 a 1983 para reemplazar a más de 450 lenguajes de programación utilizados por el DoD en ese momento. [12] Ada recibió su nombre en honor a Ada Lovelace (1815-1852), a quien se le atribuye el mérito de ser la primera programadora de computadoras. [13]
Ada fue diseñado originalmente para sistemas embebidos y en tiempo real . La revisión Ada 95, diseñada por S. Tucker Taft de Intermetrics entre 1992 y 1995, mejoró el soporte para sistemas, programación numérica, financiera y orientada a objetos (OOP).
Las características de Ada incluyen: tipado fuerte , mecanismos de programación modular (paquetes), verificación en tiempo de ejecución , procesamiento paralelo ( tareas , paso de mensajes sincrónicos , objetos protegidos y sentencias select no deterministas ), manejo de excepciones y genéricos . Ada 95 agregó soporte para programación orientada a objetos , incluido el envío dinámico .
La sintaxis de Ada minimiza las opciones de formas de realizar operaciones básicas y prefiere palabras clave en inglés (como "or else" y "and then") a símbolos (como "||" y "&&"). Ada utiliza los operadores aritméticos básicos "+", "-", "*" y "/", pero evita utilizar otros símbolos. Los bloques de código están delimitados por palabras como "declare", "begin" y "end", donde el "end" (en la mayoría de los casos) es seguido por el identificador del bloque que cierra (por ejemplo, if ... end if , loop ... end loop ). En el caso de bloques condicionales, esto evita un else pendiente que podría emparejarse con la expresión if anidada incorrecta en otros lenguajes como C o Java.
Ada está diseñado para desarrollar sistemas de software muy grandes. Los paquetes de Ada se pueden compilar por separado. Las especificaciones de los paquetes de Ada (la interfaz del paquete) también se pueden compilar por separado sin la implementación para comprobar la coherencia. Esto permite detectar problemas en una fase temprana del diseño, antes de que comience la implementación.
Se admite una gran cantidad de comprobaciones en tiempo de compilación para ayudar a evitar errores que no serían detectables hasta el tiempo de ejecución en algunos otros lenguajes o que requerirían que se agregaran comprobaciones explícitas al código fuente. Por ejemplo, la sintaxis requiere el cierre explícito de los bloques para evitar errores debido a tokens finales no coincidentes. La adherencia a la tipificación fuerte permite detectar muchos errores de software comunes (parámetros erróneos, violaciones de rango, referencias no válidas, tipos no coincidentes, etc.) ya sea durante el tiempo de compilación o durante el tiempo de ejecución. Como la concurrencia es parte de la especificación del lenguaje, el compilador puede, en algunos casos, detectar posibles bloqueos. [14] Los compiladores también suelen comprobar identificadores mal escritos , visibilidad de paquetes, declaraciones redundantes, etc. y pueden proporcionar advertencias y sugerencias útiles sobre cómo corregir el error.
Ada también admite comprobaciones en tiempo de ejecución para proteger contra el acceso a memoria no asignada, errores de desbordamiento de búfer , violaciones de rango, errores de uno por uno , errores de acceso a matriz y otros errores detectables. Estas comprobaciones se pueden deshabilitar en beneficio de la eficiencia en tiempo de ejecución, pero a menudo se pueden compilar de manera eficiente. También incluye funciones para ayudar a la verificación del programa . Por estas razones, Ada a veces se utiliza en sistemas críticos, donde cualquier anomalía puede conducir a consecuencias muy graves, por ejemplo, muerte accidental, lesiones o pérdidas financieras graves. Ejemplos de sistemas donde se utiliza Ada incluyen aviónica , control de tráfico aéreo , ferrocarriles , banca, tecnología militar y espacial . [15] [16]
La gestión dinámica de memoria de Ada es de alto nivel y de tipo seguro. Ada no tiene punteros genéricos o sin tipo ; ni declara implícitamente ningún tipo de puntero. En cambio, toda la asignación y desasignación de memoria dinámica debe ocurrir a través de tipos de acceso declarados explícitamente . Cada tipo de acceso tiene un grupo de almacenamiento asociado que maneja los detalles de bajo nivel de la gestión de memoria; el programador puede usar el grupo de almacenamiento predeterminado o definir nuevos (esto es particularmente relevante para el acceso a memoria no uniforme ). Incluso es posible declarar varios tipos de acceso diferentes que designan todos el mismo tipo pero usan diferentes grupos de almacenamiento. Además, el lenguaje proporciona comprobaciones de accesibilidad , tanto en tiempo de compilación como en tiempo de ejecución, que garantizan que un valor de acceso no pueda sobrevivir al tipo del objeto al que apunta. [17]
Aunque la semántica del lenguaje permite la recolección automática de basura de objetos inaccesibles, la mayoría de las implementaciones no lo admiten de forma predeterminada, ya que provocaría un comportamiento impredecible en los sistemas en tiempo real. Ada admite una forma limitada de gestión de memoria basada en regiones ; además, el uso creativo de los grupos de almacenamiento puede proporcionar una forma limitada de recolección automática de basura, ya que la destrucción de un grupo de almacenamiento también destruye todos los objetos del grupo.
Un doble guión ("--"), parecido a un guión largo , denota texto de comentario. Los comentarios terminan al final de la línea; no hay manera intencional de hacer que un comentario ocupe varias líneas, para evitar que los comentarios sin cerrar anulen accidentalmente secciones enteras del código fuente. Por lo tanto, para deshabilitar un bloque de código completo es necesario anteponer "--" a cada línea (o columna) individualmente. Si bien esto denota claramente código deshabilitado al crear una columna de "--" repetidos a lo largo de la página, también hace que la desactivación/rehabilitación experimental de bloques grandes sea un proceso más prolongado en editores sin soporte para comentarios en bloques.
El punto y coma (";") es un finalizador de sentencia y la sentencia nula o sin operación es null;
. ;
No se permite un solo carácter sin una sentencia que finalice.
A diferencia de la mayoría de los estándares ISO , la definición del lenguaje Ada (conocida como Ada Reference Manual o ARM , o a veces Language Reference Manual o LRM ) es de contenido libre . Por lo tanto, es una referencia común para los programadores de Ada, no solo para los programadores que implementan compiladores de Ada. Además del manual de referencia, también hay un extenso documento de justificación que explica el diseño del lenguaje y el uso de varias construcciones del lenguaje. Este documento también es ampliamente utilizado por los programadores. Cuando se revisó el lenguaje, se escribió un nuevo documento de justificación.
Una notable herramienta de software libre que utilizan muchos programadores de Ada para ayudarlos a escribir el código fuente de Ada es GNAT Programming Studio, y GNAT es parte de GNU Compiler Collection .
En la década de 1970, el Departamento de Defensa de los Estados Unidos (DoD) comenzó a preocuparse por la cantidad de lenguajes de programación diferentes que se utilizaban para sus proyectos de sistemas informáticos integrados, muchos de los cuales eran obsoletos o dependían del hardware, y ninguno de los cuales admitía una programación modular segura. En 1975, se formó un grupo de trabajo , el High Order Language Working Group (HOLWG), con la intención de reducir este número mediante la búsqueda o creación de un lenguaje de programación que fuera adecuado en general para los requisitos del departamento y del Ministerio de Defensa del Reino Unido . Después de muchas iteraciones que comenzaron con una propuesta de hombre de paja original [18], el lenguaje de programación final se denominó Ada. El número total de lenguajes de programación de alto nivel en uso para tales proyectos cayó de más de 450 en 1983 a 37 en 1996.
HOLWG elaboró los requisitos del lenguaje Steelman , una serie de documentos que establecían los requisitos que, en su opinión, debía satisfacer un lenguaje de programación. Se revisaron formalmente muchos lenguajes existentes, pero el equipo concluyó en 1977 que ninguno de ellos cumplía con las especificaciones.
Se emitieron solicitudes de propuestas para un nuevo lenguaje de programación y se contrataron cuatro contratistas para desarrollar sus propuestas bajo los nombres de Red ( Intermetrics liderado por Benjamin Brosgol), Green ( Honeywell , liderado por Jean Ichbiah ), Blue ( SofTech , liderado por John Goodenough) [19] y Yellow ( SRI International , liderado por Jay Spitzen). En abril de 1978, después del escrutinio público, las propuestas Red y Green pasaron a la siguiente fase. En mayo de 1979, la propuesta Green, diseñada por Jean Ichbiah en Honeywell, fue elegida y se le dio el nombre de Ada, en honor a Augusta Ada King, condesa de Lovelace, generalmente conocida como Ada Lovelace . Esta propuesta estaba influenciada por el lenguaje LIS que Ichbiah y su grupo habían desarrollado en la década de 1970. El manual de referencia preliminar de Ada se publicó en ACM SIGPLAN Notices en junio de 1979. El manual de referencia Military Standard se aprobó el 10 de diciembre de 1980 (día del nacimiento de Ada Lovelace) y se le dio el número MIL-STD-1815 en honor al año de nacimiento de Ada Lovelace. En 1981, Tony Hoare aprovechó su discurso de entrega del premio Turing para criticar a Ada por ser demasiado compleja y, por lo tanto, poco fiable, [20] pero posteriormente pareció retractarse en el prólogo que escribió para un libro de texto de Ada. [21]
Ada atrajo mucha atención de la comunidad de programación en su conjunto durante sus primeros días. Sus patrocinadores y otros predijeron que podría convertirse en un lenguaje dominante para la programación de propósito general y no solo para el trabajo relacionado con la defensa. [22] Ichbiah declaró públicamente que dentro de diez años, solo dos lenguajes de programación permanecerían: Ada y Lisp . [23] Los primeros compiladores de Ada lucharon por implementar el lenguaje grande y complejo, y tanto el rendimiento en tiempo de compilación como en tiempo de ejecución tendían a ser lentos y las herramientas primitivas. [22] Los proveedores de compiladores dedicaron la mayor parte de sus esfuerzos a pasar la suite de validación masiva de Capacidad de Validación del Compilador de Ada (ACVC) requerida por el gobierno, que era necesaria en otra característica novedosa del esfuerzo del lenguaje Ada. [23]
La primera implementación de Ada validada fue el traductor NYU Ada/Ed, [24] certificado el 11 de abril de 1983. NYU Ada/Ed está implementado en el lenguaje de conjuntos de alto nivel SETL . [25] Varias compañías comerciales comenzaron a ofrecer compiladores de Ada y herramientas de desarrollo asociadas, incluidas Alsys , TeleSoft , DDC-I , Advanced Computer Techniques , Tartan Laboratories , Irvine Compiler, TLD Systems y Verdix . [26] Los fabricantes de computadoras que tenían un negocio significativo en las industrias de defensa, aeroespacial o relacionadas, también ofrecían compiladores y herramientas de Ada en sus plataformas; estos incluían Concurrent Computer Corporation , Cray Research, Inc. , Digital Equipment Corporation , Harris Computer Systems y Siemens Nixdorf Informationssysteme AG . [26]
En 1991, el Departamento de Defensa de los EE. UU. comenzó a exigir el uso de Ada (el mandato Ada ) para todo el software, [27] aunque a menudo se concedían excepciones a esta regla. [22] El mandato Ada del Departamento de Defensa se eliminó de manera efectiva en 1997, cuando el Departamento de Defensa comenzó a adoptar tecnología comercial lista para usar (COTS). [22] Existían requisitos similares en otros países de la OTAN : Ada era necesario para los sistemas de la OTAN que implicaban comando y control y otras funciones, y Ada era el lenguaje obligatorio o preferido para aplicaciones relacionadas con la defensa en países como Suecia, Alemania y Canadá. [28]
A finales de la década de 1980 y principios de la de 1990, los compiladores de Ada habían mejorado en rendimiento, pero todavía existían barreras para explotar plenamente las capacidades de Ada, incluido un modelo de tareas que era diferente al que estaban acostumbrados la mayoría de los programadores en tiempo real. [23]
Debido a las características de soporte críticas para la seguridad de Ada , ahora se usa no solo para aplicaciones militares, sino también en proyectos comerciales donde un error de software puede tener consecuencias graves, por ejemplo, aviónica y control de tráfico aéreo , cohetes comerciales como el Ariane 4 y 5 , satélites y otros sistemas espaciales, transporte ferroviario y banca. [16] Por ejemplo, el Sistema de Control de Vuelo Primario, el software del sistema fly-by-wire en el Boeing 777 , fue escrito en Ada, al igual que los sistemas fly-by-wire para el aerodinámicamente inestable Eurofighter Typhoon , [29] Saab Gripen , [30] Lockheed Martin F-22 Raptor y el sistema de control de vuelo de reemplazo DFCS para el Grumman F-14 Tomcat . El Sistema de Tráfico Aéreo Automatizado Canadiense fue escrito en 1 millón de líneas de Ada ( recuento SLOC ). Presentó procesamiento distribuido avanzado , una base de datos Ada distribuida y diseño orientado a objetos. Ada también se utiliza en otros sistemas de tráfico aéreo, por ejemplo, el sistema de control de tráfico aéreo de próxima generación Interim Future Area Control Tools Support (iFACTS) del Reino Unido está diseñado e implementado utilizando SPARK Ada. [31] También se utiliza en el sistema de señalización en cabina TVM francés en el sistema ferroviario de alta velocidad TGV y en los trenes suburbanos del metro de París, Londres, Hong Kong y la ciudad de Nueva York. [16] [32]
Año | Nombre informal | Norma ANSI | Norma ISO/IEC |
---|---|---|---|
1980 | Ada | Norma militar 1815 | — |
1983 | Año 83/87 | Norma militar 1815A | 8652:1987 |
1995 | Año 95 | — | 8652:1995 |
2007 | Año 2005 | — | 8652:1995/Enmienda 1:2007 |
2012 | Año 2012 | — | 8652:2012 |
2023 | Año 2022 | — | 8652:2023 |
La versión preliminar de Ada se puede encontrar en ACM Sigplan Notices Vol 14, No 6, junio de 1979 [33]
Ada se publicó por primera vez en 1980 como un estándar ANSI ANSI/ MIL-STD 1815. Como esta primera versión contenía muchos errores e inconsistencias, [a] la edición revisada se publicó en 1983 como ANSI/MIL-STD 1815A. Sin más cambios, se convirtió en un estándar ISO en 1987. [35] Esta versión del lenguaje se conoce comúnmente como Ada 83 , desde la fecha de su adopción por ANSI, pero a veces también se la conoce como Ada 87 , desde la fecha de su adopción por ISO. [36] También hay una traducción al francés; DIN la tradujo al alemán como DIN 66268 en 1988.
En febrero de 1995 se publicó Ada 95 , la norma conjunta ISO/IEC/ANSI ISO/IEC 8652:1995 [37] [38] , lo que la convirtió en el primer lenguaje de programación orientado a objetos según la norma ISO. Para ayudar con la revisión de la norma y su futura aceptación, la Fuerza Aérea de los EE. UU. financió el desarrollo del compilador GNAT . En la actualidad, el compilador GNAT forma parte de la colección de compiladores GNU .
Se ha continuado trabajando en la mejora y actualización del contenido técnico del lenguaje Ada. En octubre de 2001 se publicó un Corrigendum Técnico de Ada 95 [39] [40] y el 9 de marzo de 2007 se publicó una Enmienda importante, ISO/IEC 8652:1995/Amd 1:2007 [41] [42] , conocida comúnmente como Ada 2005 porque el trabajo sobre la nueva norma finalizó ese año.
En la conferencia Ada-Europe 2012 en Estocolmo, la Ada Resource Association (ARA) y Ada-Europe anunciaron la finalización del diseño de la última versión del lenguaje Ada y la presentación del manual de referencia al ISO/IEC JTC 1/SC 22 /WG 9 de la Organización Internacional de Normalización (ISO) y la Comisión Electrotécnica Internacional (IEC) para su aprobación. La ISO/IEC 8652:2012 [43] (véase Ada 2012 RM) se publicó en diciembre de 2012, conocida como Ada 2012. Se publicó un corrigendum técnico, ISO/IEC 8652:2012/COR 1:2016, [44] (véase RM 2012 con TC 1).
El 2 de mayo de 2023, la comunidad Ada vio la aprobación formal de la publicación de la edición Ada 2022 del estándar de lenguaje de programación. [11]
A pesar de los nombres Ada 83, 95, etc., legalmente solo existe una norma Ada, la de la última norma ISO/IEC: con la aceptación de una nueva versión de la norma, la anterior pasa a ser derogada. Los demás nombres son simplemente referencias informales a una determinada edición.
Otras normas relacionadas incluyen ISO/IEC 8651 -3:1988 Sistemas de procesamiento de información - Gráficos de computadora - Enlaces de lenguaje del Sistema de núcleo gráfico (GKS) - Parte 3: Ada .
Ada es un lenguaje de programación similar a ALGOL que incluye estructuras de control con palabras reservadas como if , then , else , while , for , etc. Sin embargo, Ada también tiene muchas funciones de estructuración de datos y otras abstracciones que no estaban incluidas en el ALGOL 60 original , como definiciones de tipos , registros , punteros y enumeraciones . Dichas construcciones fueron en parte heredadas o inspiradas por Pascal .
Un ejemplo común de la sintaxis de un lenguaje es el programa Hola mundo : (hello.adb)
con Ada.Text_IO ;procedimiento hola escomenzar Ada . Text_IO . Put_Line ( "¡Hola, mundo!" );fin Hola ;
Este programa se puede compilar utilizando el compilador de código abierto disponible gratuitamente GNAT , ejecutando
hola.adb de gnatmake
El sistema de tipos de Ada no se basa en un conjunto de tipos primitivos predefinidos , sino que permite a los usuarios declarar sus propios tipos. Esta declaración, a su vez, no se basa en la representación interna del tipo, sino en la descripción del objetivo que se debe alcanzar. Esto permite al compilador determinar un tamaño de memoria adecuado para el tipo y comprobar si hay violaciones de la definición de tipo en tiempo de compilación y de ejecución (es decir, violaciones de rango, desbordamientos de búfer, consistencia de tipo, etc.). Ada admite tipos numéricos definidos por un rango, tipos de módulo, tipos agregados (registros y matrices) y tipos de enumeración. Los tipos de acceso definen una referencia a una instancia de un tipo especificado; no se permiten punteros sin tipo. Los tipos especiales que proporciona el lenguaje son los tipos de tarea y los tipos protegidos.
Por ejemplo, una fecha podría representarse como:
tipo Day_type es rango 1 .. 31 ;tipo Month_type es rango 1 .. 12 ;tipo Year_type es rango 1800 .. 2100 ;tipo Horas es mod 24 ;El tipo Día de la semana es ( Lunes , Martes , Miércoles , Jueves , Viernes , Sábado , Domingo );tipo Fecha es registro Día : Tipo_de_día ; Mes : tipo_de_mes ; Año : Tipo_de_año ; fin de registro ;
Importante tener en cuenta: Day_type, Month_type, Year_type, Hours son tipos incompatibles, lo que significa que, por ejemplo, la siguiente expresión es ilegal:
Hoy : Day_type := 4 ;Mes_actual : Tipo_mes := 10 ;... Hoy + Mes_Actual ... -- ilegal
El operador más predefinido solo puede sumar valores del mismo tipo, por lo que la expresión es ilegal.
Los tipos se pueden refinar declarando subtipos :
subtipo Working_Hours es un rango de horas de 0 a 12 ; -- como máximo 12 horas para trabajar al día subtipo Working_Day es el rango de días laborables Lunes ... Viernes ; -- Días laborables Work_Load : matriz constante ( Working_Day ) de Working_Hours - declaración de tipo implícita := ( viernes => 6 , lunes => 4 , otros => 10 ); -- tabla de búsqueda de horas de trabajo con inicialización
Los tipos pueden tener modificadores como limitado, abstracto, privado , etc. Los tipos privados no muestran su estructura interna; los objetos de tipos limitados no se pueden copiar. [45] Ada 95 agrega características adicionales para la extensión orientada a objetos de tipos.
Ada es un lenguaje de programación estructurado , lo que significa que el flujo de control está estructurado en instrucciones estándar. Se admiten todas las construcciones estándar y la salida anticipada de nivel profundo, por lo que rara vez se necesita el uso de los comandos " go to ", también admitidos.
-- mientras a no sea igual a b, bucle.mientras a /= b bucle Ada . Text_IO . Put_Line ( "Esperando" ); bucle final ;Si a > b entonces Ada . Text_IO . Put_Line ( "Condición cumplida" );demás Ada . Text_IO . Put_Line ( "Condición no cumplida" );fin si ;para i en 1 .. 10 bucle Ada . Text_IO . Put ( "Iteración: " ); Ada .Text_IO .Put ( i ) ; Ada .Texto_IO .Poner_Línea ; bucle final ;bucle a := a + 1 ; salir cuando a = 10 ; bucle final ;caso i es cuando 0 => Ada . Text_IO . Put ( "cero" ); cuando 1 => Ada . Text_IO . Put ( "uno" ); cuando 2 => Ada . Text_IO . Put ( "dos" ); -- Las declaraciones de caso deben cubrir todos los casos posibles: cuando otros => Ada . Text_IO . Put ( "ninguna de las anteriores" ); caso final ;para un día laborable en Día laborable ' Bucle de rango -- bucle sobre una enumeración Put_Line ( Weekday ' Image ( aWeekday ) ); -- representación de cadena de salida de una enumeración si aWeekday en Working_Day entonces -- verificación de un subtipo de una enumeración Put_Line ( "para trabajar" y Working_Hours ' Image ( Work_Load ( aWeekday )) ); -- acceso a una tabla de búsqueda fin si ; bucle final ;
Entre las partes de un programa Ada se encuentran paquetes, procedimientos y funciones.
Las funciones se diferencian de los procedimientos en que deben devolver un valor. Las llamadas a funciones no se pueden utilizar "como una declaración" y su resultado debe asignarse a una variable. Sin embargo, desde Ada 2012, no se requiere que las funciones sean puras y pueden mutar sus parámetros declarados adecuadamente o el estado global. [46]
Ejemplo: Especificación del paquete (example.ads)
El paquete de ejemplo es tipo Número es rango 1 .. 11 ; procedimiento Imprimir_e_Incrementar ( j : inoutNumero ) ; fin Ejemplo ;
Cuerpo del paquete (ejemplo.adb)
con Ada.Text_IO ; cuerpo del paquete El ejemplo es i : Número := Número ' Primero ; procedimiento Imprimir_e_Incrementar ( j : in out Número ) es función Siguiente ( k : en Número ) devuelve Número es comenzar devuelve k + 1 ; Fin Siguiente ; comenzar Ada . Text_IO . Put_Line ( "El total es: " & Número ' Imagen ( j ) ); j := Siguiente ( j ); fin Imprimir_e_Incrementar ;-- inicialización del paquete ejecutada cuando se elabora el paquetecomenzar mientras i < Número ' Último bucle Imprimir_e_Incrementar ( i ); bucle final ;fin Ejemplo ;
Este programa se puede compilar, por ejemplo, utilizando el compilador de código abierto disponible gratuitamente GNAT , ejecutando
gnatmake -z ejemplo.adb
Los paquetes, procedimientos y funciones pueden anidarse hasta cualquier profundidad, y cada uno también puede ser el bloque lógico más externo.
Cada paquete, procedimiento o función puede tener sus propias declaraciones de constantes, tipos, variables y otros procedimientos, funciones y paquetes, que pueden declararse en cualquier orden.
Un pragma es una directiva del compilador que transmite información al compilador para permitir una manipulación específica de la salida compilada. [47] Ciertos pragmas están integrados en el lenguaje, [48] mientras que otros son específicos de la implementación.
Algunos ejemplos de uso común de pragmas del compilador serían deshabilitar ciertas características, como la verificación de tipos en tiempo de ejecución o la verificación de límites de subíndices de matrices, o indicarle al compilador que inserte código objeto en lugar de una llamada de función (como lo hace C/C++ con las funciones en línea ).
Ada ha tenido genéricos desde que se diseñó por primera vez en 1977-1980. La biblioteca estándar utiliza genéricos para proporcionar muchos servicios. Ada 2005 agrega una biblioteca de contenedores genéricos integral a la biblioteca estándar, que se inspiró en la biblioteca de plantillas estándar de C++ .
Una unidad genérica es un paquete o un subprograma que toma uno o más parámetros formales genéricos . [49]
Un parámetro formal genérico es un valor, una variable, una constante, un tipo, un subprograma o incluso una instancia de otra unidad genérica designada. Para los tipos formales genéricos, la sintaxis distingue entre tipos discretos, de punto flotante, de punto fijo, de acceso (puntero), etc. Algunos parámetros formales pueden tener valores predeterminados.
Para crear una instancia de una unidad genérica, el programador pasa parámetros reales para cada formal. La instancia genérica se comporta entonces como cualquier otra unidad. Es posible crear instancias de unidades genéricas en tiempo de ejecución , por ejemplo, dentro de un bucle.{{cite journal}}
: CS1 maint: DOI inactivo a partir de noviembre de 2024 ( enlace )Estos documentos se han publicado en diversas formas, incluida la impresa.