为什么要使用Ada语言对系统进行编程



Ada编程语言诞生于1970年代中期,当时美国国防部和英国国防部决定为嵌入式计算系统替换数百种专门的编程语言,而嵌入式计算系统已越来越多地用于军事项目。 Ada语言的开发方式使它成为唯一能够在所有这些嵌入式系统上运行的语言,并同时确保可靠性和性能不低于专门的语言。

从1995年进行更新之后,该语言就适应了通用系统,增加了面向对象的程序设计,而又没有忽略关键值-可靠性,支持的简便性和效率。 如今,用Ada编写的软件不仅构成军事装备的基础,而且还构成航空电子和空中交通管制系统领域的商业项目的基础。 Ada代码控制着诸如Arian 4和5之类的导弹,许多卫星以及无数其他可能造成严重后果的其他系统。

也许Ada适合在您的下一个嵌入式项目中使用。

军事质量计划


为了选择一种新的编程语言,国防部组建了一个“ 高级语言工作组 (HOLWG)”,该组由军事和科学专家组成,其任务是汇编查询列表并选择候选语言。 结果,所谓的 “ Stillman的要求 ”:

请求的要点是:

  • 灵活的通用工作流程,可满足嵌入式计算应用程序的需求。
  • 可靠度 该语言应有助于可靠程序的设计和开发。
  • 轻松的支持。 代码应易于阅读,软件解决方案应清晰易懂。
  • 易于产生有效的代码。 应该可以轻松地识别低效的设计。
  • 没有不必要的复杂性。 语义结构应保持一致,并尽量减少概念的数量。
  • 从车上独立。 该语言不应与操作系统或硬件的任何详细信息联系在一起。
  • 完整的定义。 语言的所有部分都必须完整且明确地定义。

该报告的结论是,针对软件问题的第一道防线是防止程序员犯错误。 通过消除发生细微错误的可能性,例如通过隐式类型转换或其他危险的构造,我们可以自动使代码更安全并且更易于维护。

该小组的结论是,尽管当时没有一种语言适合国防部的需要,但创造一种适合所有这些问题的新语言是很现实的。 四位设计师完成了这项工作。 中间选择过程选择了两种最合适的工作方法,结果,只有一种语言赢得了比赛,并获得了“ Ada ”的称号



内置默认保护


地狱中的类型系统不仅严格,而且有时称为超严格,因为它不允许任何隐式类型转换。 以下面的C代码片段为例:

typedef uint32_t myInt; myInt foo = 42; uint32_t bar = foo; 

这是有效的代码; 它会编译,启动并产生明显的结果,表明生命,宇宙等主要问题的答案。 在地狱中,这将不起作用:

 type MyInt is Integer; foo: MyInt; bar: Integer; foo := 42; bar := foo; 

编译器将引发错误,因为Integer和MyInt不是同一件事。 这种方法的主要优点是,如果程序员随后更改类型定义,则整个代码库中成千上万的隐式类型转换将不会使程序崩溃。 相反,必须显式地转换类型-这样可以促进良好的代码,防止“完全相似”的类型引起混淆。

任何陷入C,Linux和Win32类型标准定义混合的程序员都可以体会到无需遍历无数文档页面和格式不佳的代码来了解哪个typedef或宏包含仅包含某些内容的真实定义的程序员这会阻止编译或在调试过程中爬出。



Ada在编译和启动阶段在检查中添加了其他保护层。 在Ada中,程序员必须为块和变量值应适合的边界明确指定关闭语句。 Ada并未定义int或float之类的标准类型,但要求程序员从一开始就创建具有特定范围的类型。 字符串也是如此-除了无限的字符串外,所有字符串的长度都是固定的。

在操作阶段,您可以检查错误,例如对内存的不正确访问,缓冲区溢出,超过设置的限制,错误±1,对阵列的访问。 然后可以安全地处理它们,而不必删除整个应用程序。

