给ADA一个机会

2021-03-03 00:53:06

TL; DR:Ada是一种非常有趣且健壮的编程语言,可以为系统和裸机软件的现代开发人员提供大量帮助。至少,Ada提出了许多有趣的想法,现代编程语言的设计师可以从中学到很多东西。如果您想要这篇文章的30秒版本,请查看我提供的Ada与C的比较的实际示例。

本文提供的许多技术材料都可以作为我对osdev.org的贡献的一部分。

我认为自己是一个有理性的人。尽管我可能相信宇宙的完全确定性模型,但我当然不相信它会受到任何有意识过程的指导。我不相信命运。由于缺乏指导,因此我将要讨论的那些偶然事件变得更加非同寻常,为此,我更加感激。

我没有经过精心设计,就碰巧住在一所大学附近。这不是欧洲或美国大部分地区常见的“大学城”,而是在市中心密集的郊区蔓延中。我定期往返于当地购物中心,带我经过上述大学中倍受赞誉的工程系的几栋建筑物。

在一个偶然的下午回家的路上,我偶然发现了一大堆书,这些书坐在大学工程楼之一外的路边。表面上看,大学正在清理旧的工程书籍库存,并将它们堆放一堆,供地方议会收集。在涵盖广泛学科领域的材料中,有两本书特别引起了我的注意:使用Ada构建并行,嵌入式和实时应用程序,以及使用Ada进行并行和实时编程。

我以前听说过艾达。我知道它来自为美国军方开发的语言谱系,并且在安全关键型应用程序的开发中仍然占有一席之地,仅此而已。很好奇,我把书丢在书包里,然后就走了。

诚然,我为Ada描绘的语法像是毫不妥协的冗长和僵硬的COBOL构造,或者也许是Fortran各种化身的Lovecraftian象形文字。翻页时,我对与现代高级语言(例如范围,切片和异常处理)相关联的现代结构感到惊讶。语法(按现代标准3固然冗长)似乎是有意地构造的,目的是使该语言一目了然。

我对Ada设计时考虑到嵌入式软件这一事实特别感兴趣。我已经在使用C和汇编语言的x86和ARM平台上进行裸机开发方面拥有有限的经验,因此在裸机上使用更高级别的构造的前景对我来说是充满希望的。

许多批评者针对Ada的普遍贬义词是,它是“由委员会设计”的语言,或更糟糕的是,是“由委员会为军事设计的”语言。1.含义是(所谓的)委员会的设计将其排除在现实世界之外。我认为,设计一种适合现有问题领域的语言比选择您的选择武器并着手寻找新的问题领域以将其应用于2更好。国防部的“高级语言工作组”可以说是Ada编程语言的诞生,因为它需要适用于DoD 4开发的多种实时嵌入式系统的单一,统一的高级语言。用工作组主席威廉·惠特克上校的明智话说:“得出的结论是,没有任何一种语言可以被用作国防部的一种通用高级语言,但是可以使用一种基本上满足所有要求的语言。既可行又可取。”。如果这样的事情确实可行,那么国防部的巨额资金将帮助它实现。具有讽刺意味的是,鉴于其作为现代嵌入式系统开发的事实上的标准语言的地位,C语言被认为不适用于此目的:“当贝尔实验室被邀请根据DoD要求评估C时,他们说没有机会了。 C符合可读性,安全性等要求。” (Whitaker,1993)。在成功实施之后,国防部将在所有内部软件工程中强制要求使用Ada,这无疑是一个有争议的决定。

Ada具有许多有用的功能,这些是低级编程和操作系统开发特别感兴趣的功能。特别令我印象深刻的一项功能是Ada的代表条款(请参见下文)。它们提供了一种高度精细的方式来定义低级数据结构的内存表示形式。我很快就能将自己长期受苦的操作系统开发项目改编为Ada,从而在此过程中极大地提高了代码库的质量。以下部分详细介绍了Ada的一些功能:

除了是一种强类型语言外,Ada还允许定义新的标量,枚举和记录类型。自定义基本类型也可以限制在预定义的值范围内。下面的示例演示了基于Ada的本机Natural类型(限制在预定义范围内)的新整数类型的定义。子类型指令的使用会通知编译器自然类型的其他变量与新定义的子类型兼容。

VGA_COL_COUNT:常数:= 80; VGA_ROW_COUNT:常数:= 24; Col子类型为自然范围0 .. VGA_COL_COUNT-1;子类型Row为自然范围0 .. VGA_ROW_COUNT-1;

下面的示例说明了不兼容的自定义整数类型的创建。尽管它们的基本类型和范围约束是相同的,但Ada会将两者视为单独的不兼容类型。将一种类型的变量赋给另一种类型的值是非法的,并且会触发编译时错误。

Integer_1类型的范围是1 .. 10;类型Integer_2的范围是1 .. 10; A:整数_1:= 8; B:整数_2:= A; - 非法的!

下面的示例演示了自定义枚举类型的创建。它还演示了值范围受限的枚举类型的子类型。

Day_Of_Week类型是(星期一,星期二,星期三,星期四,星期五,星期六,星期日);子类型Work_Day是星期一的Day_Of_Week范围。。星期五;

类型为Work_Day的变量被限制在其受限制的范围内。任何试图将超出此范围的值分配给此类型的变量的尝试都会在运行时引发Constraint_Error异常。

Ada允许显式定义标量和复合类型的内存表示形式。下面的示例演示了记录类型的定义(等同于C中的结构)及其在内存中的关联表示。

-------------------------------------------------- ---------------------------处理器使用的系统表描述符指针的格式-加载GDT和IDT。 -------------------------------------------------- --------------------------类型System_Table_Descriptor是记录大小:Unsigned_16;偏移:系统。地址 ;大小=>的最终记录48;对于System_Table_Descriptor,使用记录大小为0的范围0 .. 15;在0范围内偏移16 .. 47;结束记录;

Size方面说明符指示编译器System_Table_Descriptor类型的大小必须为48位。记录表示子句指示编译器此记录类型在内存中的所需布局。此示例指定Size成员应占据0到15位,而Offset成员应占据16到47位。此功能类似于C的位字段。下面的示例演示如何定义枚举类型的内存中表示形式。

-------------------------------------------------- ---------------------------特定描述符的特权级别。 -这些对应于'保护环'可以从中访问此描述符。 -------------------------------------------------- --------------------------类型Descriptor_Privilege_Level是(Ring_0,Ring_1,Ring_2,Ring_3),其大小=> 2;供Descriptor_Privilege_Level使用(Ring_0 => 0,Ring_1 => 1,Ring_2 => 2,Ring_3 => 3);

Warning: Can only detect less than 5000 characters

Warning: Can only detect less than 5000 characters