ADA(编程语言)

艾达
Green logo on horizon with Ada letters and slogan
范例 多范式结构化势在必行面向对象面向方面并发阵列分布式通用程序meta
家庭 帕斯卡
设计
  • MIL-STD-1815,ADA 83: Jean Ichbiah
  • ADA 95:Tucker Taft
  • ADA 2005:Tucker Taft
  • ADA 2012:Tucker Taft
首先出现 1980年2月
稳定版本
ADA 2022 /2023年5月
打字学科 静态坚固安全名义
作业系统 多或跨平台
文件名扩展 .adb,.ads
网站 www.adaic.org
主要实施
Adacore GNAT,Green Hills软件优化ADA 95编译器,PTC Apexada和Objectada,Mapusoft Ada-c/c ++更改器,以前称为“与C Intermediate”,DDC-I Score
方言
SparkRavenscar个人资料
被影响
Algol 68PascalSimula 67C ++ (ADA 95), SmallTalk (ADA 95), Modula-2 (ADA 95) Java (Ada 2005), Eiffel (Ada 2012)
受影响
C ++教堂,Drago, DEiffel ,Griffin, JavaNimParasailPL/SQLPL/PGSQLPython ,Python, RubySeed7 ,Seed7,Sparforte,Sparforte, SparkelSQL/PSM ,VHDL, VHDL
  • Wikibooks的ADA编程

ADA是一种结构化的静态的命令面向对象的高级编程语言,灵感来自Pascal和其他语言。它具有对设计的内置语言支持(DBC),非常强大的打字,明确的并发,任务,同步消息传递,受保护的对象和非确定性。 ADA通过使用编译器查找错误来提高代码安全性和可维护性,以支持运行时错误。 ADA是国际技术标准,由国际标准化组织(ISO)和国际电子技术委员会(IEC)共同定义。截至2023年5月,标准为ADA 2022非正式地为ISO/IEC 8652:2023。

ADA最初是由由法国计算机科学家Jean Ichbiah领导的团队根据1977年至1983年与美国国防部(DOD)合同的团队设计的,以取代当时国防部使用的450多种编程语言。 Ada以Ada Lovelace (1815–1852)的名字命名,后者被认为是第一位计算机程序员。

特征

ADA最初是为嵌入式实时系统设计的。 1992年至1995年间由Intermetrics的S. Tucker Taft设计的ADA 95修订改善了对系统,数值,财务和面向对象的编程(OOP)的支持。

ADA的功能包括:强键入模块化编程机制(软件包),运行时间检查并行处理任务,同步消息传递,受保护的对象和非确定性选择语句),异常处理通用。 ADA 95增加了对面向对象的编程的支持,包括动态调度

ADA的语法将执行基本操作的方法的选择最小化,并且更喜欢英语关键字(例如“或否则”和“然后”)而不是符号(例如“ ||”和“ &&”)。 ADA使用基本的算术运算符“+”,“ - ”,“*”和“/”,但避免使用其他符号。代码块由诸如“声明”,“开始”和“ end”之类的单词界定,其中“ end”(在大多数情况下)随后是块的标识符(例如循环...结束循环)。在条件障碍的情况下,这避免了其他悬挂,可以与其他语言(如C或Java)中的错误嵌套IF表达配对。

ADA旨在开发非常大的软件系统。 ADA软件包可以单独编译。 ADA软件包规格(软件包接口)也可以单独编译,而无需进行实施以检查一致性。这使得在设计阶段的早期,在实施开始之前都可以检测问题。

支持大量的编译时间检查,以帮助避免在其他某些语言运行时无法检测到的错误,或者需要将明确的检查添加到源代码中。例如,语法需要明确命名的块闭合,以防止因端端令牌不匹配而导致的错误。对强键入的依从性允许在编译时或在运行时检测许多常见的软件错误(错误的参数,范围违规,无效的参考,不匹配类型等)。由于并发是语言规范的一部分,因此编译器可以在某些情况下检测潜在的僵局。编译器还通常检查拼写错误的标识符,包装的可见性,冗余声明等,并可以提供有关如何解决错误的警告和有用的建议。