Ada实现了引用类型的模型,而不是低级指针。 默认情况下,每种引用类型都由内存池处理,或者在必要时由特定程序员处理,以使用更多奇特的NUMA内存实现。 程序员永远不必直接访问内存;他必须使用内存池处理程序。

最后,编译器或程序在运行时决定如何向函数传递数据或从函数传递数据。 尽管有必要指出每个参数(“ in”,“ out”或“ in out”)的传输方向,但有关数据是通过寄存器,堆还是通过引用传输的最终决定是由编译器或程序在运行时做出的,但不是程序员。 这样可以防止堆栈溢出问题。

Ravenscar档案SPARK方言是Ada的子集,后者主要关注合同。 随着时间的流逝,这些子集的功能已转移到主要语言的规范中。

今天的Ada编程


ANSI于1983年制定了Ada 83规范。随后,英特尔80286刚刚发布,而摩托罗拉68000才问世。 那是家用计算机的曙光,也是从1970年代到80年代笨拙的过渡,那时微控制器开始流行。 想象一下英特尔8051微控制器及其令人惊叹的4kb EPROM和128B RAM。



今天流行的微控制器的功能是1983年的微控制器的许多倍。您可以使用任何ARM,AVR,RISC-V等。 (或Lego Mindstorms NXT套件)并开始使用相同的基于C的工具进行开发,因此流行的GNAT Ada编译器基于GCC也就不足为奇了。 DragonEgg项目中还在开发基于LLVM的工具。

有两种版本的基于GCC的Ada工具。 AdaCore选件在商业上受到支持,但是具有其自身的特征。 Free Software Foundation选项自然是免费的,其功能可与AdaCore媲美。

为了轻松起步,请使用与AdaCore捆绑在一起的GNAT编程工作室 IDE(GPS)( Github上副本 ),或者在文本编辑器中编写代码并手动进行编译,或者使用Makefiles。 这里的工具包比C或C ++的工具包要复杂一些,但是gnatmake实用程序促进了开发,该实用程序包括所有工具,并且大致类似于GCC。



由谦卑的仆人编写的Ada 但不平凡的项目的示例,它是命令行参数解析器。 您可以在ada / project文件夹中找到Makefile,在该文件夹中定义了文件夹,您可以在其中找到软件包说明文件(.ads)和软件包本身(.adb)。

这些文件大致对应于带有C和C ++的标头和代码的文件,但是它们也具有重要的区别。 与C不同,Ada没有预处理器,并且她没有组合代码和头文件来创建编译文件。 而是有一个指向规范中指定的程序包名称的链接。 .ads文件的名称也不必与软件包的名称匹配。 这提供了极大的灵活性,并防止了C中具有循环依赖性的常见问题或需要以特定顺序链接标头。

接下来要去哪里


下载完GNAT工具包后,启动GPS或Vim / Emacs,并观察空白页面上闪烁的光标一会儿,您可以考虑从哪里开始。 幸运的是,我们最近介绍了使用PicoRV32 RISC-V内核的基于Ada的项目 。 它使用流行的ICE40LP8K CPLD,开放源FPGA(例如Yosys)支持该LD。



在文档方面,有专为Java和C ++开发人员设计的入门文章AdaCore 参考,WikiBooks参考 ,当然还有Ada 2012文档中的Programming 。 除了945页的Ada 2012语言参考手册 (LRM)外,这些可能是最全面的参考。

Ada语言虽然是编程爱好者的一种罕见的语言,但它是一种完全开放的语言,具有可靠的开发工具和商业支持,可用于创建从洲际弹道导弹和F-15到医疗设备固件的所有软件。 尽管这是一种相当复杂的语言,但是如果您超出了基本限制,则绝对应将其包括在项目中曾经使用过的语言列表中,甚至可以使简历看起来更酷。

Source: https://habr.com/ru/post/zh-CN469671/


All Articles