关于Dijkstra:教学编程和形式方法

Teaching programming and formal methods

这是一个奇怪的问题。我正在写一本关于学习使用正式方法编程的书,我将把它瞄准有一些编程经验的人。我们的想法是教他们成为高质量的程序员。

基本符号将来自Dijkstra的编程规则,以及一些并发性和通信扩展。

与EWD不同,我希望我的学生最终能够编写实际的可执行程序。这意味着在某种程度上从EWD符号翻译成其他语言。当我第一次开始进行正式编程时,我的目标是C,但是你最终写了很多管道,加上处理指针等的复杂性,Ruby是一个明显的可能目标,Scheme或Lisp也是。但是也有各种各样的函数语言;由于我对并发特别感兴趣,Erlang似乎是一种可能性。

所以,最后,我的问题是:我应该教我的读者什么语言来针对他们正式开发的程序?


查理,

我一直将Dijkstra的杰作与一个编程模型联系在一起,在这个模型中,中心阶段被循环和数组占据。如果你坚持使用dijkstra(例如,计算最薄弱的前提条件),我认为你会发现函数语言并不适合。在为使用循环和数组的命令式编程提供良好支持的流行语言中,也许Python携带的额外负担最少。

这并不是说功能语言不适合形式化的方法——它们非常适合——但是风格与dijkstra有很大的不同。首选的方法强调计算证明;参见理查德·伯德的《关于解数独的论文》(这很难)或理查德·伯德和菲尔·韦德勒的教科书。

对于并发性,它很大程度上取决于您所相信的并发性模型(以及什么形式的方法)。JohnReppy的并发ML是一个漂亮的消息传递模型。二郎也有一个很好的干净的限制模型。另一方面,使用锁和关键部分进行编程是如此困难,在这种情况下,形式化方法可能会更有好处。

其他两条可能对你的背景研究感兴趣的通行评论:

  • 我见过的唯一一个将Dijkstra的方法应用于实际系统的程序员是Greg Nelson,他在模块3中工作。(格雷格和马克·马纳西一起写了栈桥窗户系统。)模-3是一种非常好的语言,数字技术可以通过无缺点和不称职而消亡。格雷格有一篇很好的托普拉斯论文,是关于狄克斯特拉微积分的延伸。

  • GerardHolzmann的建模语言spin直接基于Dijkstra的保护命令语言,并且支持并发性。它的目的是模型检查,而不是编程,并且有一些特性,但是与正式方法有很强的联系,能够对断言进行模型检查真的很棒。任何对正式方法感兴趣的人都会想看看。

(编辑:这里有格雷格·纳尔逊论文的链接,或者其中一篇。-客户关系管理)


忽略你最喜欢的编程语言答案,我可以看到两个有用的答案:

一方面,您试图向假定为中间程序员的对象演示方法。如果你选择一种语言并祝福它成为你的书中的语言,你可能会疏远潜在的读者,因为某种原因,他们不会喜欢这种语言。因为您演示的是方法,所以您可以使用语言片段来简明地说明您的观点。例如,用于演示RIIa的唯一语言可能是C++,但是这一语言对于显示如何执行源分析来说很差。方案是源代码分析的理想选择,但不能为您提供许多探索强类型的优点(和缺点)的选项。使用多种语言。

另一方面,由于您主要掌握编程方法,我不完全确定您是否需要任何真正的语言。一个定义良好的符号也很好,它会迫使读者关注你的观点,而不是一种语言或另一种语言的表面细节。


我是靠口齿不清和计谋长大的,喜欢他们两个。我认为他们是从零开始学习的伟大语言。但是,我不确定有编程经验的人会使用这些语言。如果你的书的书名是Scheme,那么你在亚马逊上的点击率就不会太高。:)

C是一种非常容易学习的语言,它具备了很快深入到并发性等主题所需的所有基础知识。它具有更大的适用性,因为您也可以针对OO和Web概念。它也相当流行,你会让公司为他们的员工的书籍付费,这对销售总是有利的("Be Kick Ass C Programmer"在费用报销表上比"Concurrency in Modern Lisp"做得更进一步)。

F是一种有趣的语言。它具有Lisp或Scheme的功能美(虽然不是很好,但几乎可以),它让您能够深入了解OOP主题,如果您想增加趣味性,还可以连接到用于UI的.NET框架。但是,现在,它是模糊的。

我不能和鲁比说话,所以就我个人而言,我会咬紧牙关,和C一起走。


老实说,我不能推荐鲁比。当我在商业世界中日复一日地编程时,我非常喜欢它,当然远不止C语言或Java语言。但它的语义定义太不明确,以至于我不相信它是C语言的一半,尽管我可能会花几个小时来讨论一个声明,并咨询取代K&R的更厚的白皮书,但最终我还是相当确信,如果我有一个符合标准的编译器(是的,我知道,我是一个梦想家,但在这里与我合作),我会噢,从另一边出来的是什么。

鲁比在很多方面都很出色,但就任何正式的事情来说,他永远不会遇到。

我自己也倾向于投哈斯克尔的票,因为每当我转过身来,我都会惊讶于在这种语言定义中,每件事都有多有意义。(诚然,在经历了一年左右的时间之后,我确信我甚至没有探索过哈斯克尔98的一半。)

我也理解,Dikjstra和功能性的事情;回头看他的论文,他在一个命令式的世界里非常重要;我没有资格说他是否真的走错了方向。也许我只是被他的写作和思想所淹没。但这似乎让他高兴,那么使用algol60呢?


有相当多的大学使用完美的开发人员来教授正式的方法(免责声明:我与此产品有关)。它围绕一种语言构建,用于表示规范、数据精化和算法。它有一个用于验证的自动定理证明器,和一个代码生成器,可以生成C++、C语言和Java。pd的设计很大程度上受到了"编程的一门学科"的启发,但是我们发现对于大型系统来说,符号是不实际的,因此符号与dijktra有些不同。


我认为你应该在你的书中使用的语言方面有相当多的经验,或者有一个精通代码审查的人。

就我个人而言,我会使用通用的Lisp,因为我熟悉它,并且它是实现任何概念的一种很好的语言。其他选项可能是Erlang、Haskell、Ruby或Python,甚至可能是一些ML方言。我对C族有偏见(包括C和Java),它们似乎停留在对概念的较低层次上。


这是个好主意。我认为方案是一个很好的选择,因为它允许人们以最少的基本要素(以库的形式)实施不同的抽象。从方案到验证系统(如pvs)的转换也很容易(http://pvs.csl.sri.com/)

干杯