Ada (lenguaje de programación)

format_list_bulleted Contenido keyboard_arrow_down
ImprimirCitar
Lenguaje de programación de alto nivel publicado por primera vez en 1980

Ada es un lenguaje de programación de alto nivel estructurado, estáticamente tipado, 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, simultaneidad explícita, tareas, paso de mensajes síncrono, 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 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 2020, el estándar, llamado informalmente Ada 2012, es ISO/IEC 8652:2012.

Ada fue diseñado 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.. Ada recibió su nombre de Ada Lovelace (1815-1852), a quien se le atribuye el mérito de ser la primera programadora de computadoras.

Características

Ada se diseñó originalmente para sistemas integrados 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: escritura 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 declaraciones de selección no deterministas), manejo de excepciones y genéricos. Ada 95 agregó compatibilidad con la programación orientada a objetos, incluido el despacho dinámico.

La sintaxis de Ada minimiza las opciones de formas de realizar operaciones básicas y prefiere palabras clave en inglés (como "o bien" y "y entonces") a símbolos (como " 34;||" 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, if... end if, loop... end loop). En el caso de bloques condicionales, esto evita un else colgante 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 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 la detección temprana de problemas durante 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 otros lenguajes o que requerirían la adición de comprobaciones explícitas al código fuente. Por ejemplo, la sintaxis requiere el cierre de bloques con nombres explícitos 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 interbloqueos. Los compiladores también verifican comúnmente los identificadores mal escritos, la visibilidad de los paquetes, las 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 la memoria no asignada, errores de desbordamiento de búfer, violaciones de rango, errores de desactivación por uno, errores de acceso a la matriz y otros errores detectables. Estas comprobaciones se pueden deshabilitar en interés 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 usa ampliamente en sistemas críticos, donde cualquier anomalía puede tener consecuencias muy graves, por ejemplo, muerte accidental, lesiones o pérdidas financieras 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.

La administración de memoria dinámica de Ada es de alto nivel y con seguridad de tipos. Ada no tiene punteros genéricos o sin tipo; ni declara implícitamente ningún tipo de puntero. En su lugar, 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 otros nuevos (esto es particularmente relevante para el acceso a memoria no uniforme). Incluso es posible declarar varios tipos de acceso diferentes que designen el mismo tipo pero usen 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.

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 administración de memoria basada en regiones; además, el uso creativo de las agrupaciones de almacenamiento puede proporcionar una forma limitada de recolección de basura automática, 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 ("--"), parecido a un guión largo, 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 indica claramente el código deshabilitado con una columna de "--" al final de la página, esto hace que la desactivación/reactivación experimental de bloques grandes sea un proceso más extenso.

El punto y coma (";") es un terminador de declaración, y la declaración nula o sin operación es null;. No se permite un solo ; sin una declaración para terminar.

