如果您学习了软件的形式化方法,您发现它有多有用?


17

如果您已经接受过使用形式化方法(FM)进行编程的培训,则:

  • 您发现它有用吗?
  • 您的FM培训涉及什么(例如一门课程,一本书)?
  • 您使用什么调频工具?
  • 与不使用FM相比,它在速度/质量上有什么优势?
  • 您使用FM创建哪种软件?
  • 如果您现在不直接使用FM,至少值得学习吗?

我很想听到在这个社区中可以找到的尽可能多的FM经验/观点。我开始阅读它,并想了解更多。

背景

编程和软件开发/工程是地球上最新的人类技能/专业,因此,该领域并不成熟也就不足为奇了-在我们领域的主要输出中显示出来,因为代码通常很晚且容易出错。平均编码和顶级编码器之间的生产率差异很大(至少10:1)也表明了行业的不成熟。这些令人沮丧的事实已在文献中得到了很好的报道,并被史蒂夫·麦康奈尔(Steve McConnell)的《密码大全》(Code Complete)等书所介绍。

软件/ CS中的主要人物(例如,已故的E. Dijkstra)已提出使用形式化方法(FM)来解决错误的根本原因(其中之一):编程中缺乏数学上的严格性。例如,迪克斯特拉(Dijkstra)提倡学生共同开发程序及其证明

与美国相比,FM在欧洲的CS课程中似乎更为普遍。但是在过去的几年中,新的“轻量级” FM方法和诸如Alloy之类的工具引起了一些关注。FM仍远不是行业中的常用方法,我希望在此获得一些有关原因的反馈。

更新资料

截至目前(2010年10月14日),在下面的6个答案中,没有人明确提出要在“现实世界”作品中使用FM。我真的很好奇有人是否可以并且愿意。也许FM确实说明了学术界(FM是未来!)和行业(FM几乎没有用)之间的鸿沟。


关于您的更新,也许没有人为FM在“现实世界”工作中的使用而争论不休,因为在现实世界工作中几乎没有使用它们的用例
Richard

Answers:


8

对于任何无关紧要的东西绝对没有用。

我有一门叫做“形式方法”的课程,它的重点是合金-我在任何地方都看不到使用它。还有另一堂课专注于使用LTSA进行并发建模-同样没用。

问题在于,软件中的大多数错误和问题(至少以我的经验)是由低于这些工具抽象级别的复杂性引起的。


感谢分享; 您是否说FM培训至少对以后的工作有所帮助,例如帮助您更清晰地思考?或不?
limist 2010年

@limist:我真的不这么认为。我的意思是,我有点喜欢Alloy,但我认为这对扩大我的想法没有帮助。
Fishtoaster

2
这正是我会给出的答案。我在大学里上过的最完全多余的课,不是我曾经回顾过的东西,也很高兴我学到了。我认为问题的根源在于正式规范必须比代码更复杂才能正确建模,因此对于任何远程复杂的代码来说,创建它的正式模型都是一项艰巨的任务,以至于我可以不能想象任何硬件设计或类似不可撤销的工作之外的人想要或能够做到。
glenatron 2010年

1
真令人失望。我在想,对于测试您拥有一个相当完整的模型可能会很有用;尽管实际的错误通常是在模型下方(增加互斥锁或其他),但我认为使用Alloy来查找模型本身的缺陷会很有用。(从直觉上来说,尝试使用校对助手似乎不太有用;我希望反例会更有用,而且在合金之类的领域似乎更多(尽管理想情况下,我认为能够接近无论是在同一系统))。
布鲁斯·斯蒂芬斯

7

我有CSP(通信顺序过程)的背景。我不是在吹牛,而是我写了有关定时CSP的硕士论文,尤其是将以正式方法编写的“编译”规范写成可执行C ++。我可以说我对正式方法有一些经验。一旦完成学位并获得了该行业的工作,我根本就不会使用正式的方法。形式化方法仍然过于理论化,无法在工业中应用。形式化方法已经在嵌入式系统领域找到了一些实际应用。例如,NASA在其项目中使用形式化方法。我推测正式方法远没有在业界广泛采用。用正式的方法编写软件规范,然后将其“人工解释”到您选择的框架中根本没有意义。普通英语和图表可以更好地实现这一点,而单元测试和集成测试在“验证”代码的正确性方面做得很好。我认为正式方法将在学术界保留一段时间


感谢您的分享,我将对此问题经常重复进行询问:您是否说FM培训至少对您的以后工作有所帮助,例如帮助您更清晰地思考?或不?
limist 2010年

恭喜您的主人!
克里斯,2010年