ADA还支持运行时间检查,以防止访问未分配的内存,缓冲区溢出错误,范围违规,逐一错误,阵列访问错误以及其他可检测到的错误。这些检查可以为了运行时效率而被禁用,但通常可以有效地编译。它还包括帮助计划验证的设施。由于这些原因,ADA被广泛用于关键系统,任何异常都可能导致非常严重的后果,例如意外死亡,伤害或严重的财务损失。使用ADA的系统示例包括航空电子学空中交通管制铁路,银行,军事和太空技术

ADA的动态内存管理是高级和类型安全的。 ADA没有通用或非构想的指针;它也不会隐式声明任何指针类型。相反,必须通过明确声明的访问类型进行所有动态内存分配和交易。每个访问类型都有一个关联的存储池,可处理内存管理的低级详细信息;程序员可以使用默认存储池或定义新的存储池(这与非均匀内存访问特别相关)。甚至可以声明几种指定相同类型但使用不同存储池的几种不同的访问类型。此外,该语言在编译时和运行时提供了可访问性检查,以确保访问值不能超过其指向对象的类型。

尽管该语言的语义允许自动垃圾收集无法访问的对象,但默认情况下,大多数实现都不支持它,因为它会在实时系统中导致不可预测的行为。 ADA确实支持有限形式的基于区域的内存管理;此外,对存储池的创造性使用可以提供有限形式的自动垃圾收集,因为销毁存储池还会破坏池中的所有物体。

双重仪表(“ - ”),类似于Em Dash ,表示评论文本。评论停止在线末端;有意无法发表评论跨越多行,以防止未经串联的注释无意中丢弃源代码的整个部分。因此,禁用整个代码块需要将每行(或列)单独使用“ - ”进行前缀。虽然这显然通过创建重复的“ - ”页面来表示禁用代码,但它也使大型块的实验性删除/重新启动更加绘制。

分号(“;”)是一个语句终结者,而无效语句是null;。一个;没有终止的声明。

与大多数ISO标准不同,ADA语言定义(称为ADA参考手册ARM ,有时是语言参考手册LRM )是免费的内容。因此,对于ADA程序员来说,这是一个常见的参考,不仅是实施ADA编译器的程序员。除了参考手册外,还有一个广泛的理由文档,可以解释各种语言构造的语言设计和使用。该文档也被程序员广泛使用。修改该语言时,写了一份新的理由文件。

许多ADA程序员使用的一种著名的免费软件工具是GNAT编程工作室,它是GNU编译器Collection Collection的一部分GNAT

历史

在1970年代,美国国防部(DOD)对其嵌入式计算机系统项目使用的不同编程语言的数量感到关注,其中许多是过时或依赖硬件的,并且没有任何支持安全模块化编程。 1975年,一个工作组高级语言工作组(HOLWG),目的是通过查找或创建通常适合该部门和英国国防部要求的编程语言来减少此数字。经过许多迭代以原始的稻草人提议开头的迭代后,最终的编程语言被命名为ADA。用于此类项目的高级编程语言的总数从1983年的450多个下降到1996年的37个。

Holwg制定了Steelman语言要求,这是一系列文件,指出他们认为编程语言应该满足的要求。许多现有语言进行了正式审查,但该团队在1977年得出结论,没有现有的语言符合规格。

奥古斯塔·艾达·金(Augusta Ada King) ,洛夫​​莱斯伯爵夫人。

