Programming languages 教学程序设计与形式化方法

Programming languages 教学程序设计与形式化方法,programming-languages,dijkstra,formal-methods,Programming Languages,Dijkstra,Formal Methods,这里有一个奇怪的问题。我正在写一本关于学习使用形式化方法编程的书,我将把它面向有编程经验的人。这个想法是教他们成为高质量的程序员 基本符号将来自Dijkstra,以及一些并发和通信扩展 与EWD不同,我希望我的学生最终能够编写实际的可执行程序。这意味着在某种程度上,从EWD符号转换为其他语言。当我第一次开始做正式编程时,我的目标是C,但最终你会编写大量的管道,再加上处理指针等的所有复杂性。Ruby显然是一个可能的目标,Scheme或Lisp也是。但是也有各种各样的函数语言;因为我对并发性特别感兴

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

基本符号将来自Dijkstra,以及一些并发和通信扩展

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

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

这是个好主意。 我认为Scheme是一个很好的选择,因为它允许人们(以库的形式)以最基本的要素将不同的抽象付诸实践。 也可以很容易地将scheme转换为PVS()之类的验证系统


干杯

我是在Lisp和Scheme的环境中长大的,我喜欢它们。我认为它们是从零开始学习的好语言。但是,我不确定有编程经验的人会喜欢这些语言。如果你的书标题中有Scheme,你将不会在亚马逊上获得很多点击率。:)

C#是一种非常容易学习的语言,它具备了快速深入研究并发性等主题所需的所有基础知识。它具有更大的适用性,因为您也可以针对OO和web概念。它也相当流行,你可以让公司为他们的员工书籍付费,这对销售总是有好处的(“做一个优秀的C#程序员”在费用报销单上比“现代Lisp中的并发性”更重要)

F#是一种有趣的语言。它具有Lisp或Scheme的功能之美(虽然不完全如此,但几乎如此),如果您想增加趣味性,它可以让您深入到OOP主题中,也可以钩住.NET Framework的UI内容。但是,现在,这还不清楚


我不能和Ruby说话,所以就我个人而言,我会咬紧牙关,选择C

我认为你自己应该对你写书时使用的语言有一定的经验,或者有人能熟练地检查你的代码


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

忽略了显而易见的答案,我可以看到两个有用的答案:

一方面,您试图向假定为中级程序员的对象演示方法。如果你选择一种语言,并祝福它作为你的书籍语言,你可能会疏远那些出于某种原因而不喜欢这种语言的潜在读者。既然您正在演示方法,那么您就可以在语言中使用恰好能简要说明您的观点的片段。例如,唯一可以用于演示RIIa的语言可能是C++,但是这一语言对于显示如何执行源分析来说很差。Scheme是源代码分析的理想选择,但它并没有为您提供很多选项来探索强类型的优点(和缺点)。使用多种语言

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

Charlie

我总是把Dijkstra的杰作与一个编程模型联系在一起,在这个模型中,循环和数组占据了中心舞台。如果你坚持使用Dijkstra(例如,计算最弱的先决条件),我想你会发现函数式语言并不适合。在为使用循环和数组的命令式编程提供良好支持的流行语言中,Python的附加负担可能最少

这并不是说函数式语言不适合形式化方法——它们非常适合——但其风格与Dijkstra截然不同。首选方法强调计算证明;请参阅理查德·伯德关于解决数独问题的论文(这很难),或理查德·伯德和菲尔·瓦德勒的教科书

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

您的背景研究可能会感兴趣的另外两个附带评论:

  • 我见过的唯一一个将Dijkstra的方法应用于实际系统的程序员是Greg Nelson,他在Modula-3中工作。(格雷格和马克·马纳斯共同编写了支架窗口系统。) Modula-3是一种非常好的语言,数字技术允许它因无能和无能而消亡。Greg有一篇关于Dijkstra微积分扩展的很好的TOPLAS论文

  • Gerard Holzmann的建模语言直接基于Dijkstra的保护命令语言,它还支持并发。它的目的是模型检查,而不是编程,并且有一些特性,但与形式化方法有很强的联系,并且