专门用于简化静态验证的语言

时间:2010-07-02 18:10:25

标签: programming-languages static-analysis

许多语言(可能都是这些语言)旨在使编写程序更容易。它们都有不同的领域,旨在简化这些领域的开发程序(C使开发低级程序更容易,Java使开发复杂的业务逻辑更容易,等等)。为了以更容易,更自然,更不容易出错的方式编写和维护程序,可能会牺牲其他目的。

是否有专门用于验证源代码的语言 - 即。静态分析 - 更容易?当然,为现代机器编写通用程序的能力也应该持续存在。

7 个答案:

答案 0 :(得分:5)

Ada的设计目标之一是支持一定数量的正式验证。它取得了一定程度的成功,但验证并没有像他们希望的那样完全起飞。幸运的是,阿达的好处远不止于此。可悲的是,这也没有太大帮助......

有一个名为Spark的Ada子集,可以让它保持活力。 Praxis销售围绕它构建的开发套件。

答案 1 :(得分:3)

  

是否有专门用于验证源代码验证的语言?

这是CLU和ML语言的模糊目标,但我所知道的唯一真正认真对待静态验证的语言是Spark Ada。

Dijkstra的守卫命令语言(如编程规则中所述)旨在支持静态验证,但明确不应该实施。

Gerard Holzmann的Promela语言也是为模型检查器SPIN进行静态分析而设计的,但它也不是可执行的。

答案 2 :(得分:3)

E语言中的

Auditors提供了一种在语言本身内编写代码分析的内置方法,并要求某些代码段通过一些静态检查。您可能也对本文的相关工作部分感兴趣。

答案 3 :(得分:1)

SAIL,静态分析中间语言或Flexibo

答案 4 :(得分:1)

我自己没有使用它,所以我不能说任何权威,但我知道Eiffel编程语言的设计是使用Code by Contracts,这会使静态分析变得更容易。我不知道这是否重要。

答案 5 :(得分:1)

在“使源代码验证更容易”方面存在两个问题。一种语言,你不会做任何事情(如C)等事情。 另一个是指定你要验证的内容,因为你需要一个好的断言语言。

虽然许多语言都提出了这样的断言语言, 我认为EDA社区一直在用时间规范最有效地推动这个问题。 “财产规范语言”是一个标准;您可以从P1850 Standard for PSL: Property Specification Language (IEEE-1850)了解更多信息。 PSL背后的一个想法是,您可以将其添加到现有的EDA语言中;我认为随着时间的推移,EDA社区已经融入EDA语言。

我经常希望像PSL这样的东西嵌入传统的计算机软件中。

答案 6 :(得分:0)

静态验证是此任务的一个糟糕开端。它基于一种假设,即可以自动验证程序的正确性。它在现实世界中是不可行的,并且期望程序在没有任何提示的情况下检查任意复杂的代码只是简单的愚蠢。通常,用于静态验证的软件最终需要在整个源代码中提示,并最终产生大量误报和漏报。它有一些利基,但就是这样。 (参见Pierce对“Types and programming languages”的介绍)

虽然这些工具是由工程师为了自己的简单目的而开发的,但真正的解决方案已经在学术界烘焙。结果发现,静态类型编程语言中的类型等同于逻辑语句,因为一切顺利,语言没有某种不良行为。这称为“Curry-Howard correspondence”,逻辑嵌入到类型中的是“Brouwer-Heyting-Kolmogorov logic”。最强大的证明只能在强大类型的语言中使用:dependent types。如果我们暂时忘记所有这些术语,这意味着我们可以编写programs that carry proofs它自己的正确性,并在程序编译时检查这些证明,如果失败则不会给出可执行文件。

这种方法的积极方面是你永远不会得到任何false negatives,即编译的程序保证根据规范正常工作。即使没有关于规范的额外证据,依赖类型语言的程序也不容易出错,因为除以零,未处理的异常和溢出的划分永远不会在可执行程序中结束。

总是手工编写这样的证据是单调乏味的。为此,有“tactics”,即产生正确性证明的程序。这些几乎等同于静态验证程序,但与它们不同,需要生成正式证明。

出于不同目的,有一系列依赖类型的语言:CoqAgdaIdrisEpigramCayenne等。

战术是用Coq实现的,可能还有几种语言。此外,Coq是其中最成熟的,其基础设施包括Bedrock等库。

如果从Coq中提取C代码不足以满足您的要求,您可以使用ATS,这与C的性能相当。

Haskell使用了Curry-Howard函数的弱形式:它工作正常,除非你开始编写失败或永远循环的程序。如果您的要求不是很难写出正式证明,请考虑使用Haskell。