命令式编程的理论基础是什么?


Answers:


27

通常,当使用数学研究X时,首先需要X的模型,然后发展一种理论,即关于该模型的一组结果。我想理论可以说是X的“理论基础” 。现在设置X = computation。有许多计算模型,其中许多涉及“状态”。每个模型都有自己的“理论”,有时可以在模型之间“翻译”。我相信很难说哪种模型更“基本”-它们只是设计时考虑了不同的目标。

图灵机旨在定义可计算的内容。因此,如果您关心是否存在针对特定问题的算法,那么它们将成为一个很好的模型。这种模式有时被滥用学习效率的算法或硬度的问题,它的不够好,至少,如果你只关心多项式/非多项式的借口。RAM模型更接近真实计算机,因此如果您想对算法进行精确分析,则更好。为了限制问题的难度,最好不要使用与今天的计算机非常相似的模型,因为您希望涵盖多种可能的计算机,同时仍比多项式/非多项式更为精确。在这种情况下,我看到了例如使用的细胞探针模型。

如果您关心正确性,那么其他模型仍然有用。在这里,您具有操作语义(我可以说是lambda微积分用于状态全计算的类似物),公理语义(由Hoare于1969年根据Floyd的归纳断言在1967年开发,并在Knuth的《计算机编程艺术》中得到了普及)第1卷)等。

总而言之,我认为您追求的是计算模型。有许多这样的模型,它们在开发时考虑了各种目标,并且许多模型都有状态,因此它们与命令式编程相对应。如果您想知道是否可以计算某些内容,请查看图灵机。如果您关心效率,请查看RAM型号。如果您关心正确性,请查看以“语义”结尾的模型,例如操作语义。

最后,我要提一提的是,在线上只有一本关于John Savage 的计算模型的大书。这主要是关于效率。对于正确性部分,我建议您从Floyd(1967)Hoare(1969)Dijkstra(1975)Plotkin(1981)的经典论文开始。他们都很酷。


4
我认为操作语义确实是海报的目标。有关Wikipedia的更多信息:en.wikipedia.org/wiki/Operational_semantics
sclv 2010年

22

命令式程序最简单的理论模型是图灵机本身。它具有命令性程序的两个基本组成部分:无界可修改状态和在其上运行的状态机。

您也可以通过将程序视为通过并返回修改后的全局状态版本的单子运算的组合来使命令式编程成为函数式编程的基础,就像在Haskell编程语言中所做的那样。


2
使用monad以获得纯函数式语言(例如Haskell)中的类似命令式的构造无法使您获得命令式编程的全部功能。特别是,在没有真正可变的状态的情况下(例如,在许多带有引用的语言中),仍然有许多数据结构的纯功能语言的有效实现是未知的。
约书亚·格罗夫

@Joshua:为什么您认为状态单子不表达引用的语义?我不知所措,可能会反对。
查尔斯·斯图尔特

状态monad本质上是语法糖,因为它具有所有都接受附加参数(状态)并输出附加输出(下一个状态)的函数集合。但是使用纯功能语言,您实际上无法修改状态以获得下一个状态,您仍然必须复制和重构。我不知道是否有它的特定数据结构众所周知,他们不能有效地在纯函数式语言实现的,但肯定是有启发性的证据(如Pippenger。纯与不纯Lisp语言。1997)。
约书亚·格罗夫

6
一个人可以很好地捕捉到monad突变的语义-例如,参见Haskell中的ST monad。我们在这里谈论语义,而不是实现。
sclv 2010年

20

简而言之,我想说命令式编程源于机器语言和编程实践。另一方面,monad提供了一个适当的语义框架,用于描述命令式编程语言功能的语义。Moggi的论文 “计算和单子概念”建立了正式的基础。菲尔·瓦德勒(Phil Wadler)推广了这一想法,并为将命令性功能集成到Haskell编程语言中的关键方法做出了重要贡献。Plotkin的最新工作和计算的概念决定了Monads 换句话说,(命令式)计算的一些但不是全部概念实际上给出了单子,这意味着单子在非常必要的方式上对应于命令式(和其他)计算概念。


8
Monads可以用来在纯函数式世界中封闭命令式编程,但我看不到有理由声称它们构成了命令式编程的理论基础,类似于lambda演算与许多功能语言之间的关系。Monad不对计算建模,因为它们对计算类形成了抽象(例如,纯计算与涉及IO的计算,或依赖于特定的可变状态束的计算)。
blucz 2010年