@limist:我会说这是一个很好的理论经验,但是我发现该行业的实际应用很少。
ysolik

4

状态图和Petri网可用于对协议和实时系统进行建模和分析。首先,他们帮助设计解决方案。其次,它们有助于在非常特殊的情况下找到令人兴奋的软件的测试用例。


4

我读过几本关于形式化方法的书,并应用了一些书。我的直接反应是,“天哪,只要我是一名完美的数学家,这些书就告诉我如何成为一名优秀的程序员。” 另一个弱点是您只能证明与另一个正式描述是等同的。为程序编写正式的规范等同于使用高级语言编写程序,并且您无法避免在相当大的规范中引入错误。

我从来没有大规模使用形式化方法。它们可以帮助纠正一些小而棘手的问题,并说服我他们是正确的。这样,我可以处理稍大的构建基块,有时还能完成更多工作。

我所做的一件事更普遍地有用的是不变式的概念,关于程序及其状态的陈述始终是正确的。您可以从中推断出的任何内容都很好。

如上所述,我不是一个完美的数学家,因此我的证明有时包含错误。但是,以我的经验来看,这些错误往往是愚蠢的错误,很容易发现和解决。


4

我上了正规程序分析的研究生课程,我们专注于操作语义学。我完成了关于seL4工作的最后一篇论文,回顾了他们使用的正式方法。在实用性方面,我的主要收获是它具有边际价值。您不仅需要编写程序,还必须编写证明。哇。错误的两个来源。不只是一个。此外,对实际代码有很多限制。正式描述包括 I / O 在内的物理计算机非常困难。


我曾经看到过描述磁带式I / O的经历。作者没有解决方案来正式描述随机访问文件,并且对它们的口臭感到满足。
David Thornley,2010年

1
@David:这些随机访问文件。坏消息。您不想使用它们。=)
保罗·内森

3

去年,TLA +自学成才,此后一直在使用它。这是我启动项目时可以使用的首批工具之一。大多数人会犯的错误是,他们认为形式方法是一事无成的事情:要么您不使用形式方法,要么拥有完整的验证。但是,它们之间有一些关系:正式规范,您在其中检查项目的抽象规范是否不会破坏您的不变式。与验证不同,规范非常实用,可以在工业中使用。

规范语言比编程语言更具表现力。例如,这是分布式数据存储的(非常简单)PlusCal规范:

process node \in 1..5 \* Nodes
variables online = TRUE,
          stored \in SUBSET data; \* Some set
begin 
  Transfer:
    either
      with node \in Nodes, datum \in stored do
        node.stored := node.stored \union {datum};
      end
    or \* crash
      online := FALSE;
    end either;
end process;

此代码段指定了五个节点同时运行,并以任意顺序运行传输,其中每次传输都是到任意节点的任意数据。此外,我们已指定任何给定的传输都可能失败并导致节点崩溃。我们可以在TLA +模型检查器中模拟所有这些行为!这样,我们可以测试无论订单,故障率等如何,我们的要求仍然成立。说到这,让我们添加一些需求。首先,我们从不将数据传输到离线节点:

[][\A node \in Nodes: ~online => UNCHANGED node.stored]_vars

在我们的简化版本中,模型检查器将找到故障状态。我们还可以指定“任何给定的数据都在至少一个在线节点中”:

\A d \in data: \E n \in Nodes: n.online /\ d \in n.stored

这也将失败。祝您通过单元测试检查这些!

规范的主要限制是它独立于您的实际代码而存在。它只能告诉您设计是正确的,而不能正确实施。但是指定比验证更快,并且可以捕获对于测试而言过于微妙的错误,因此我认为值得付出努力。几乎所有涉及并发或多个系统的代码都是正式规范的好地方。


1

在被富士通收购之前,我曾在ICL的一个部门工作。他们签订了一些大型的政府合同,要求证明该软件可以按广告要求工作,因此他们建造了一台采用Z编写的正式规范并在运行时验证代码的机器,其中绿灯或红灯用于通过/失败。

这是一件了不起的事情,但是,正如尊敬的@FishToaster指出的那样,它对于任何琐碎的事情都没有用。


0
  1. 您发现它有用吗?

Petri Nets在计算机编程中的应用非常有用。我创建了基于Petri Nets的方法“ Net Elements and Annotations”(Chionglo,2014年)。自2014年以来,我一直在应用该方法来编写将Acrobat / JavaScript API用于PDF表单应用程序的JavaScript程序。

  1. 您的FM培训涉及什么(例如一门课程,一本书)?