A diferencia de la mayoría de las normas ISO, la definición del idioma Ada (conocida como Manual de referencia de Ada o ARM, o a veces el Manual de referencia del idioma 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 fundamentos que explica el diseño del lenguaje y el uso de varias construcciones del lenguaje. Este documento también es muy utilizado por los programadores. Cuando se revisó el lenguaje, se redactó un nuevo documento de justificación.

Una notable herramienta de software gratuito que utilizan muchos programadores de Ada para ayudarlos a escribir el código fuente de Ada es GNAT Programming Studio, y GNAT, que forma parte de GNU Compiler Collection.

Historia

En la década de 1970, el Departamento de Defensa de los EE. UU. (DoD) se preocupó por la cantidad de diferentes lenguajes de programación que se usaban para sus proyectos de sistemas informáticos integrados, muchos de los cuales eran obsoletos o dependían del hardware, y ninguno admitía la 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 al encontrar o crear un lenguaje de programación generalmente adecuado para el departamento y el Ministerio de Defensa del Reino Unido.;s requisitos. Después de muchas iteraciones que comenzaron con una propuesta original de hombre de paja, el lenguaje de programación final se llamó 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 establecen los requisitos que, en su opinión, debe satisfacer un lenguaje de programación. Se revisaron formalmente muchos idiomas existentes, pero el equipo concluyó en 1977 que ningún idioma existente cumplía con las especificaciones.

Augusta Ada King, Condesa de Lovelace.

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 dirigido por Benjamin Brosgol), Green (CII Honeywell Bull, dirigido por Jean Ichbiah), Blue (SofTech, dirigida por John Goodenough) y Yellow (SRI International, dirigida por Jay Spitzen). En abril de 1978, tras el escrutinio público, las propuestas Roja y Verde pasaron a la siguiente fase. En mayo de 1979, la propuesta Green, diseñada por Jean Ichbiah en CII Honeywell Bull, fue elegida y recibió el nombre de Ada, en honor a Augusta Ada, condesa de Lovelace. Esta propuesta estuvo 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 de Military Standard se aprobó el 10 de diciembre de 1980 (cumpleaños de Ada Lovelace) y recibió el número MIL-STD-1815 en honor a Ada. Año de nacimiento de Lovelace. En 1981, C. A. R. Hoare aprovechó su discurso del Premio Turing para criticar a Ada por ser demasiado compleja y, por lo tanto, poco fiable, pero posteriormente pareció retractarse en el prólogo que escribió para un libro de texto de Ada.

Ada atrajo mucho la atención de la comunidad de programación en general 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. Ichbiah declaró públicamente que dentro de diez años, solo quedarían dos lenguajes de programación: Ada y Lisp. 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ía a ser lento y las herramientas primitivas. Los proveedores de compiladores gastaron la mayor parte de sus esfuerzos en pasar la suite de validación Ada Compiler Validation Capability (ACVC) requerida por el gobierno, masiva, de prueba de conformidad con el lenguaje, que se requería en otra característica novedosa del esfuerzo del lenguaje Ada. The Jargon File, un diccionario de jerga de piratas informáticos que se originó entre 1975 y 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é... difícil de usar, y en general un desastroso despilfarro de miles de millones de dólares... Ada Lovelace... es casi seguro que 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 una buena lengua pequeña que grite para salir del interior de su vasta masa elefantiana."

La primera implementación validada de Ada fue el traductor NYU Ada/Ed, certificado el 11 de abril de 1983. NYU Ada/Ed se implementa en el lenguaje de configuración de alto nivel SETL. Varias empresas comerciales comenzaron a ofrecer compiladores Ada y herramientas de desarrollo asociadas, incluidas Alsys, TeleSoft, DDC-I, Advanced Computer Techniques, Tartan Laboratories, Irvine Compiler, TLD Systems y Verdix. Los fabricantes de computadoras que tenían un negocio importante en las industrias de defensa, aeroespacial o relacionadas, también ofrecían compiladores y herramientas Ada en sus plataformas; estos incluyeron Concurrent Computer Corporation, Cray Research, Inc., Harris Computer Systems y Siemens Nixdorf Informationssysteme AG.

En 1991, el Departamento de Defensa de EE. UU. comenzó a exigir el uso de Ada (el mandato de Ada) para todo el software, aunque a menudo se concedían excepciones a esta regla. El mandato Ada del Departamento de Defensa se eliminó efectivamente en 1997, cuando el Departamento de Defensa comenzó a adoptar la tecnología comercial lista para usar (COTS). Existían requisitos similares en otros países de la OTAN: se requería Ada para los sistemas de la OTAN que involucran comando y control y otras funciones, y Ada era el idioma obligatorio o preferido para aplicaciones relacionadas con la defensa en países como Suecia, Alemania y Canadá.

