本文是其中的一部分嵌入式软件系列:使用Ada契约强制编码
软件开发人员和他或她的编程语言之间的关系有时似乎遵循着浪漫/婚姻中常见的弧线:疯狂的迷恋、短暂的蜜月、不切实际的期望、现实和不兼容,然后分居或也许是没有激情的同居。关键问题是,下一步怎么办?是痛苦的离婚,寻找新伴侣,还是和解,重新燃起热情?
在ADA的情况下,由于ISO(国际标准化组织)最近批准的新ADA 2012标准,智能金钱是后一种结果。有一段时间,ADA的常见感知是由C ++和Java等性感竞争所取代的利基语言。这种感知是相当扭曲的。ADA仍然被大量用(尽管在可靠性至关重要的行业中,但也许没有与早期的潮气一样多。重要的是,语言不站立;它正在进行一些重要的增强,响应真实的用户需求,并考虑到软件和硬件领域的技术趋势。新刷新和恢复活力,Ada很好地抓住了今天软件开发人员的心灵和思想。
ADA 2012最令人兴奋的补充是作为基于合同的编程的设施。该概念很简单:诸如子程序的程序元素旨在满足特定的软件要求(“合同”),因此这些程序元素的语法应该支持指定这些要求。作为一个具体示例,子程序的合同包括其前提条件(子程序在条目上假设的属性)及其后期后的属性(子程序对退出时的属性)。图1示出了与插入过程相关联的合同的示例,用于将元素添加到简单的队列。可以通过编译器或补充分析工具静态检查合同,或使用运行时检查强制执行。
Queue: array (1..N) of Float;Last: Integer:= 0;——最后一个元素过程的索引插入(X: Float), Pre =>最后在0 ..N-1, Post =>最后在1 ..N和队列(最后)= X;
基于合同的编程是一种越来越重要的软件开发风格,特别是在可靠性,安全和/或安全性至关重要的高完整性系统中。它适用于静态分析,并有助于满足认证目标,如正式方法补充到DO-178C航空电子软件安全标准[1]。一个工具可以试图证明子程序的后期后兴能从其前提条件衍生出来,或者发现否则发现对位分裂。合同也可用于显示程序不会具有运行时错误。合同的想法并不新鲜,但ADA现在是最广泛使用的语言,包括明确的支持,作为标准语法和语义的一部分(例如,与风格化评论相比)。这意味着合同始终与程序同步,可以由任何符合语言标准的任何编译器处理。
将基于契约的编程与该语言现有的面向对象编程功能集成是一个挑战,特别是如何管理继承与前置和后置条件的交互。Ada 2012通过提供与Liskov替换原则[2]一致的语义来解决这个问题,该原则实际上确保了子类作为其超类的专门化。
除了基于合同的编程之外,ADA 2012在实时调度,多处理器和多核支持和预定义库中增加了重大增强功能。语言修订还包括各种小的改进,沿着整个松散的末端。
Ada设计一直关注于可靠性、可读性和错误的早期检测。Ada 2012意义重大,因为这些目标在当今软件密集和相互关联的世界中变得越来越重要。20年前在独立系统中造成不便的漏洞,现在可能会产生深远的影响,造成重大的经济损失,甚至可能造成生命损失。从某种意义上说,软件行业已经赶上了Ada。此外,Ada 2012的一些特性,比如基于合同的编程,使用起来很有趣。语言修订版认识到表示法的表现力和便利性很重要,因此Ada 2012提供了一种自然、简洁(但可读)的语法,包括量化和条件表达式。
简而言之,如果软件开发人员采取清新彻底的观察ADA 2012,则可能有一种新的火花。
从中阅读更多嵌入式软件系列:使用Ada契约强制编码
参考文献
- RTCA / EUROCAE DO-178C / ED-12C。2011年12月的机载系统和设备认证软件考虑。
- B. Liskov和J. Wing。“子类型的行为概念”,《ACM编程语言和系统学报》(TOPLAS),第16卷,第6期(1994年11月),1811-1841页。