Ada a';安全关键';语言?

Ada a';安全关键';语言?,ada,Ada,我试着在谷歌上搜索,并在网上阅读了一些片段。为什么Ada是一种“安全关键”语言?我注意到的一些事情是 没有指针 指定范围(此类型为整数,但只能为1-12) 明确说明函数参数是out还是in/out 基于范围的循环(以避免绑定错误或绑定检查) 其余的语法我要么不理解,要么不明白它是如何帮助它成为“安全关键型”的。这些是一些要点,但我看不到全局。它是否有我看不到的合同设计?它是否有使代码更难编译的规则(如果有,有哪些规则?)为什么它是一种“安全关键型”语言?所有这些都适用于安全关键型应用程序;但

我试着在谷歌上搜索,并在网上阅读了一些片段。为什么Ada是一种“安全关键”语言?我注意到的一些事情是

  • 没有指针
  • 指定范围(此类型为整数,但只能为1-12)
  • 明确说明函数参数是out还是in/out
  • 基于范围的循环(以避免绑定错误或绑定检查)

其余的语法我要么不理解,要么不明白它是如何帮助它成为“安全关键型”的。这些是一些要点,但我看不到全局。它是否有我看不到的合同设计?它是否有使代码更难编译的规则(如果有,有哪些规则?)为什么它是一种“安全关键型”语言?

所有这些都适用于安全关键型应用程序;但是也要考虑分配一个布局(向下到位)的能力,以及(可选地)指定这样的记录只能在某个位置(对像视频内存映射之类的东西有用)的能力。 考虑到许多安全关键应用程序也没有标准(在“广泛分布”和向前可比性的意义上)接口;例如:核反应堆、火箭发动机(工程本身因代而异*),飞机模型

即将发布的Ada 2012标准确实有实际合同,以前置和后置条件的形式;示例(摘自):

另外,另一件被忽略的事情是从
访问
/指针类型中排除
Null
的能力;这很有用,因为您可以a)在子程序参数中指定排除,b)简化算法[因为您不必在每次使用时都检查null],c)让异常处理程序处理(我假设)null的异常情况


*阿里安5号灾难的发生正是因为管理层忽视了这一事实,让程序员使用了错误的规范:阿里安4号的规范。

好吧,这很简单。有很多Ada sytax似乎与语言“安全关键性”(无论对语言意味着什么)没有多大关系的原因是,这不是Ada的设计目标。它被设计成一种通用编译系统的编程语言,足以使美国国防部摆脱它必须支持的所有小型通用语言


最终的结果是一种对安全关键应用非常有用的语言,这一事实只是一个令人高兴的副作用,因为该语言在设计时考虑到了军事应用(在军事应用中,软件的可靠性往往是生命的赌注)


令人惊讶的是,很少有其他现代语言支持将构建可靠的软件作为设计目标。大多数语言似乎都是由一个“天才”黑客炮制的,其主要目标是能够快速生成大量代码,也许是黑客喜欢的某种新方式。

Ada对实时性有着卓越的支持。这允许程序员实现更大程度的决定论,而不必担心编程语言本身的技术细节。虽然Ada支持的许多运行时特性都可以在C语言中实现,但对事物有一些深入的了解,Ada实现了大多数实时特性,因为它是标准化的。Ada甚至有一个Ravenscar配置文件和SPARK计算机语言,其中“高度可靠的操作至关重要”是基于Ada 83和95的子集。我的猜测是SPARK没有更高版本的Ada b/c版本,现在说新版本有多安全还为时过早。在后一篇文章中还提到,Ada可以针对与C相媲美的速度进行优化,这对于在快速变化的事件中依赖精确控制的实时应用非常重要。实时控制有许多内置的标准功能,对于“安全关键”语言来说显然很重要。

AdaCore在这里很好地介绍了Ada 2005的各种安全功能:

很久以前,美国政府和业界还对程序可靠性进行了研究,对语言进行了比较。我无法很快找到一个,因为这些网站都是旧的(!),但这里引用了DDCI网站上的一句话:在80年代进行的研究中,艾达始终优于Pascal、FORTRAN和C等已建立的编程语言,90年代,艾达在性能评价、效率、维护、风险和生命周期成本等方面的性能评价中超越了C++。 在下面的链接中列出了他们在Commanche项目中使用它的原因。我要补充的是,平台实现已经存在了很长一段时间并且保持稳定。正如文章中的一位消息人士所说,维护是大部分成本的来源。我们已经看到现代竞争者.NET和Java的疯狂变化。Ada的长期稳定性对sa更好fety-critical应用程序通常部署时间较长(有时长达数十年)

另一个好处是艾达是为跨语言开发而设计的。我在新闻中看到人们谈论.NET和JVM是如何创新的B/C,他们让你把“正确的工具”混入一个系统中。艾达的能力已经很长一段时间了。应用程序通常是艾达、C、C++、汇编程序等的混合体(Multos CA的出现)。而且它们仍然运行良好

它也不是静态的。他们一直在更新该语言,最近一次是在2012年。它的可移植性使它能够在JVM和.NET上运行,也适合那些需要库或在这些库上有大量现有代码的人。还有来自IBM、Aonix、AdaCore和Green Hills的Ada开发工具和许多操作系统和RTO的健壮运行时

最后一个好处:如果它能够编译,它就会工作。通常
generic
   type Item is private;
package Stacks is

type Stack is private;

function Is_Empty(S: Stack) return Boolean;
function Is_Full(S: Stack) return Boolean;

procedure Push(S: in out Stack; X: in Item)
with
    Pre => not Is_Full(S),
    Post => not Is_Empty(S);

procedure Pop(S: in out Stack; X: out Item)
with
    Pre => not Is_Empty(S),
    Post => not Is_Full(S);

Stack_Error: exception;

private
 -- Private portion.
end Stacks;
size_t get_index(const Monomial & t, const Monomial & u) {
    get_index(t, u.log()); // forgot to type "return" first...
}
int a;
scanf("%d", a); /* left out & before the a */