A fines 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 capacidades de Ada, incluido un modelo de tareas que era diferente al que estaban acostumbrados la mayoría de los programadores en tiempo real..

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, los satélites y otros sistemas espaciales, el transporte ferroviario y la banca. Por ejemplo, el Airplane Information Management System, el software del sistema fly-by-wire del Boeing 777, se escribió en Ada. Desarrollado por Honeywell Air Transport Systems en colaboración con consultores de DDC-I, se convirtió posiblemente en el más conocido de todos los proyectos de Ada, civiles o militares. El Sistema de tráfico aéreo automatizado canadiense se escribió en 1 millón de líneas de Ada (recuento SLOC). Presentaba un procesamiento distribuido avanzado, una base de datos Ada distribuida y un 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 Interim Future Area Control Tools Support (iFACTS) de próxima generación del Reino Unido está diseñado e implementado utilizando SPARK Ada. 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 de París, Londres, Hong Kong y la ciudad de Nueva York.

Estandarización

Ada preliminar se puede encontrar en ACM Sigplan Notices Vol 14, No 6, junio de 1979.

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 incoherencias (consulte Resumen de los cambios en el idioma de Ada), la edición revisada se publicó en 1983 como ANSI/MIL -STD 1815A. Sin más cambios, se convirtió en norma 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 parte de ANSI, pero a veces también se la conoce como Ada 87, desde la fecha de su adopción por ISO. Este es el Manual de referencia de Ada 83. También hay una traducción al francés; DIN lo tradujo al alemán como DIN 66268 en 1988.

Ada 95, el estándar conjunto ISO/IEC/ANSI ISO/IEC 8652:1995 (ver Ada 95 RM) se publicó en febrero de 1995, lo que lo convierte en el primer lenguaje de programación orientado a objetos estándar ISO.. Para ayudar con la revisión estándar y la futura aceptación, la Fuerza Aérea de 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 en la mejora y actualización del contenido técnico del lenguaje Ada. En octubre de 2001 se publicó un Corrección técnica de Ada 95, ISO/IEC 8652:1995/Corr 1:2001 (ver Ada 95 RM con TC 1), y una enmienda importante, ISO/IEC 8652: 1995/Amd 1:2007 (ver Ada 2005 RM) se publicó el 9 de marzo de 2007, comúnmente conocido como Ada 2005 porque el trabajo en el nuevo estándar finalizó ese año.

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 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. ISO/IEC 8652:2012 (ver Ada 2012 RM) se publicó en diciembre de 2012, conocido como Ada 2012. Se publicó un corrigendum técnico ISO/IEC 8652:2012/COR 1:2016 (ver RM 2012 con TC 1).

A pesar de los nombres Ada 83, 95, etc., legalmente solo existe un estándar Ada, el del último estándar ISO/IEC: con la aceptación de una nueva versión del estándar, el anterior se vuelve retraído. Los otros nombres son solo informales que hacen referencia a una determinada edición.

Otros estándares relacionados incluyen ISO/IEC 8651-3:1988 Sistemas de procesamiento de información—Gráficos por computadora—Enlaces 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 , para, 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 tipo, registros, punteros, enumeraciones. Tales construcciones fueron en parte heredadas o inspiradas por Pascal.

"¡Hola, mundo!" en Adá

Un ejemplo común de la sintaxis de un idioma es el programa Hello world: (hola.adb)

con Ada.Text_IO;procedimiento Hola. escomenzar Ada.Texto_IO.Put_Line ()"¡Hola, mundo!");final Hola.;

Este programa se puede compilar utilizando el compilador de código abierto disponible gratuitamente GNAT, ejecutando

gnatmake hola.adb

