编程语言语义原型制作工具


11

是否有用于对编程语言语义和类型系统进行原型制作的工具,并且还允许对标准属性(例如类型健全性)进行某种模型检查

我之所以这样问,是因为我正在读一本有关Alloy的书,它提供了我想要的确切功能,但是对于使用关系逻辑表示的模型而言。

我知道Ott,但是它没有这种“模型检查”功能,因为它专注于为证明助手系统生成代码。

任何有关这种工具存在的参考都将是不错的。


1
Ott是第一步,然后在您最喜欢的证明助手中进行模型检查。
吉尔斯(Gillles)“所以-别再邪恶了”

@Gilles:好的,但是模型检查工具的一点是,它会生成给定大小的整套元素,以检查该属性是否确实对它们有效。这样,我将需要为每种定义的语言编写该生成部分的代码。您知道是否有任何方法可以自动执行此生成步骤吗?
罗德里戈·里贝罗

从技术上讲,您可以在校对助手中(至少在诸如Coq这样的助手中)执行此操作,但是它可能会非常慢。证明助手面向人工辅助的证明,而不是自动尝试数百万种方法来解决问题。如果要重用Ott,可以为自己喜欢的模型检查器添加后端。
吉尔(Gilles)'所以

Answers:


8

尽管有些框架是专门为对编程语言进行原型设计(包括它们的语义,类型系统,评估以及检查它们的属性)而创建的,但是最佳选择取决于您的特定情况和特定需求。

话虽如此,您可能会选择多种选择(可能并不那么独特)(其中包括您已经提到的替代方法):

  • 使用设计用于创建新语言和对新语言进行原型设计的特定语言/框架:例如,Redex [1],这是一种嵌入在Racket中的领域特定语言,用于指定和检查编程语言的(操作)语义,并给出了语言的定义语言,可轻松处理诸如排版(在Latex中),检查还原痕迹,单元测试和随机测试(例如,用于检查打字)的任务
  • 使用可以轻松定义和执行某些分析的通用建模语言,只要它们可以在需要的范围内捕获手头的特定语言即可;Alloy [2]是这种方法的一个示例:尽管非常通用和灵活,但是语言可以建模为状态之间的关系,而在用a表示语义后,就可以免费获得模型检查(例如,使用这种语言进行评估)的支持。关系模型(例如,可以在[3]中找到一些建模语言语义的想法)
  • 使用定理证明器嵌入语言以检查其属性;可以通过将示例语言及其语义嵌入到像Coq [4]这样的证明系统中来定义该语言及其语义(有关此方法的更多详细信息,以及在[[q]中对Coq深层和浅层嵌入之间的区别进行了讨论和演示)。 5])
  • 使用Ott(如前所述,其精神与Redex相似,但提供一种新的定义语言而不是被嵌入);Ott允许您以方便的符号定义编程语言,并在校对系统(通常带有深度嵌入)中产生排版和定义,在该系统中,大多数检查(即校对)需要手动执行
  • 开发语言及其语义,以及使用通用编程语言“从头开始”进行适当的检查(例如作为测试),并在需要时翻译成其他系统以进行检查(某些语言,例如Leon [6],包括内置的验证程序,这些验证程序可以自动验证某些属性,并使此方法类似于嵌入到证明系统中)

请注意,在使用框架/工具的难易程度(例如,在纸上或在Latex中进行定义一样容易)与检查语言属性的机制(例如嵌入语言)之间的权衡之间需要权衡定理证明者中的语言可以检查非常复杂的属性)。

[1] Casey Klein,John Clements,Christos Dimoulas,Carl Eastlund,Matthias Felleisen,Matthew Flatt,Jay A. McCarthy,Jon Rafkind,Sam Tobin-Hochstadt和Robert Bruce Findler。运行您的研究:轻型机械化的有效性。POPL,2012年。

[2] 丹尼尔·杰克逊。合金:一种轻量级的对象建模符号。TOSEM,2002年。

[3] Greg Dennis,Felix Chang和Daniel Jackson。SAT的代码模块化验证。ISSTA,2006年

[4] Coq正式证明管理系统

[5] 关于程序的形式推理。亚当·克莱帕拉(Adam Chlipala),2016年

[6] Leon自动化系统,用于验证,修复和综合功能性Scala程序

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.