发出了新编程语言的提案请求,并雇用了四个承包商来制定其提案,以红色(由本杰明·布罗斯戈尔(Benjamin Brosgol)领导的红色Intermetrics ),Green( Honeywell ,由Jean Ichbiah领导) ,Blue( Softech )(由John John Goodenough领导) )和黄色( SRI International ,由Jay Spitzen领导)。 1978年4月,经过公开审查,红色和绿色的提议传给了下一个阶段。 1979年5月,由让·伊奇比亚(Jean Ichbiah)在霍尼韦尔(Honeywell)设计的绿色提案被选为艾达(Ada)的名字 - 洛夫莱斯(Lovelace)伯爵夫人奥古斯塔·阿达(Augusta Ada) 。该提议受到Ichbiah和他的小组在1970年代发展的语言的影响。初步ADA参考手册于1979年6月在ACM Sigplan Noters发表。军事标准参考手册于1980年12月10日批准( Ada Lovelace的生日),并授予MIL-STD-1815的数字,以纪念Ada Lovelace的出生年。 1981年, Car Hoare利用他的图灵奖演讲来批评Ada过于复杂而不可靠,但随后似乎在他为ADA教科书写的前言中退缩。

ADA在早期的整个编程社区引起了很多关注。它的支持者和其他人预测,它可能成为通用编程的主要语言,而不仅仅是与国防相关的工作。 Ichbiah公开表示,在十年之内,只有两种编程语言:ADA和LISP 。早期的ADA编译器努力实施大型,复杂的语言,并且编译时间和运行时性能往往很慢,工具是原始的。编译器供应商花费了大部分努力来传递大规模的,语言检验,政府要求的ADA编译器验证能力(ACVC)验证套件,这是ADA语言工作的另一个新颖特征所要求的。术语文件是源自1975 - 1983年的计算机黑客语词典,在ADA的条目中指出:“这正是菲亚特(Fiat总的来说语言尖叫着从它庞大的像大庞大的内部走出来。”

第一个经过验证的ADA实施是NYU ADA/ED翻译人员,于1983年4月11日获得认证。纽约大学ADA/ED在高级SET语言SETL中实施。几家商业公司开始提供ADA编译器和相关开发工具,包括AlsysTelesoftDDC-I高级计算机技术Tartan Laboratories ,Irvine Compiler, TLD SystemsVerdix 。在国防,航空或相关行业中开展了重要业务的计算机制造商,他们的平台上还提供了ADA编译器和工具;其中包括并发计算机公司Cray Research,Inc 。,数字设备公司Harris Computer SystemsSiemens Nixdorf InformationsSystemee AG

1991年,美国国防部开始要求使用ADA( ADA授权)作为所有软件,尽管经常批准该规则的例外。国防部开始采用商业现成( COTS )技术,国防部ADA授权有效地被删除。在其他北约国家 /地区也存在类似的要求:涉及指挥和控制和其他职能的北约系统所需的ADA,ADA是瑞典,德国和加拿大等国家 /地区与国防相关申请的强制性或首选语言。

到1980年代末和1990年代初,ADA编译器的性能有所提高,但仍有完全利用ADA能力的障碍,其中包括与大多数实时程序员使用的任务模型不同。

由于ADA的安全至关重要的支持功能,现在不仅用于军事申请,而且在软件错误可能会产生严重后果的商业项目中,例如,例如,航空电子交通管制,商业火箭,例如Ariane 4和5卫星和其他太空系统,铁路运输和银行业务。例如,主要的飞行控制系统是波音777中的逐线系统软件,以及ADA的撰写,以及用于空气动力学不稳定的欧洲欧洲流动性的逐线系统, GripenF-22 Raptor和The F- 14 Tomcat的DFC替换飞行控制系统。加拿大自动化空中交通系统以100万行ADA( SLOC计数)编写。它具有高级分布式处理,分布式ADA数据库和面向对象的设计。 ADA还用于其他空中交通系统,例如英国的下一代临时区域控制工具支持(IFACTS)空中交通管制系统是使用Spark Ada设计和实施的。它也用于TGV高速铁路系统的法国TVM In- Cab信号系统,以及巴黎,伦敦,香港和纽约市的大都会郊区火车。

标准化

ADA语言的时间表
非正式名称 ANSI标准 ISO/IEC标准
1980 艾达 MIL-STD 1815
1983 ADA 83/87 MIL-STD 1815a 8652:1987
1995 ADA 95 8652:1995
2007 ADA 2005 8652:1995/AMD 1:2007
2012 ADA 2012 8652:2012
2023 ADA 2022 8652:2023

可以在1979年6月6日第6卷第14卷,第6卷,第14卷,第6卷中找到初步ADA。

ADA于1980年首次作为ANSI标准ANSI/ MIL-STD 1815出版。由于第一个版本存在许多错误和不一致之处(请参阅ADA语言更改的摘要),因此修订版在1983年出版为ANSI/MIL-STD 1815a。没有任何进一步的更改,它在1987年, ISO 8652:1987成为ISO标准。从ANSI采用之日起,该语言的这个版本通常称为ADA 83 ,但有时也称为ADA 87 ,从ISO采用之日起。这是ADA 83参考手册。也有法语翻译; Din于1988年将其翻译成德语为DIN 66268。

ADA 95 ,ISO/IEC/ANSI标准ISO/IEC 8652:1995 (请参阅ADA 95 RM )于1995年2月出版,成为第一种面向ISO标准对象的编程语言。为了帮助进行标准的修订和未来的接受,美国空军资助了GNAT编译器的开发。目前,GNAT编译器是GNU编译器集合的一部分。

工作继续改善和更新ADA语言的技术内容。 A Technical Corrigendum to Ada 95 was published in October 2001, ISO/IEC 8652:1995/Corr 1:2001 (see Ada 95 RM with TC 1 ), and a major Amendment, ISO/IEC 8652:1995/Amd 1:2007 (参见ADA 2005 RM )于2007年3月9日出版,通常称为ADA 2005 ,因为该年份的新标准工作已经完成。

在斯德哥尔摩的ADA-Europe 2012会议上,ADA资源协会(ARA)和ADA-Europe宣布完成了最新版本的ADA语言的设计,并将参考手册提交给ISO/IEC JTC 1/国际标准化组织(ISO)和国际电子技术委员会(IEC)的SC 22 /WG 9供批准。 ISO/IEC 8652:2012 (参见ADA 2012 RM )于2012年12月出版,称为ADA 2012 。发表了ISO/IEC 8652:2012/Cor 1:2016的技术货币(请参见2012年RM,带有TC 1 )。

2023年5月2日,ADA社区正式批准了ADA 2022版的编程语言标准。

尽管名称ADA 83、95等,但在法律上只有一个ADA标准,这是最后一个ISO/IEC标准之一:接受新标准版本,上一版将撤回。其他名称只是非正式的参考特定版本。

其他相关标准包括ISO/IEC 8651 -3:1988信息处理系统 - 计算机图形 - 光核系统(GKS)语言绑定 - 第3:ADA

语言构造

ADA是一种类似Algol的编程语言,其具有保留单词的控制结构,例如否则elforfor等等。但是,ADA还拥有许多数据结构设施和其他抽象,这些设施未包含在原始的Algol 60中,例如类型定义记录指示枚举。这种结构部分是由帕斯卡(Pascal)继承或启发的。

“你好世界!”在艾达

语言语法的一个常见示例是Hello World程序:( Hello.Adb)

with Ada.Text_IO;
procedure Hello is
begin
   Ada.Text_IO.Put_Line ("Hello, world!");
end Hello;

可以通过执行该程序使用免费的开源编译器GNAT来编译此程序

gnatmake hello.adb

数据类型

ADA的类型系统不是基于一组预定义的原始类型,而是允许用户声明自己的类型。该声明反过来不是基于类型的内部表示,而是基于要实现的目标。这允许编译器确定类型的合适的内存大小,并检查在编译时间和运行时间(即侵犯范围,缓冲区超支,类型一致性等)时对类型定义的违规行为。 ADA支持由范围,Modulo类型,聚合类型(记录和数组)和枚举类型定义的数值类型。访问类型定义了对指定类型的实例的引用;不允许未遵循的指针。语言提供的特殊类型是任务类型和受保护类型。

例如,日期可能表示为:

type Day_type   is range    1 ..   31;
type Month_type is range    1 ..   12;
type Year_type  is range 1800 .. 2100;
type Hours is mod 24;
type Weekday is (Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday);

type Date is
   record
     Day   : Day_type;
     Month : Month_type;
     Year  : Year_type;
   end record;

重要的是要注意:day_type,month_type,year_type,时间是不兼容的类型,例如以下表达式是非法的:

Today: Day_type := 4;
Current_Month: Month_type := 10;
... Today + Current_Month ...  -- illegal

预定义的正常操作员只能添加相同类型的值,因此表达式是非法的。

可以通过宣布亚型来完善类型:

subtype Working_Hours is Hours range 0 .. 12;            -- at most 12 Hours to work a day
subtype Working_Day is Weekday range Monday .. Friday;   -- Days to work

Work_Load: constant array(Working_Day) of Working_Hours  -- implicit type declaration
   := (Friday => 6, Monday => 4, others => 10);           -- lookup table for working hours with initialization

类型可以具有有限,抽象,私人等的修饰符。私有类型没有显示其内部结构。有限类型的对像不能复制。 ADA 95为面向对象的类型扩展提供了更多功能。

控制结构

ADA是一种结构化的编程语言,这意味着控制流是在标准语句中构成的。支持所有标准构造和深层早期出口,因此很少需要使用所支持的“ go to ”命令。

-- while a is not equal to b, loop.
while a /= b loop
  Ada.Text_IO.Put_Line ("Waiting");
end loop;

if a > b then
  Ada.Text_IO.Put_Line ("Condition met");
else
  Ada.Text_IO.Put_Line ("Condition not met");
end if;

for i in 1 .. 10 loop
  Ada.Text_IO.Put ("Iteration: ");
  Ada.Text_IO.Put (i);
  Ada.Text_IO.Put_Line;
end loop;

loop
  a := a + 1;
  exit when a = 10;
end loop;

case i is
  when 0 => Ada.Text_IO.Put ("zero");
  when 1 => Ada.Text_IO.Put ("one");
  when 2 => Ada.Text_IO.Put ("two");
  -- case statements have to cover all possible cases:
  when others => Ada.Text_IO.Put ("none of the above");
end case;

for aWeekday in Weekday'Range loop               -- loop over an enumeration
   Put_Line ( Weekday'Image(aWeekday) );         -- output string representation of an enumeration
   if aWeekday in Working_Day then               -- check of a subtype of an enumeration
      Put_Line ( " to work for " &
               Working_Hours'Image (Work_Load(aWeekday)) ); -- access into a lookup table
   end if;
end loop;

软件包,过程和功能

ADA程序的部分包括软件包,过程和功能。

示例:软件包规范(示例.ads)

package Example is
     type Number is range 1 .. 11;
     procedure Print_and_Increment (j: in out Number);
end Example;

包装正文(示例.adb)

with Ada.Text_IO;
package body Example is

  i : Number := Number'First;

  procedure Print_and_Increment (j: in out Number) is

    function Next (k: in Number) return Number is
    begin
      return k + 1;
    end Next;

  begin
    Ada.Text_IO.Put_Line ( "The total is: " & Number'Image(j) );
    j := Next (j);
  end Print_and_Increment;

-- package initialization executed when the package is elaborated
begin
  while i < Number'Last loop
    Print_and_Increment (i);
  end loop;
end Example;

可以通过执行该程序,例如,可以使用免费的开源编译器GNAT来编译此程序

gnatmake -z example.adb

软件包,过程和功能可以嵌套到任何深度,每个都可以是逻辑上最外面的块。

每个软件包,过程或功能都可以拥有自己的常数,类型,变量以及其他过程,功能和软件包的声明,可以按任何顺序声明。

并行

ADA对基于任务的并发有语言支持。 ADA中的基本并发单位是一项任务,这是内置有限类型。任务分为两个部分 - 任务声明定义了任务接口(类似于类型声明),任务主体指定了任务的实现。根据实现的不同,ADA任务要幺映射到操作系统线程或进程,要幺由ADA运行时内部安排。

任务可以具有同步的条目(同步消息传递的一种形式)。任务条目在任务规范中声明。每个任务条目都可以在任务主体内有一个或多个接受语句。如果任务的控制流达到了接受语句,则将任务阻止,直到另一个任务调用相应的条目(类似地,呼叫任务被阻止,直到该任务到达相应的Accept语句)。任务条目可以具有类似于过程的参数,从而允许任务同步交换数据。结合精选语句,可以在接受语句(类似于Dijkstra的守卫命令)上定义警卫

ADA还提供了受保护的对象,用于相互排斥。受保护的物体是一种类似监视器的构造,但使用警卫而不是有条件变量进行信号传导(类似于有条件的临界区域)。受保护的物体结合了数据封装和安全的相互排除,并从有条件的关键区域中进行了入口警卫。与经典监视器相比,主要优势是信号传导不需要条件变量,避免由于锁定语义不正确而导致潜在的死锁。像任务一样,受保护的对像是内置有限类型,它还具有声明部分和一个主体。

一个受保护的对象由封装的私人数据(只能从受保护的对像中访问),以及保证是相互排斥的过程,功能和条目(唯一的函数例外,需要无侧面效果因此,可以与其他功能同时运行)。如果另一个任务当前在同一受保护的对象内执行,则会阻止调用受保护对象的任务,并在其他任务留下受保护对象时释放。阻塞的任务是在到达时间下排序的受保护对像上排队的。

受保护的对象条目类似于程序,但还有警卫。如果警卫评估为false,则将呼叫任务被阻止并添加到该条目的队列中;现在,可以将另一个任务接收到受保护的对象,因为当前没有任务在受保护的对象内执行。每当任务离开受保护的物体时,警卫将被重新评估,因为这是唯一一次可以更改守卫的评估的时间。

对条目的电话可以接收到具有相同签名的其他条目。所需的任务被阻止并添加到目标条目的队列中;这意味着释放受保护的对象并允许接受另一个任务。

ADA中的SELECT语句可用于实现非阻止条目调用,并接受,非确定性的条目选择(也带有警卫),超时和中断。

以下示例说明了ADA中并发编程的一些概念。

with Ada.Text_IO; use Ada.Text_IO;

procedure Traffic is

   type Airplane_ID is range 1..10;             -- 10 airplanes

   task type Airplane (ID: Airplane_ID);        -- task representing airplanes, with ID as initialisation parameter
   type Airplane_Access is access Airplane;     -- reference type to Airplane

   protected type Runway is                     -- the shared runway (protected to allow concurrent access)
      entry Assign_Aircraft (ID: Airplane_ID);  -- all entries are guaranteed mutually exclusive
      entry Cleared_Runway (ID: Airplane_ID);
      entry Wait_For_Clear;
   private
      Clear: Boolean := True;                   -- protected private data - generally more than only a flag...
   end Runway;
   type Runway_Access is access all Runway;

   -- the air traffic controller task takes requests for takeoff and landing
   task type Controller (My_Runway: Runway_Access) is
      -- task entries for synchronous message passing
      entry Request_Takeoff (ID: in Airplane_ID; Takeoff: out Runway_Access);
      entry Request_Approach(ID: in Airplane_ID; Approach: out Runway_Access);
   end Controller;

   --  allocation of instances
   Runway1    : aliased Runway;              -- instantiate a runway
   Controller1: Controller (Runway1'Access); -- and a controller to manage it

   ------ the implementations of the above types ------
   protected body Runway is
      entry Assign_Aircraft (ID: Airplane_ID)
 when Clear is   -- the entry guard - calling tasks are blocked until the condition is true
      begin
       Clear := False;
       Put_Line (Airplane_ID'Image (ID) & " on runway ");
      end;

      entry Cleared_Runway (ID: Airplane_ID)
 when not Clear is
      begin
         Clear := True;
         Put_Line (Airplane_ID'Image (ID) & " cleared runway ");
      end;

      entry Wait_For_Clear
 when Clear is
      begin
         null;      -- no need to do anything here - a task can only enter if "Clear" is true
      end;
   end Runway;

   task body Controller is
   begin
      loop
         My_Runway.Wait_For_Clear;   -- wait until runway is available (blocking call)
         select                      -- wait for two types of requests (whichever is runnable first)
            when Request_Approach'count = 0 =>  -- guard statement - only accept if there are no tasks queuing on Request_Approach
             accept Request_Takeoff (ID: in Airplane_ID; Takeoff: out Runway_Access)
             do                                 -- start of synchronized part
               My_Runway.Assign_Aircraft (ID);  -- reserve runway (potentially blocking call if protected object busy or entry guard false)
               Takeoff := My_Runway;            -- assign "out" parameter value to tell airplane which runway
             end Request_Takeoff;               -- end of the synchronised part
         or
            accept Request_Approach (ID: in Airplane_ID; Approach: out Runway_Access) do
               My_Runway.Assign_Aircraft (ID);
               Approach := My_Runway;
            end Request_Approach;
         or                          -- terminate if no tasks left who could call
            terminate;
         end select;
      end loop;
   end;

   task body Airplane is
      Rwy : Runway_Access;
   begin
      Controller1.Request_Takeoff (ID, Rwy); -- This call blocks until Controller task accepts and completes the accept block
      Put_Line (Airplane_ID'Image (ID) & "  taking off...");
      delay 2.0;
      Rwy.Cleared_Runway (ID);               -- call will not block as "Clear" in Rwy is now false and no other tasks should be inside protected object
      delay 5.0; -- fly around a bit...
      loop
         select   -- try to request a runway
            Controller1.Request_Approach (ID, Rwy); -- this is a blocking call - will run on controller reaching accept block and return on completion
            exit; -- if call returned we're clear for landing - leave select block and proceed...
         or
            delay 3.0;  -- timeout - if no answer in 3 seconds, do something else (everything in following block)
            Put_Line (Airplane_ID'Image (ID) & "   in holding pattern");  -- simply print a message
         end select;
      end loop;
      delay 4.0;  -- do landing approach...
      Put_Line (Airplane_ID'Image (ID) & "            touched down!");
      Rwy.Cleared_Runway (ID);  -- notify runway that we're done here.
   end;

   New_Airplane: Airplane_Access;

begin
   for I in Airplane_ID'Range loop  -- create a few airplane tasks
      New_Airplane := new Airplane (I); -- will start running directly after creation
      delay 4.0;
   end loop;
end Traffic;

布拉格马斯

Pragma是一项编译器指令,可将信息传达给编译器,以允许对编译输出进行特定操纵。某些布拉格玛是在语言中内置的,而另一些则是特定于实施的。

编译器的常见用法的示例将是禁用某些功能,例如运行时类型检查或数组下标边界检查,或指示编译器插入对象代码而不是函数调用(如C/C ++,c/c ++在内联函数中使用)。

仿制药

自1977 - 1980年首次设计以来,Ada就有仿制药。标准库使用仿制药来提供许多服务。 ADA 2005向标准库增加了一个全面的通用容器库,该库的灵感来自C ++的标准模板库

通用单元是采用一个或多个通用形式参数的软件包或子程序。

通用形式参数是一个值,变量,常数,类型,子程序,甚至是另一个指定的通用单元的实例。对于通用形式类型,语法将离散,浮点,定点,访问(指针)类型等区分。某些正式参数可以具有默认值。

实例化通用单元,程序员将通过每个正式的实际参数。然后,通用实例的行为就像其他任何单元一样。可以在运行时实例化通用单元,例如在循环中。

也可以看看

  • ADA编译器
  • APSE - 编程环境的规范,以支持ADA中的软件开发
  • RAVENSCAR配置文件- 用于安全至关重的实时计算的ADA任务功能的子集
  • SPARK - 一种由ADA的严格限制子集组成的编程语言,并用元信息注释,描述了所需的组件行为和单个运行时要求