Tipos de datos

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 describir el objetivo que debe alcanzarse. Esto permite que el compilador determine un tamaño de memoria adecuado para el tipo y verifique las violaciones de la definición del tipo en tiempo de compilación y tiempo de ejecución (es decir, violaciones de rango, desbordamiento 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 específico; No se permiten punteros sin tipo. Los tipos especiales proporcionados por el lenguaje son tipos de tareas y tipos protegidos.

Por ejemplo, una fecha podría representarse como:

Tipo Day_type es rango 1 .. 31;Tipo Mes_tipo es rango 1 .. 12;Tipo Year_type es rango 1800 .. 2100;Tipo Horas es mod 24;Tipo Día de semana es ()Lunes, Martes, Miércoles, Jueves, Viernes, Sábado, Domingo);Tipo Fecha es récord Día : Day_type; Mes : Mes_tipo; Año : Year_type; final record;

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;Current_Month: Mes_tipo := 10;... Hoy + Current_Month ... - ilegales

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 Horas rango 0 .. 12; - al menos 12 horas para trabajar un díasubtipo Working_ Día es Día de semana rango Lunes .. Viernes; - Días para trabajarWork_Load: constante array()Working_ Día) de Working_Hours - declaración de tipo implícito := ()Viernes = 6, Lunes = 4, otros = 10); -- mesa de búsqueda para 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. 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 el uso de la función "ir a" Rara vez se necesitan comandos.

- mientras que un no es igual a b, bucle.mientras a /= b bucle Ada.Texto_IO.Put_Line ()"Esperando");final bucle;si a  b entonces Ada.Texto_IO.Put_Line ()"Condition met");más Ada.Texto_IO.Put_Line ()"Condición no encontrada");final si;para i dentro 1 .. 10 bucle Ada.Texto_IO.Put ()"Iteración: "); Ada.Texto_IO.Put ()i); Ada.Texto_IO.Put_Line;final bucle;bucle a := a + 1; Salida cuando a = 10;final bucle;Caso i es cuando 0 = Ada.Texto_IO.Put ()"cero"); cuando 1 = Ada.Texto_IO.Put ()"uno"); cuando 2 = Ada.Texto_IO.Put ()"dos"); -- las declaraciones de casos deben abarcar todos los casos posibles: cuando otros = Ada.Texto_IO.Put ()"ninguno de los anteriores");final Caso;para aWeekday dentro Día de semana'Rango bucle - el bucle sobre una enumeración Put_Line () Día de semana'Imagen()aWeekday) ); -- representación de la cadena de producción de una enumeración si aWeekday dentro Working_ Día entonces -- verificación de un subtipo de una enumeración Put_Line () "para trabajar" " Working_Hours'Imagen ()Work_Load()aWeekday) ); - acceso a una mesa de búsqueda final si;final bucle;

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 Ejemplo es Tipo Número es rango 1 .. 11; procedimiento Print_and_Increment ()j: dentro Fuera. Número);final Ejemplo;

Cuerpo del paquete (ejemplo.adb)

con Ada.Text_IO;paquete cuerpo Ejemplo es i : Número := Número'Primera; procedimiento Print_and_Increment ()j: dentro Fuera. Número) es función Siguiente ()k: dentro Número) retorno Número es comenzar retorno k + 1; final Siguiente; comenzar Ada.Texto_IO.Put_Line () "El total es: " " Número'Imagen()j) ); j := Siguiente ()j); final Print_and_Increment;-- inicialización del paquete ejecutada cuando se elabora el paquetecomenzar mientras i . Número'Último bucle Print_and_Increment ()i); final bucle;final 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 en 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 compatibilidad de idiomas para la simultaneidad 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. Según la implementación, las tareas de Ada se asignan a subprocesos o procesos del sistema operativo, o el tiempo de ejecución de Ada las programa internamente.

Las tareas pueden tener entradas para sincronización (una forma de paso de mensajes sincrónicos). 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 aceptar dentro del cuerpo de la tarea. Si el flujo de control de la tarea llega a una declaración de aceptación, la tarea se bloquea hasta que otra tarea llama 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 select, es posible definir protecciones en las sentencias de aceptación (similares a los comandos guardados de Dijkstra).

