Ada es un lenguaje de programación de alto nivel estructurado , tipado estáticamente , imperativo y orientado a objetos , extendido desde Pascal y otros lenguajes. Tiene soporte de lenguaje incorporado para diseño por contrato (DbC), escritura extremadamente fuerte , concurrencia explícita, tareas, paso de mensajes sincrónico, objetos protegidos y no determinismo . Ada mejora la seguridad y el mantenimiento del código mediante el uso del compilador para encontrar errores a favor de errores en tiempo de ejecución . Ada es una norma técnica internacional , definida conjuntamente por el Organización Internacional de Normalización (ISO) y la Comisión Electrotécnica Internacional (IEC). A partir de 2020 [actualizar], la norma, denominada informalmente Ada 2012, [7] es ISO / IEC 8652: 2012. [8]
Paradigma | Multi-paradigma : estructurado , imperativo , orientado a objetos |
---|---|
Familia | Pascal |
Diseñada por |
|
Apareció por primera vez | Febrero de 1980 |
Lanzamiento estable | |
Disciplina de mecanografía | estático , fuerte , seguro , nominativo |
SO | Multiplataforma o multiplataforma |
Extensiones de nombre de archivo | .adb, .ads |
Sitio web | www |
Implementaciones importantes | |
AdaCore GNAT (descarga gratuita: http://libre.adacore.com/download ), compilador de optimización de software Ada 95 de Green Hills , PTC, Inc. PTC ApexAda y PTC ObjectAda, [3] "MapuSoft Ada-C / C ++ cambiador" ., anteriormente conocido como "AdaMagic con C intermedio", [4] DDC-I Score | |
Dialectos | |
SPARK , perfil Ravenscar | |
Influenciado por | |
ALGOL 68 , Pascal , Simula 67 , [5] C ++ (Ada 95), Smalltalk (Ada 95), Modula-2 (Ada 95) Java (Ada 2005), Eiffel (Ada 2012) | |
Influenciado | |
C ++ , Capilla , [6] "Drago" ., D , Eiffel , "Griffin" ., Java , Nim , ParaSail , PL / SQL , PL / pgSQL , Python , Ruby , Seed7 , "SPARforte" ., Sparkel , SQL / PSM , VHDL | |
|
Ada fue diseñada originalmente por un equipo dirigido por el científico informático francés Jean Ichbiah de CII Honeywell Bull bajo contrato con el Departamento de Defensa de los Estados Unidos (DoD) de 1977 a 1983 para reemplazar más de 450 lenguajes de programación utilizados por el DoD en ese momento. [9] Ada recibió su nombre de Ada Lovelace (1815-1852), a quien se le atribuye el mérito de ser la primera programadora de computadoras. [10]
Características
Ada se diseñó originalmente para sistemas integrados y en tiempo real. La revisión de 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: mecanografía fuerte , mecanismos de programación modular (paquetes), verificación en tiempo de ejecución , procesamiento paralelo ( tareas , paso de mensajes síncronos , objetos protegidos y declaraciones de selección no deterministas ), manejo de excepciones y genéricos . Ada 95 agregó soporte para la 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 las palabras clave en inglés (como "o si no" y "y luego") a los símbolos (como "||" y "&&"). Ada usa los operadores aritméticos básicos "+", "-", "*" y "/", pero evita usar 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) va seguido del identificador del bloque que cierra (por ejemplo, si ... end if , loop ... end loop ). En el caso de los 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ñada para desarrollar sistemas de software muy grandes. Los paquetes Ada se pueden compilar por separado. Las especificaciones del paquete Ada (la interfaz del paquete) también se pueden compilar por separado sin la implementación para verificar la coherencia. Esto hace posible detectar problemas en las primeras etapas de la fase de 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 agreguen comprobaciones explícitas al código fuente. Por ejemplo, la sintaxis requiere el cierre de bloques con nombre explícito para evitar errores debido a tokens finales que no coinciden. La adherencia a la tipificación fuerte permite detectar muchos errores de software comunes (parámetros incorrectos, 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 puntos muertos. [ cita requerida ] Los compiladores también verifican comúnmente 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 verificaciones 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 la matriz y otros errores detectables. Estas comprobaciones se pueden deshabilitar en aras de la eficiencia del tiempo de ejecución, pero a menudo se pueden compilar de manera eficiente. También incluye instalaciones para ayudar a la verificación del programa . Por estas razones, Ada se utiliza ampliamente en sistemas críticos, donde cualquier anomalía puede tener consecuencias muy graves, por ejemplo, muerte accidental, lesiones o pérdidas económicas graves. Los ejemplos de sistemas en los que se utiliza Ada incluyen aviónica , control de tráfico aéreo , ferrocarriles, banca, tecnología militar y espacial. [11] [12]
La gestión de memoria dinámica de Ada es de alto nivel y segura para los tipos. Ada no tiene punteros genéricos o sin tipo ; tampoco 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 administración de la memoria; el programador puede usar el grupo de almacenamiento predeterminado o definir uno nuevo (esto es particularmente relevante para el acceso a memoria no uniforme ). Incluso es posible declarar varios tipos de acceso diferentes que designan 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, lo que garantiza que un valor de acceso no pueda sobrevivir al tipo de objeto al que apunta. [13]
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 causaría un comportamiento impredecible en sistemas en tiempo real. Ada admite una forma limitada de gestión de memoria basada en regiones ; Además, el uso creativo de las agrupaciones de almacenamiento puede proporcionar una forma limitada de recolección automática de basura, ya que la destrucción de una agrupación de almacenamiento también destruye todos los objetos de la agrupación.
Un guión doble ("-"), que se asemeja a un guión em , denota texto de comentario. Los comentarios se detienen al final de la línea, para evitar que los comentarios no cerrados anulen accidentalmente secciones enteras del código fuente. Deshabilitar un bloque completo de código ahora requiere el prefijo de cada línea (o columna) individualmente con "-". Si bien denota claramente el código deshabilitado con una columna de "-" repetidos hacia abajo en la página, esto hace que la deshabilitación / reactivación experimental de bloques grandes sea un proceso más prolongado.
El punto y coma (";") es un terminador de instrucción , y la instrucción nula o sin operación es null;
. ;
No se permite un single sin una declaración para terminar.
A diferencia de la mayoría de los estándares ISO , la definición del lenguaje Ada (conocida como el Manual de referencia de Ada o ARM , o algunas veces el Manual de referencia del lenguaje o LRM ) es contenido gratuito . 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 programadores. Cuando se revisó el lenguaje, se redactó un nuevo documento de justificación.
Una herramienta de software libre notable que utilizan muchos programadores de Ada para ayudarlos a escribir el código fuente de Ada es GNAT Programming Studio , que forma parte de la colección de compiladores GNU .
Historia
En la década de 1970, el Departamento de Defensa de los EE. UU. (DoD) se preocupó 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 ellos 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 generalmente adecuado para los requisitos del departamento y del Ministerio de Defensa del Reino Unido . Después de muchas iteraciones comenzando con una propuesta original de Straw man, el lenguaje de programación eventual se llamó Ada. El número total de lenguajes de programación de alto nivel en uso para tales proyectos se redujo de más de 450 en 1983 a 37 en 1996.
El grupo de trabajo de HOLWG elaboró los requisitos del lenguaje Steelman , una serie de documentos que establecen los requisitos que, en su opinión, debería satisfacer un lenguaje de programación. Muchos idiomas existentes se revisaron formalmente, pero el equipo concluyó en 1977 que ningún idioma existente 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 liderada por Benjamin Brosgol), Green ( CII Honeywell Bull , liderada por Jean Ichbiah ), Blue ( SofTech , liderada por John Goodenough) [14] y Yellow ( SRI International , dirigido por Jay Spitzen). En abril de 1978, después del escrutinio público, las propuestas Roja y Verde pasaron a la siguiente fase. En mayo de 1979, se eligió la propuesta Green, diseñada por Jean Ichbiah en CII Honeywell Bull, y se le dio el nombre de Ada, en honor a Augusta Ada, condesa de Lovelace . Esta propuesta fue 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 del Estándar Militar fue aprobado el 10 de diciembre de 1980 ( cumpleaños de Ada Lovelace ) y recibió el número MIL-STD-1815 en honor al nacimiento de Ada Lovelace año. En 1981, CAR Hoare aprovechó su discurso del Premio Turing para criticar a Ada por ser demasiado compleja y, por lo tanto, poco confiable, [15] pero posteriormente pareció retractarse en el prólogo que escribió para un libro de texto de Ada. [dieciséis]
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. [17] Ichbiah declaró públicamente que dentro de diez años, solo quedarían dos lenguajes de programación: Ada y Lisp . [18] Los primeros compiladores de Ada luchaban 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. [17] Los proveedores de compiladores dedicaron la mayor parte de sus esfuerzos a aprobar la suite de validación "ACVC" masiva, de prueba de conformidad del lenguaje, requerida por el gobierno, que se requería en otra característica novedosa del esfuerzo del lenguaje Ada. [18] The Jargon File , un diccionario de jerga de piratas informáticos que se originó en 1975-1983, señala en una entrada sobre Ada que "es precisamente lo que uno podría esperar dado ese tipo de respaldo por decreto; diseñado por un comité ... uso, y en general un despilfarro desastroso de miles de millones de dólares ... Ada Lovelace ... casi con certeza palidecería ante el uso que se le ha dado a su nombre últimamente; lo más amable que se ha dicho al respecto es que probablemente haya un buen lenguaje pequeño que grita para salir desde el interior de su vasta y elefantina masa ".
La primera implementación de Ada validada fue el traductor NYU Ada / Ed, [19] certificado el 11 de abril de 1983. NYU Ada / Ed se implementa en el lenguaje SETL de alto nivel . [20] Varias empresas comerciales comenzaron a ofrecer compiladores Ada y herramientas de desarrollo asociadas, incluidas Alsys , TeleSoft , DDC-I , Advanced Computer Techniques , Tartan Laboratories , TLD Systems y Verdix . [21]
En 1991, el Departamento de Defensa de EE. UU. Comenzó a exigir el uso de Ada (el mandato de Ada ) para todo el software, [22] aunque a menudo se concedían excepciones a esta regla. [17] El mandato de Ada del Departamento de Defensa se eliminó efectivamente en 1997, cuando el Departamento de Defensa comenzó a adoptar la tecnología COTS . [17] Existían requisitos similares en otros países de la OTAN : Ada se requería para los sistemas de la OTAN que involucraban 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á. [23]
A finales de la década de 1980 y principios de la de 1990, los compiladores de Ada habían mejorado en rendimiento, pero aún existían barreras para aprovechar al máximo las habilidades de Ada, incluido un modelo de tareas que era diferente al que estaban acostumbrados la mayoría de los programadores en tiempo real. [18]
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 graves consecuencias, 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. [12] Por ejemplo, el Airplane Information Management System , el software del sistema fly-by-wire del Boeing 777 , fue escrito en Ada. [24] [25] Desarrollado por Honeywell Air Transport Systems en colaboración con consultores de DDC-I , se convirtió sin duda en el proyecto más conocido de Ada, civil o militar. [24] [25] El sistema de tráfico aéreo automatizado canadiense se escribió en 1 millón de líneas de Ada ( recuento SLOC ). Presentaba 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 la próxima generación de Soporte Provisional de Herramientas de Control de Área Futura (iFACTS) del Reino Unido está diseñado e implementado utilizando SPARK Ada. [26] 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 en París, Londres, Hong Kong y la ciudad de Nueva York. [12] [27]
Estandarización
El idioma se convirtió en un estándar ANSI en 1983 ( ANSI / MIL-STD 1815A ), y después de la traducción al francés y sin más cambios en inglés se convirtió en un estándar ISO en 1987 (ISO-8652: 1987). 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.
Ada 95, el estándar conjunto ISO / ANSI ( ISO-8652: 1995 ) se publicó en febrero de 1995, convirtiendo a Ada 95 en el primer lenguaje de programación orientado a objetos estándar ISO. Para ayudar con la revisión del estándar y la aceptación futura, la Fuerza Aérea de los EE. UU. Financió el desarrollo del compilador GNAT . Actualmente, el compilador GNAT es parte de la colección de compiladores GNU .
Se ha continuado trabajando para mejorar y actualizar el contenido técnico del idioma Ada. En octubre de 2001 se publicó un Corrigendum técnico de Ada 95, y el 9 de marzo de 2007 se publicó una enmienda importante, ISO / IEC 8652: 1995 / Amd 1: 2007. En la conferencia Ada-Europe 2012 en Estocolmo, 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 a la Organización Internacional de Normalización (ISO) para su aprobación. ISO / IEC 8652: 2012 se publicó en diciembre de 2012. [8]
Otras normas relacionadas incluyen ISO 8651-3 : 1988 Sistemas de procesamiento de información — Gráficos por computadora — Vinculaciones de lenguaje del sistema de kernel gráfico (GKS) — Parte 3: Ada .
Construcciones del lenguaje
Ada es un lenguaje de programación similar a ALGOL que presenta estructuras de control con palabras reservadas como if , then , else , while , for , etc. Sin embargo, Ada también tiene muchas facilidades de estructuración de datos y otras abstracciones que no estaban incluidas en el ALGOL 60 original , como definiciones de tipo , registros , punteros , enumeraciones . Tales construcciones fueron en parte heredadas o inspiradas por Pascal .
"¡Hola Mundo!" en Ada
Un ejemplo común de la sintaxis de un idioma es el programa Hello world : (hello.adb)
con Ada.Text_IO ; use Ada.Text_IO ; procedimiento Hola es comenzar Put_Line ( "¡Hola, mundo!" ); fin Hola ;
Este programa se puede compilar utilizando el compilador de código abierto GNAT , disponible gratuitamente , ejecutando
gnatmake hola.adb
Tipos de datos
El sistema de tipos de Ada no se basa en un conjunto de tipos primitivos predefinidos, pero 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 ejecución (es decir, violaciones de rango, desbordamientos de búfer, consistencia de tipos, 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 escribir. Los tipos especiales proporcionados por el lenguaje son tipos de tareas y tipos protegidos.
Por ejemplo, una fecha podría representarse como:
type Day_type es un rango de 1 .. 31 ; type Month_type es un rango de 1 .. 12 ; type Year_type tiene un rango de 1800 .. 2100 ; el tipo Horas es mod 24 ; tipo Día de la semana es ( lunes , martes , miércoles , jueves , viernes , sábado , domingo );tipo La fecha es el registro Día : Tipo_día ; Mes : Month_type ; Año : Year_type ; registro final ;
Los tipos se pueden refinar declarando subtipos:
el subtipo Working_Hours es el rango de Horas 0 .. 12 ; - como máximo 12 horas para trabajar un día subtipo Working_Day es el rango de día de la semana lunes .. viernes ; - Días para trabajar 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 limitados, abstractos, privados, etc. Solo se puede acceder a los tipos privados y los tipos limitados solo se pueden modificar o copiar dentro del alcance del paquete que los define. [28] Ada 95 agrega características adicionales para la extensión de tipos orientada a objetos.
Estructuras de Control
Ada es un lenguaje de programación estructurado , lo que significa que el flujo de control está estructurado en declaraciones 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 que a no es igual ab, bucle. mientras que a / = b bucle Ada . Text_IO . Put_Line ( "Esperando" ); ciclo final ;si a > b entonces Ada . Text_IO . Put_Line ( "Condición cumplida" ); más Ada . Text_IO . Put_Line ( "Condición no cumplida" ); terminar si ;for i in 1 .. 10 loop Ada . Text_IO . Put ( "Iteración:" ); Ada . Text_IO . Ponga ( i ); Ada . Text_IO . Put_Line ; ciclo final ;bucle a : = a + 1 ; salir cuando a = 10 ; ciclo final ;caso i es cuando 0 => Ada . Text_IO . Put ( "cero" ); cuando 1 => Ada . Text_IO . Ponga ( "uno" ); cuando 2 => Ada . Text_IO . Ponga ( "dos" ); - las declaraciones de casos tienen que cubrir todos los casos posibles: cuando otros => Ada . Text_IO . Put ( "ninguno de los anteriores" ); caso final ;para aWeekday en día de la semana ' Rango de bucle - bucle sobre una enumeración Put_Line ( Día de la semana ' Imagen ( aWeekday ) ); - Representación de cadena de salida de una enumeración si es un Weekday en Working_Day entonces - Verifica un subtipo de una enumeración Put_Line ( "para trabajar para" & Working_Hours ' Image ( Work_Load ( aWeekday )) ); - acceso al final de una tabla de búsqueda si ; ciclo final ;
Paquetes, procedimientos y funciones
Entre las partes de un programa Ada se encuentran paquetes, procedimientos y funciones.
Ejemplo: especificación del paquete (example.ads)
paquete El ejemplo es tipo El número es rango 1 .. 11 ; procedimiento Print_and_Increment ( j : en a cabo Número ); end Ejemplo ;
Cuerpo del paquete (ejemplo.adb)
con Ada.Text_IO ; El ejemplo del cuerpo del paquete es i : Número : = Número ' Primero ; procedimiento Print_and_Increment ( j : in out Number ) es función Siguiente ( k : en Número ) return El número es begin return k + 1 ; end Siguiente ; comienza Ada . Text_IO . Put_Line ( "El total es:" & Número ' Imagen ( j ) ); j : = Siguiente ( j ); end Print_and_Increment ;- La inicialización del paquete se ejecuta cuando se elabora el paquete begin while i < Number ' Last loop Print_and_Increment ( i ); ciclo final ; end Ejemplo ;
Este programa se puede compilar, por ejemplo, utilizando el compilador de código abierto GNAT disponible gratuitamente , ejecutando
gnatmake -z example.adb
Los paquetes, procedimientos y funciones pueden anidar a 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.
Concurrencia
Ada tiene soporte de idiomas para la concurrencia basada en tareas. La unidad concurrente fundamental en Ada es una tarea , que es un tipo limitado incorporado. Las tareas se especifican en dos partes: la declaración de la tarea define la interfaz de la tarea (similar a una declaración de tipo), el cuerpo de la tarea especifica la implementación de la tarea. Dependiendo de la implementación, las tareas de Ada se asignan a subprocesos o procesos del sistema operativo, o se programan internamente por el tiempo de ejecución de Ada.
Las tareas pueden tener entradas para sincronización (una forma de transmisión de mensajes sincrónica ). Las entradas de la tarea se declaran en la especificación de la tarea. Cada entrada de tarea puede tener una o más declaraciones de aceptación dentro del cuerpo de la tarea. Si el flujo de control de la tarea alcanza una declaración de aceptación, la tarea se bloquea hasta que otra tarea llame a la entrada correspondiente (de manera similar, una tarea que llama se bloquea hasta que la tarea llamada alcanza la declaración de aceptación correspondiente). Las entradas de tareas pueden tener parámetros similares a los procedimientos, lo que permite que las tareas intercambien datos de forma síncrona. Junto con las sentencias de selección , es posible definir protecciones en las sentencias de aceptación (similar a las órdenes protegidas de Dijkstra ).
Ada también ofrece objetos protegidos para la exclusión mutua . Los objetos protegidos son una construcción similar a un monitor , pero usan guardias en lugar de variables condicionales para la señalización (similar a las regiones críticas condicionales). Los objetos protegidos combinan la encapsulación de datos y la exclusión mutua segura de los monitores y las protecciones de entrada de las regiones críticas condicionales. La principal ventaja sobre los monitores clásicos es que no se requieren variables condicionales para la señalización, evitando posibles interbloqueos debido a una semántica de bloqueo incorrecta. Al igual que las tareas, el objeto protegido es un tipo limitado integrado y también tiene una parte de declaración y un cuerpo.
Un objeto protegido consta de datos privados encapsulados (a los que solo se puede acceder desde dentro del objeto protegido) y procedimientos, funciones y entradas que se garantizan mutuamente excluyentes (con la única excepción de las funciones, que deben estar libres de efectos secundarios). y, por lo tanto, puede ejecutarse simultáneamente con otras funciones). Una tarea que llama a un objeto protegido se bloquea si se está ejecutando otra tarea dentro del mismo objeto protegido y se libera cuando esta otra tarea abandona el objeto protegido. Las tareas bloqueadas se ponen en cola en el objeto protegido ordenadas por hora de llegada.
Las entradas de objetos protegidos son similares a los procedimientos, pero además tienen protecciones . Si un guardia se evalúa como falso, una tarea de llamada se bloquea y se agrega a la cola de esa entrada; ahora se puede admitir otra tarea en el objeto protegido, ya que no se está ejecutando ninguna tarea dentro del objeto protegido. Los resguardos se reevalúan cada vez que una tarea abandona el objeto protegido, ya que es el único momento en el que la evaluación de resguardos puede haber cambiado.
Las llamadas a las entradas se pueden poner en cola a otras entradas con la misma firma. Una tarea que está en cola se bloquea y se agrega a la cola de la entrada de destino; esto significa que el objeto protegido se libera y permite la admisión de otra tarea.
La instrucción de selección en Ada se puede utilizar para implementar llamadas de entrada sin bloqueo y acepta, selección de entradas no determinista (también con guardias), tiempos de espera y abortos.
El siguiente ejemplo ilustra algunos conceptos de programación concurrente en Ada.
con Ada.Text_IO ; use Ada.Text_IO ;procedimiento El tráfico es type Airplane_ID es el rango 1 .. 10 ; - 10 aviones tipo de tarea Avión ( ID : Airplane_ID ); - tarea que representa aviones, con ID como parámetro de inicialización. El tipo Airplane_Access es acceso Airplane ; - tipo de referencia a Avión tipo protegido Pista es - la pista compartida (protegida para permitir el acceso concurrente) entrada Assign_Aircraft ( ID : Airplane_ID ); - todas las entradas están garantizadas como entrada mutuamente excluyente Cleared_Runway ( ID : Airplane_ID ); entrada Wait_For_Clear ; privado Claro : Booleano : = Verdadero ; - datos privados protegidos - generalmente más que solo una bandera ... final de pista ; escriba Runway_Access es el acceso toda la pista ; - la tarea del controlador de tránsito aéreo toma solicitudes de despegue y aterrizaje tipo de tarea Controlador ( My_Runway : Runway_Access ) es - entradas de tarea para la entrada de paso de mensajes síncronos Request_Takeoff ( ID : en Airplane_ID ; Takeoff : out Runway_Access ); entrada Request_Approach ( ID : en Airplane_ID ; Aproximación : fuera de Runway_Access ); controlador final ; - asignación de instancias Runway1 : pista con alias ; - instantiate una pista Controller1 : Controlador ( pistas1 ' de acceso ); - y un controlador para administrarlo ------ las implementaciones de los tipos anteriores ------ cuerpo protegido La pista es la entrada Assign_Aircraft ( ID : Airplane_ID ) cuando Clear es - el guardia de entrada - las tareas de llamada se bloquean hasta que la condición sea verdadera begin Clear : = Falso ; Put_Line ( Airplane_ID ' Imagen ( ID ) & "en la pista" ); terminar ; entrada Cleared_Runway ( ID : Airplane_ID ) cuando no Clear es begin Clear : = True ; Put_Line ( Airplane_ID ' Imagen ( ID ) y "pista despejada" ); terminar ; entrada Wait_For_Clear cuando Clear es begin null ; - no es necesario hacer nada aquí - una tarea solo puede ingresar si "Borrar" es verdadero final ; final de pista ; El controlador del cuerpo de la tarea es begin loop My_Runway . Wait_For_Clear ; - esperar hasta que la pista esté disponible (llamada de bloqueo) seleccionar - esperar dos tipos de solicitudes (la que se ejecute primero) cuando Request_Approach ' count = 0 => - declaración de guardia - solo aceptar si no hay tareas en cola en Request_Approach aceptar Request_Takeoff ( ID : en Airplane_ID ; Takeoff : out Runway_Access ) hacer - inicio de la parte sincronizada My_Runway . Assign_Aircraft ( ID ); - pista de reserva (potencialmente bloqueando la llamada si el objeto protegido está ocupado o la guardia de entrada es falsa) Despegue : = My_Runway ; - asignar un valor de parámetro "out" para decirle al avión qué pista finaliza Request_Takeoff ; - final de la parte sincronizada o aceptar Request_Approach ( ID : en Airplane_ID ; Approach : out Runway_Access ) hacer My_Runway . Assign_Aircraft ( ID ); Aproximación : = My_Runway ; end Request_Approach ; o - terminar si no quedan tareas que puedan llamar, terminar ; fin de seleccionar ; ciclo final ; terminar ; cuerpo de la tarea El avión es Rwy : Runway_Access ; comenzar Controller1 . Request_Takeoff ( ID , Rwy ); - Esta llamada se bloquea hasta que la tarea del Controlador acepta y completa el bloque de aceptación Put_Line ( Airplane_ID ' Imagen ( ID ) & "despegando ..." ); retraso 2.0 ; Rwy . Cleared_Runway ( ID ); - la llamada no se bloqueará ya que "Borrar" en Rwy ahora es falso y no debe haber otras tareas dentro del retardo de objeto protegido 5.0 ; - volar un poco ... seleccionar bucle - intentar solicitar un controlador de pista 1 . Request_Approach ( ID , Rwy ); - esta es una llamada de bloqueo - se ejecutará cuando el controlador alcance el bloqueo de aceptación y regrese al finalizar la salida ; - si se devuelve la llamada, estamos listos para el aterrizaje - deje el bloque de selección y continúe ... o demore 3.0 ; - tiempo de espera - si no hay respuesta en 3 segundos, haga otra cosa (todo en el siguiente bloque) Put_Line ( Airplane_ID ' Imagen ( ID ) & "en patrón de espera" ); - simplemente imprima un mensaje end select ; ciclo final ; retraso 4.0 ; - hacer aproximación de aterrizaje ... Put_Line ( Airplane_ID ' Imagen ( ID ) & "¡aterrizó!" ); Rwy . Cleared_Runway ( ID ); - notificar a la pista de aterrizaje que hemos terminado aquí. terminar ; New_Airplane : Airplane_Access ;comenzar para I en Airplane_ID ' Range loop - crear algunas tareas de avión New_Airplane : = new Airplane ( I ); - comenzará a ejecutarse directamente después del retardo de creación 4.0 ; ciclo final ; terminar el tráfico ;
Pragmas
Un pragma es una directiva de compilador que transmite información al compilador para permitir la manipulación específica de la salida compilada. [29] Ciertos pragmas están integrados en el lenguaje, [30] mientras que otros son específicos de la implementación.
Ejemplos de uso común de los 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 matriz, o instruir al compilador para que inserte código objeto en lugar de una llamada a función (como lo hace C / C ++ con funciones en línea ).
Genéricos
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 completa biblioteca de contenedores genéricos 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 subprograma que toma uno o más parámetros formales genéricos .
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 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 instanciar una unidad genérica, el programador pasa parámetros reales para cada formal. La instancia genérica se comporta como cualquier otra unidad. Es posible crear instancias de unidades genéricas en tiempo de ejecución , por ejemplo, dentro de un bucle.Ver también
- APSE : una especificación para un entorno de programación para apoyar el desarrollo de software en Ada
- Perfil de Ravenscar : un subconjunto de las funciones de tareas de Ada diseñadas para la informática en tiempo real crítica para la seguridad
- SPARK (lenguaje de programación) : un lenguaje de programación que consta de un subconjunto altamente restringido de Ada, anotado con metainformación que describe el comportamiento deseado del componente y los requisitos de tiempo de ejecución individuales.
Referencias
- ^ "Corrigendum técnico para Ada 2012 publicado por ISO" . Asociación de recursos Ada. 2016-01-29 . Consultado el 23 de febrero de 2016 .
- ^ "Manual de referencia del lenguaje consolidado de Ada 2012" . Autoridad de evaluación de la conformidad de Ada. Archivado desde el original el 3 de marzo de 2016 . Consultado el 23 de febrero de 2016 .
- ^ "PTC ObjectAda" . PTC.com . Consultado el 27 de enero de 2014 .
- ^ "AdaMagic con certificado C Intermedio" .
- ^ Ada Rationale, 1986, págs. 23, 70, 110-114, 137, 165, 236
- ^ "Especificaciones de la capilla (Agradecimientos)" (PDF) . Cray Inc. 2015-10-01 . Consultado el 14 de enero de 2016 .
- ^ Ganssle, Jack (29 de mayo de 2013). "Ada Resource Association - Noticias y recursos para el lenguaje de programación Ada" . Adaic.org . Consultado el 14 de junio de 2013 .
- ^ a b "ISO / IEC 8652: 2012 Tecnología de la información - Lenguajes de programación - Ada " . Organización Internacional de Normalización . Consultado el 23 de diciembre de 2012 .
- ^ "El lenguaje de programación Ada" . Universidad de Mich . Archivado desde el original el 22 de mayo de 2016 . Consultado el 27 de mayo de 2016 .
- ^ Fuegi, J; Francis, J (2003). "Lovelace & Babbage y la creación de las 'notas ' de 1843 ". IEEE Annals of the History of Computing . 25 (4): 16-26. doi : 10.1109 / MAHC.2003.1253887 . S2CID 40077111 .
- ^ Taft, S. Tucker; Olsen, Florencia (30 de junio de 1999). "Ada ayuda a generar código con menos errores" . Noticias de informática del gobierno. págs. 2-3 . Consultado el 14 de septiembre de 2010 .
- ^ a b c Feldman, Michael. "¿Quién está usando a Ada?" . Grupo de Trabajo de Educación SIGAda.
- ^ sin administración segura de memoria dinámica en ADA , en: Escritura de módulos del kernel de Linux en Safe Rust - Geoffrey Thomas & Alex Gaynor, The Linux Foundation, 2019-10-02
- ^ "John Goodenough | Perfil del personal de SEI" . Sei.cmu.edu . Consultado el 27 de enero de 2014 .
- ^ CAR, Hoare (1981). "Ropa vieja del emperador" (PDF) . Comunicaciones de la ACM . Asociación de Maquinaria Informática . 24 (2): 75–83. doi : 10.1145 / 358549.358561 . S2CID 97895 .
- ^ Watt, DA; Wichmann, BA; Findlay, W. (1987). Ada: Lengua y Metodología . Prentice Hall.
- ^ a b c d Sward, Ricky E. (noviembre de 2010). "El ascenso, caída y persistencia de Ada". SIGAda '10: Actas de la conferencia internacional anual ACM SIGAda sobre SIGAda . págs. 71–74. doi : 10.1145 / 1879063.1879081 .
- ^ a b c Rosen, JP. (Agosto de 2009). "La (s) paradoja (s) de Ada". Ada Letters . ACM SIGAda. 24 (2): 28–35. doi : 10.1145 / 1620593.1620597 . S2CID 608405 .
- ^ SofTech Inc. (11 de abril de 1983). "Informe de resumen de validación del compilador Ada: NYU Ada / ED, versión 19.7 V-001" . Waltham, MA. Archivado desde el original el 12 de marzo de 2012 . Consultado el 16 de diciembre de 2010 .
- ^ Dewar, Robert BK; Fisher, Gerald A. Jr .; Schonberg, Edmond; Froelich, Robert; Bryant, Stephen; Goss, Clinton F .; Burke, Michael (noviembre de 1980). "El traductor e intérprete de NYU Ada". Avisos ACM SIGPLAN - Actas del Simposio ACM-SIGPLAN sobre el lenguaje de programación Ada . 15 (11): 194-201. doi : 10.1145 / 948632.948659 . ISBN 0-89791-030-3. S2CID 10586359 .
- ^ "Lista de compiladores validados por Ada". Cámara de compensación de información de Ada. 1 de julio de 1992. págs. 1-36.
- ^ Cámara de compensación de información de Ada (11 de abril de 1983). "El mandato de Ada del Congreso" . Archivado desde el original el 4 de marzo de 2016 . Consultado el 7 de junio de 2015 .
- ^ Babiak, Nicholas J. (1989). Ada, el nuevo lenguaje informático del sistema de armas del Departamento de Defensa: panacea o calamidad (PDF) . Air University (Fuerza Aérea de los Estados Unidos) . págs. 39–40.
- ^ a b Rehmer, Karl (2009). "El equipo de HADS". En Stellman, Andrew; Greene, Jennifer (eds.). Hermosos equipos: historias inspiradoras y cautelosas de líderes de equipo veteranos . Sebastopol, California: O'Reilly. págs. 299–312.
- ^ a b Wolfe, Alexander (octubre de 2004). "Todavía queda algo de vida en Ada" . Cola de ACM . 2 (7): 28–31. doi : 10.1145 / 1035594.1035608 .
- ^ AdaCore. "GNAT Pro elegido para el sistema ATC de próxima generación del Reino Unido" . Archivado desde el original el 24 de diciembre de 2010 . Consultado el 1 de marzo de 2011 .
- ^ AdaCore. "Mira quién está usando Ada" . Archivado desde el original el 24 de diciembre de 2010 . Consultado el 1 de marzo de 2011 .
- ^ "Tarjeta de sintaxis Ada" (PDF) . Archivado desde el original (PDF) el 6 de julio de 2011 . Consultado el 28 de febrero de 2011 .
- ^ "Ada 83 LRM, Sec 2.8: Pragmas" . Archive.adaic.com . Consultado el 27 de enero de 2014 .
- ^ "Ada 83 LRM, Apéndice / Anexo B: Pragmas de lenguaje predefinido" . Archive.adaic.com. Archivado desde el original el 6 de febrero de 2012 . Consultado el 27 de enero de 2014 .
Estándares internacionales
- ISO / IEC 8652 : Tecnología de la información — Lenguajes de programación — Ada
- ISO / IEC 15291 : Tecnología de la información — Lenguajes de programación — Especificación de interfaz semántica de Ada ( ASIS )
- ISO / IEC 18009 : Tecnología de la información — Lenguajes de programación — Ada: Evaluación de la conformidad de un procesador de lenguaje ( ACATS )
- Estándar IEEE 1003.5b-1996 , el enlace POSIX Ada
- Ada Language Mapping Specification , el lenguaje de descripción de la interfaz CORBA (IDL) para el mapeo Ada
Razón fundamental
Estos documentos se han publicado en diversas formas, incluida la impresa.
- Ichbiah, Jean D .; Barnes, John GP; Firth, Robert J .; Woodger, Mike (1986), Justificación del diseño del lenguaje de programación Ada , archivado desde el original el 2 de febrero de 2007También disponible [ https://apps.dtic.mil/dtic/tr/fulltext/u2/a187106.pdf en
- Barnes, John GP (1995), Ada 95 fundamento: el lenguaje: las bibliotecas estándar
- Barnes, John (2006) [2005], Justificación de Ada 2005
Libros
- Booch, Grady (1987). Ingeniería de software con Ada . California: The Benjamin / Cummings Publishing Company. ISBN 0-8053-0604-8.
- Skansholm, enero (1996). Ada 95 desde el principio . Addison-Wesley. ISBN 0-201-40376-5.
- Gilpin, Geoff. Ada: una visita guiada y un tutorial . Prentice Hall. ISBN 978-0-13-004045-9.
- Barnes, John (2006). Programación en Ada 2005 . Addison-Wesley. ISBN 0-321-34078-7.
- Barnes, John (1991). Programación en el manual de referencia del lenguaje Ada plus . Addison-Wesley. ISBN 0-201-56539-0.
- Barnes, John (1998). Programación en Ada 95 . Addison-Wesley. ISBN 0-201-34293-6.
- Barnes, John (1997). Ada de alta integridad: el enfoque SPARK . Addison-Wesley. ISBN 0-201-17517-7.
- Barnes, John (2003). Software de alta integridad: el enfoque SPARK para la seguridad y la protección . Addison-Wesley. ISBN 0-321-13616-0.
- Beidler, John (1997). Estructuras de datos y algoritmos: un enfoque orientado a objetos utilizando Ada 95 . Springer-Verlag. ISBN 0-387-94834-1.
- González, Dean W. (1991). Manual del programador de Ada . Compañía editorial de Benjamin-Cummings. ISBN 0-8053-2529-8.
- Ben-Ari, M. (1998). Ada para ingenieros de software . John Wiley e hijos. ISBN 0-471-97912-0.
- Cohen, Norman (1996). Ada como segundo idioma . Ciencias / Ingeniería / Matemáticas de McGraw-Hill. ISBN 0-07-011607-5.
- Burns, Alan ; Wellings, Andy (2001). Sistemas de tiempo real y lenguajes de programación. Ada 95, Java en tiempo real y POSIX en tiempo real . Addison-Wesley. ISBN 0-201-72988-1.
- Burns, Alan ; Wellings, Andy (1995). Concurrencia en Ada . Prensa de la Universidad de Cambridge. ISBN 0-521-62911-X.
- Atkinson, Colin (1991). Reutilización, concurrencia y distribución orientadas a objetos: un enfoque basado en Ada . Addison-Wesley. ISBN 0-201-56527-7.
- Booch, Grady ; Bryan, Doug (1994). Ingeniería de software con Ada . Addison-Wesley. ISBN 0-8053-0608-0.
- Jones, Do-While (1989). Ada en acción: con ejemplos prácticos de programación . John Wiley e hijos. ISBN 0-471-60708-8.
- Stubbs, Daniel; Webre, Neil W. (1993). Estructuras de datos con tipos de datos abstractos y Ada . Brooks Cole. ISBN 0-534-14448-9.
- Ledru, Pascal (diciembre de 1998). Programación distribuida en Ada con objetos protegidos . Dissertation.com. ISBN 1-58112-034-6.
- Culwin, Fintan (1997). Ada, un enfoque de desarrollo . Prentice Hall. ISBN 0-13-264680-3.
- Inglés, John; Culwin, Fintan (enero de 1997). Ada 95 el arte de la programación orientada a objetos . Prentice Hall. ISBN 0-13-230350-7.
- Musser, David R .; Stepanov, Alexander (24 de octubre de 1989). La biblioteca genérica de Ada: paquetes de procesamiento de listas lineales . Springer-Verlag. ISBN 0-387-97133-5.
- Feldman, Michael B. (1997). Construcción de software y estructuras de datos con Ada 95 . Addison-Wesley. ISBN 0-201-88795-9.
- Johnston, Simon (1997). Ada 95 para programadores C y C ++ . Addison-Wesley. ISBN 0-201-40363-3.
- Feldman, Michael B .; Koffman, Elliot B. (1992-1993). Ada: Resolución de problemas y diseño de programas . Addison-Wesley. ISBN 0-201-52279-9. 795 páginas.
- Feldman, Michael B .; Koffman, Elliot B. (1999). Ada 95 . Addison-Wesley. ISBN 0-201-36123-X.
- Dale, Nell B .; Weems, Chip; McCormick, John (agosto de 1996). Programación y resolución de problemas con Ada 95 . Editores Jones & Bartlett. ISBN 0-7637-0293-5.
- Dale, Nell B .; McCormick, John (2007). Estructuras de datos Ada Plus: un enfoque orientado a objetos, segunda edición . Editores Jones & Bartlett. ISBN 978-0-7637-3794-8.
- Krell, Bruce C. (1992). Desarrollando con Ada: métodos de ciclo de vida . Bantam Dell Pub Group. ISBN 0-553-09102-6.
- Bishop, Judy (10 de mayo de 1990). Ada distribuida: desarrollos y experiencias . Prensa de la Universidad de Cambridge. ISBN 0-521-39251-9.
- Sanden, Bo (1994). Construcción de sistemas de software con ejemplos en Ada . Prentice Hall. ISBN 0-13-030834-X.
- Hillam, Bruce (1994). Introducción a los tipos de datos abstractos con Ada . Prentice Hall. ISBN 0-13-045949-6.
- Rudd, David (1994). Introducción al diseño y desarrollo de software con Ada . Brooks Cole. ISBN 0-314-02829-3.
- Pyle, Ian C. (1991). Desarrollo de sistemas de seguridad: una guía con Ada . Prentice Hall. ISBN 0-13-204298-3.
- Baker, Louis (1989). Inteligencia artificial con Ada . McGraw-Hill. ISBN 0-07-003350-1.
- Burns, Alan ; Wellings, Andy . HRT-HOOD: un método de diseño estructurado para sistemas Ada en tiempo real . Holanda Septentrional. ISBN 0-444-82164-3.
- Savitch, Walter; Peterson, Charles (1992). Ada: Introducción al arte y la ciencia de la programación . Compañía editorial de Benjamin-Cummings. ISBN 0-8053-7070-6.
- Weiss, Mark Allen (1993). Estructuras de datos y análisis de algoritmos en Ada . Compañía editorial de Benjamin-Cummings. ISBN 0-8053-9055-3.
- Ledgard, Henry (1983). Ada: An Introduction (segunda ed.). Springer-Verlag. ISBN 0-387-90814-5.
- Bjørner, Dines; Oest, Ole N., eds. (1980). Hacia una descripción formal de Ada . Londres: Springer-Verlag. ISBN 3-540-10283-3.
Archivo
- Materiales del lenguaje de programación Ada, 1981–1990 . Instituto Charles Babbage , Universidad de Minnesota. Incluye literatura sobre productos de software diseñados para el lenguaje Ada; Publicaciones del gobierno de EE. UU., Incluidos los informes del proyecto Ada 9X, informes técnicos, documentos de trabajo, boletines informativos; e información del grupo de usuarios.
enlaces externos
- Ada - cambiador C / C ++ - MapuSoft
- Especificación del lenguaje de programación DOD Ada (ANSI / MIL STD 1815A-1983)
- JTC1 / SC22 / WG9 ISO hogar de los estándares Ada
- Ada (lenguaje de programación) en Curlie