我通过自学对Petri网进行了“培训”。我从教科书“ Petri Nets and Grafcet:离散事件系统建模工具”(David和Alla,1992年)中阅读了有关Petri Nets的章节。我也一直在阅读Petri Nets上的研究论文。在创建并记录了“ Net Elements and Annotations”之后,我练习了数周的时间来应用该方法。

  1. 您使用什么调频工具?

我使用PowerPoint绘制Petri Net图。我使用Word创建注释的表单视图。我也使用Acrobat和Notepad将令牌游戏创建为PDF表单应用程序。在将条目添加到表单中之后,将这些条目转换为JavaScript代码是系统的。因此,应该有可能实现翻译的自动化。如果将“条目”添加到PowerPoint中的图形对象,那么也应该有可能将它们系统地转换为JavaScript代码,并使该转换也自动化。我还使用了一组进行中的工具来执行这些翻译,并创建用于创建PDF表单应用程序的其他资源(Chionglo,2018; 2017)。

  1. 与不使用FM相比,它在速度/质量上有什么优势?

我可以使用“ Net元素和注释”编写JavaScript程序,比不使用“ Net Elements和注释”编写JavaScript程序要快。对于大型程序,我可以停止编码并稍后(或稍后)返回编码,而又不希望继续下去(Chionglo,2019)。在某些情况下,我可以使用“ Net Elements and Annotations”编写JavaScript程序,但如果不使用“ Net Elements and Annotations”就不能编写JavaScript程序。例如,如果不使用“ Net Elements and Annotations”,我就无法创建递归函数的非递归实现(Chionglo,2019b; 2018b; 2016)。无论有没有正在进行的工具,这些都是正确的。

  1. 您使用FM创建哪种软件?

我使用“ Net Elements and Annotations”来创建JavaScript程序,这些程序使用Acrobat / JavaScript API来处理PDF表单应用程序。我还可以应用该方法为HTML文档创建JavaScript程序并创建Arduino Sketches(Chionglo,2019c; 2019d)。

  1. 并且,如果您现在不直接使用FM,至少值得学习吗? ”不适用。

参考文献

J.Chionglo,JF(2019b)。计算递归关系的第N个项:使用非递归函数–在数学堆栈交换处对问题的答复。< https://www.academia.edu/38496025/Computing_the_N-th_Term_of_a_Recursive_Relation_Using_a_Non-Recursive_Function_A_Reply_to_a_Question_at_Mathematics_Stack_Exchange >。

J.Chionglo,JF(2019c)。火焰效果控制逻辑,仿真和草图:在Arduino社区论坛上对请求的答复。https://www.academia.edu/40342956/Flame_Effect_Control_Logic_Simulation_and_Sketch_A_Reply_to_a_Request_at_the_Arduino_Community_Forum

J.Chionglo,JF(2019)。长时间休息后如何继续编码应用程序?回复“您如何知道两周的休息后您在代码中停了什么地方?” –软件工程堆栈交换。https://www.academia.edu/39705042/How_I_Continue_Coding_an_Application_after_a_Long_Break_Reply_to_How_do_you_know_where_you_stopped_in_your_codes_after_a_2-week_break_Software_Engineering_Stack_Exchange

JF的Chionglo(2019d)。显示和隐藏控制逻辑:受堆栈溢出问题的启发。< https://www.academia.edu/40283015/Show-and-Hide_Control_Logic_Inspired_by_a_Question_at_Stack_Overflow >。

J.Chionglo(2018b)。一个用于数字阶乘的Petri网络模型:以及用于计算它的非递归JavaScript函数。<>。

Chionglo,JF(2018)。创建Hyper Form™-正在进行的工作流:Net编程研究的更新。https://www.academia.edu/37697498/Create_Hyper_Form_-A_Workflow_in_Progress_Update_on_the_Net_Programming_Research

清宫JF(2017)。网络编程:研究建议:用于使用PowerPoint和Acrobat开发PDF表单应用程序。https://www.academia.edu/33374809/Net_Programming_A_Research_Proposal_For_Developing_PDF_Form_Applications_with_PowerPoint_and_Acrobat。

J.Chionglo,JF(2016)。用于计算斐波那契数的Petri网模型。https://www.academia.edu/31748108/A_Petri_Net_Model_for_Computing_the_Fibonacci_Number。

Chionglo,JF(2014)。用于计算机编程的网络元素和注释:PDF中的计算和交互。https://www.academia.edu/26906314/Net_Elements_and_Annotations_for_Computer_Programming_Computations_and_Interactions_in_PDF

David,R。和H. Alla。(1992)。Petri Nets和Grafcet:离散事件系统建模工具。新泽西州上马鞍:Prentice Hall。

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.