Ada también ofrece objetos protegidos para exclusión mutua. Los objetos protegidos son una construcción similar a un monitor, pero usan protecciones 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, lo que evita posibles interbloqueos debido a una semántica de bloqueo incorrecta. Al igual que las tareas, el objeto protegido es un tipo limitado incorporado 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 garantiza que son mutuamente excluyentes (con la única excepción de las funciones, que deben ser libre 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 otra tarea se está ejecutando actualmente 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 ordenado 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 actualmente no se está ejecutando ninguna tarea dentro del objeto protegido. Los resguardos se vuelven a evaluar cada vez que una tarea abandona el objeto protegido, ya que es el único momento en que la evaluación de los resguardos puede haber cambiado.

Las llamadas a entradas se pueden volver a poner en cola a otras entradas con la misma firma. Una tarea que se vuelve a poner 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 select en Ada se puede usar para implementar llamadas de entrada sin bloqueo y aceptaciones, selección no determinista de entradas (también con guardias), tiempos de espera y cancelaciones.

El siguiente ejemplo ilustra algunos conceptos de programación concurrente en Ada.

con Ada.Text_IO; uso Ada.Text_IO;procedimiento Tráfico es Tipo Airplane_ID es rango 1..10; - 10 aviones tarea Tipo Airplane ()ID: Airplane_ID); -- tarea representando aviones, con ID como parámetro de inicialización Tipo Airplane_Access es acceso Airplane; -- tipo de referencia al avión protegida Tipo Runway es -- la pista compartida (protegida para permitir el acceso simultáneo) entrada Assign_Aircraft ()ID: Airplane_ID); - todas las entradas se garantizan mutuamente excluyentes entrada Cleared_Runway ()ID: Airplane_ID); entrada Espera.; privado Despejado: Boolean := Cierto.; -- datos privados protegidos - generalmente más que una bandera... final Runway; Tipo Runway_Access es acceso Todos Runway; - la tarea del controlador de tráfico aéreo solicita el despegue y aterrizaje tarea Tipo Controlador ()My_Runway: Runway_Access) es -- entradas de tareas para el paso del mensaje sincronizado entrada Request_Takeoff ()ID: dentro Airplane_ID; Despacho: Fuera. Runway_Access); entrada Request_Approach()ID: dentro Airplane_ID; Enfoque: Fuera. Runway_Access); final Controlador; - asignación de casos Runway1 : aliased Runway; - instantáneamente una pista Controlador1: Controlador ()Runway1'Acceso); - y un controlador para manejarlo Las implementaciones de los tipos anteriores... protegida cuerpo Runway es entrada Assign_Aircraft ()ID: Airplane_ID) cuando Despejado es -- el guardia de entrada - las tareas de llamada están bloqueadas hasta que la condición es verdadera comenzar Despejado := Falso; Put_Line ()Airplane_ID'Imagen ()ID) " "en pista"); final; entrada Cleared_Runway ()ID: Airplane_ID) cuando no Despejado es comenzar Despejado := Cierto.; Put_Line ()Airplane_ID'Imagen ()ID) " "correo claro"); final; entrada Espera. cuando Despejado es comenzar nulo; -- no hay necesidad de hacer nada aquí - una tarea sólo puede entrar si "Clear" es verdad final; final Runway; tarea cuerpo Controlador es comenzar bucle My_Runway.Espera.; -- espere hasta que la pista esté disponible (llamada de bloqueo) seleccionar - esperar dos tipos de solicitudes (cualquiera que sea ejecutable primero) cuando Request_Approach'Cuenta = 0 = -- declaración de guardia - sólo aceptar si no hay tareas que hacer en Request_ Enfoque aceptar Request_Takeoff ()ID: dentro Airplane_ID; Despacho: Fuera. Runway_Access) do -- inicio de parte sincronizada My_Runway.Assign_Aircraft ()ID); -- pista de reserva (potencialmente llamada de bloqueo si objeto protegido ocupado o guardia de entrada falso) Despacho := My_Runway; -- asignar el valor del parámetro "out" para decir el avión que pista final Request_Takeoff; -- fin de la parte sincronizada o aceptar Request_Approach ()ID: dentro Airplane_ID; Enfoque: Fuera. Runway_Access) do My_Runway.Assign_Aircraft ()ID); Enfoque := My_Runway; final Request_Approach; o - terminar si no quedan tareas que puedan llamar terminada; final seleccionar; final bucle; final; tarea cuerpo Airplane es Rwy : Runway_Access; comenzar Controlador1.Request_Takeoff ()ID, Rwy); -- Esta llamada bloquea hasta que la tarea Controller acepte y complete el bloque de aceptación Put_Line ()Airplane_ID'Imagen ()ID) " "Quítate..."); demora 2.0; Rwy.Cleared_Runway ()ID); -- la llamada no bloqueará como "Clear" en Rwy ahora es falsa y ninguna otra tarea debe estar dentro de objeto protegido demora 5.0; - Volar un poco... bucle seleccionar - tratar de solicitar una pista de aterrizaje Controlador1.Request_Approach ()ID, Rwy); -- esta es una llamada de bloqueo - se ejecutará en el controlador llegando a aceptar bloque y volver al final Salida; -- si la llamada regresa, estamos claros para aterrizar - dejar el bloque selecto y proceder... o demora 3.0; -- timeout - si no hay respuesta en 3 segundos, hacer algo más (todo en el siguiente bloque) Put_Line ()Airplane_ID'Imagen ()ID) " "en el patrón de sujeción"); - simplemente imprimir un mensaje final seleccionar; final bucle; demora 4.0; - Hacer un enfoque de aterrizaje... Put_Line ()Airplane_ID'Imagen ()ID) " "¡Abajo!"); Rwy.Cleared_Runway ()ID); - notificar a la pista que hemos terminado aquí. final; New_Airplane: Airplane_Access;comenzar para I dentro Airplane_ID'Rango bucle -- crear algunas tareas de avión New_Airplane := nuevo Airplane ()I); -- empezará a correr directamente después de la creación demora 4.0; final bucle;final Tráfico;