1
Monad是为有效语言编写更清晰的指称语义的一种方法,那么为什么不呢?
nponeccop 2011年

15

如果您正在寻找一种对命令式编程语言的严格数学处理,Winskel的书《编程语言的形式语义学》(1993年)就是一个例子。

在这本书中,他定义了一种称为IMP的命令式编程语言,并提供了它的可操作,定义和公理语义。


14

我这个问题迟到了,但这是一个有趣的问题。所以,这是我的看法。

当我还是一名本科生时,我们有一位出色的数学教授,他曾经给我们讲过数学的历史和发展。据他介绍,数学是在“扩张”和“巩固”的浪潮中发展的。在扩展阶段,考虑并研究了以前未知的新想法。然后,在巩固阶段,新理论被整合到现有的知识体系中。他说,然而,在20世纪,扩张和整合同时进行。

命令式编程目前是数学的一项扩展活动。它以前是“未知的”。(这可能并非完全正确 。Hoare告诉我们,欧几里得在他的《几何》一书中做了类似命令式编程的事情。但是,数学对它的兴衰越来越好,或者越来越糟。)数学家仍然对命令式编程不感兴趣。对于他们来说损失如此之大。但是我从抽象的意义上将所有计算机科学视为数学的一个分支。我们正在研究它,并在此过程中扩展数学。

因此,我不会特别在意命令式编程是否具有先验的理论基础。如果没有,请让我们找到它。我们所知道的已经告诉我们,命令式编程非常深入和美丽。比较而言,函数式编程显得苍白无力。但是,我们还有很多工作要做,以将所有这些理论带给人们。


“相比之下,功能编程显得苍白”。现在,只要我能使您和鲍勃·哈珀进入战斗舞台即可。您会挥舞一大堆命令,而他会尝试对您进行关闭。(PS:非常好的答案,我赞成。)
Andrej Bauer

好吧,他有点避开我。我不知道这是否意味着什么:-)
Uday Reddy 2012年

11

函数式编程在数学上有明确的基础,因为函数式编程语言是与相关数学并行发展的,并且它们的设计师通常高度重视数学。牢固而直接的关系是一种自我实现的预言。

命令式编程的历史更加混乱,与业务和工程问题的联系更为紧密,从历史上讲,它更关注于编译器的性能及其生成的代码,而不是尊重数学形式主义。

许多人试图用(传统的)功能术语来解释命令式编程。这可能是我们最接近您要寻找的东西,但是这些尝试总是笨拙,乏味,法医。我敢肯定,我宁愿将自己的眼睛从脸上移开,也不愿阅读CLR的进度/保存证明。

通常,如果您即将完成一本体面的pl教科书(例如Pierce的类型和编程语言),您将开始看到命令式语言功能的正式建模。这可能对您很有趣。


11

An Axiomatic Basis for Computer Programming 通过CAR HOARE

在本文中,尝试通过使用一些技术来探索计算机编程的逻辑基础,这些技术首先应用于几何学研究,后来又扩展到数学的其他分支。这涉及阐明可用于证明计算机程序属性的公理集和推理规则。给出了此类公理和规则的示例,并显示了一个简单定理的形式证明。最后,有人认为,追求这些主题可能会带来重要的理论和实践优势。

http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.85.8553&rep=rep1&type=pdf


8

我同意亚历山大所说的,图灵机为命令式编程提供了最初的理论基础。在一定程度上,命令式编程语言的组织反映了机器体系结构,我认为John Von Neumann的工作也将成为其理论基础的关键部分。


7

祈使式编程是否具有等效的数学基础,或者仅仅是从机器语言的实际硬件应用以及FORTRAN的后续开发中发展而来?

如果说历史意义上的“基础”,我认为没有“等效的数学基础”。但是,即使命令式编程是出于实际考虑而发展起来的,也有几种方法可以以您可能会发现“对建模有用”的方式来全面表征命令式编程的含义,例如Hoare逻辑


您真的是想制作此社区Wiki吗?
Suresh Venkat 2010年

是的,我的确是使它成为社区Wiki。
jbapple

7

提到hoare逻辑和分离逻辑的帖子在这个问题上是正确的。Hoare逻辑可让您声明程序整个堆配置的属性,而分离逻辑则是更现代的相对逻辑,它使您可以使用“分离并集”,使您可以将一段代码的前后条件陈述为该属性所保留的内容程序段将在对其余堆进行量化时将操作的堆部分。