Pragmas

Un pragma es una directiva del compilador que transmite información al compilador para permitir la manipulación específica de la salida compilada. Ciertos pragmas están integrados en el lenguaje, mientras que otros son específicos de la implementación.

Ejemplos de uso común de los pragmas del compilador serían deshabilitar ciertas funciones, como la verificación de tipos en tiempo de ejecución o la verificación de límites de subíndices de matriz, o indicar al compilador que inserte código de objeto en lugar de una llamada de función (como lo hace C/C++ con funciones en línea).

Genéricos

Ada ha tenido genéricos desde que fue diseñado por primera vez en 1977-1980. La biblioteca estándar utiliza genéricos para proporcionar muchos servicios. Ada 2005 añade una completa biblioteca de contenedores genéricos a la biblioteca estándar, que fue inspirada en la biblioteca estándar de plantillas de C++.

A unidad genérica es un paquete o un subprograma que toma uno o más parámetros oficiales genéricos.

A parámetro genérico formal es un valor, una variable, una constante, un tipo, un subprograma, o incluso una instancia de otra unidad, designada, genérica. Para los tipos formales genéricos, la sintaxis distingue entre los tipos discretos, de punto flotante, de punto fijo, de acceso (punto), etc. Algunos parámetros formales pueden tener valores predeterminados.

A instantiate una unidad genérica, el programador pasa efectivos parámetros para cada formal. La instancia genérica se comporta como cualquier otra unidad. Es posible instantánear unidades genéricas a tiempo de ejecución, por ejemplo dentro de un bucle.

Contenido relacionado

Memoria de núcleo magnético

Edgar F Codd

IBM 1401

Más resultados...
Tamaño del texto:
undoredo
format_boldformat_italicformat_underlinedstrikethrough_ssuperscriptsubscriptlink
save