关于monad的答案不是严格准确的,因为在haskell中使用monad仅是因为它是一种抽象,它可以对评估约束的顺序进行编码并显式跟踪“可能使用的IO”属性。

值得指出的是,可以将hoare / separation逻辑视为monads,并且有许多当代项目(例如哈佛的ynot项目)正在探索这些主题。

分离逻辑的研究是一个持续而活跃的领域。


在我看来,将Haskell使用monad(和Monad类型类)的概念与更常见的方法(例如Moggi提出的)混淆的事实是错误的,该方法使用monad来构造分类语义的说明。将monads用作结构化编程的工具不应使我们盲目使用分类语义作为结构化编程推理的工具。
sclv 2010年

尽管我确实相信很多人都使用monads la haskell通过monad转换器来探究语义,但这种解释还是很好的。特别是,由于所述转换器的不同组成而引起的操作语义不同(例如,状态/可变性,连续性,不确定性等)
Carter Tazio Schonwald 2010年

5

我什至以后都会提出这个问题,但我同样对此着迷。

为什么认为命令式编程的理论比功能性编程的理论还没有定论。斯科特和德·巴克(Scott and de Bakker)于1969年用一种简单的命令式语言对递归的含义进行了分析[1],这可能开始变得严肃起来。当命令式语言获得功能时,故事会变得更加混乱,但这仅仅是接近语言的代价。作为更全面的努力之一,de Bakker,de Bruin和Zucker于1980年撰写了有关该主题的专着[2]。上面提到了其他人。这些参考文献当然早于分隔逻辑,但[2]仍然涉及数组和相互递归的过程。

[1]:1969年未出版,但以Jaco W. de Bakker和Dana S. Scott的身份出现。程序理论,第1-30页。在克洛普(Klop)等人中。JW de Bakker,25 jaar semantiek。CWI,阿姆斯特丹,1989年。Liber Amoricum。

[2]:Jacobus W. de Bakker,Arie de Bruin,Jeffrey Zucker:程序正确性的数学理论。普伦蒂斯厅1980。


1
显然,命令式编程非常好理解。我认为人们在说不那么定论时的意思是,命令式编程在结构上比纯函数式编程要丰富,而发现的数学结构却很少出现在这种或那种命令式编程中。例如,某些命令式程序可以使用分离逻辑很好地进行推理。这可能与共享形式有关。也许这些程序具有很好的抽象数学特征?
马丁·伯杰

1
就我个人而言,我的意思是命令式语言中的模块化理论非常不清楚。我们知道模块化对于功能语言意味着什么:关系参数。对于命令式语言,有许多信息隐藏习语(a)显然有效,但是(b)我们缺乏良好的证明技巧。引人入胜的暗示是这里有很深的理论:例如,当我对顺序命令式程序进行模块化证明时,最终需要并发技术。非正式地,别名就像并发,但是我真的不知道如何使这个想法正式化……
Neel Krishnaswami 2012年

@凯 欢迎来到主题!自从我看了de Bakker的作品以来已经有很长时间了,但是我认为基本问题是这种方法没有扩大规模。对于自那时以来命令式编程的进展的简要概述,请参阅“什么构成指称语义?”一文。线程链接
Uday Reddy'3

@NeelKrishnaswami。我很想看看那些证明。它们在您的网页上吗?别名就像并发,因为它们都涉及复杂的共享和交织。并发时,您可以消除交织并假定不确定性(这很好)。在混叠中,您强迫自己处理交织。游戏语义是这种强制交错的一个很好的例子,这就是我不喜欢它的原因。
Uday Reddy'3

3

在问完问题后不久,麦克马斯特大学的马克·本德(Mark Bender)发表了一篇论文:作业演算:一种纯粹的命令式推理语言(2010年9月8日)。本文描述了一种与lambda演算相对应的简单命令式语言。

分配演算仅由四个基本结构组成:分配X:=t,序列t;u,过程形成¡t和过程调用!t。针对AC给出了三种解释:操作语义,指称语义和术语重写系统。这三个显示为等效。

Mark Bender的论文继续探讨了通过懒惰评估,回溯,程序组成扩展的变体。这类似于通过使用小扩展来探索lambda演算。

总体而言,本文为OP问题提供了相对直接的答案。


pdf链接已损坏
奎因·威尔逊
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.