Answers:
通常,当使用数学研究X时,首先需要X的模型,然后发展一种理论,即关于该模型的一组结果。我想理论可以说是X的“理论基础” 。现在设置X = computation。有许多计算模型,其中许多涉及“状态”。每个模型都有自己的“理论”,有时可以在模型之间“翻译”。我相信很难说哪种模型更“基本”-它们只是设计时考虑了不同的目标。
图灵机旨在定义可计算的内容。因此,如果您关心是否存在针对特定问题的算法,那么它们将成为一个很好的模型。这种模式有时被滥用学习效率的算法或硬度的问题,它的不够好,至少,如果你只关心多项式/非多项式的借口。RAM模型更接近真实计算机,因此如果您想对算法进行精确分析,则更好。为了限制问题的难度,最好不要使用与今天的计算机非常相似的模型,因为您希望涵盖多种可能的计算机,同时仍比多项式/非多项式更为精确。在这种情况下,我看到了例如使用的细胞探针模型。
如果您关心正确性,那么其他模型仍然有用。在这里,您具有操作语义(我可以说是lambda微积分用于状态全计算的类似物),公理语义(由Hoare于1969年根据Floyd的归纳断言在1967年开发,并在Knuth的《计算机编程艺术》中得到了普及)第1卷)等。
总而言之,我认为您追求的是计算模型。有许多这样的模型,它们在开发时考虑了各种目标,并且许多模型都有状态,因此它们与命令式编程相对应。如果您想知道是否可以计算某些内容,请查看图灵机。如果您关心效率,请查看RAM型号。如果您关心正确性,请查看以“语义”结尾的模型,例如操作语义。
最后,我要提一提的是,在线上只有一本关于John Savage 的计算模型的大书。这主要是关于效率。对于正确性部分,我建议您从Floyd(1967),Hoare(1969),Dijkstra(1975)和Plotkin(1981)的经典论文开始。他们都很酷。
命令式程序最简单的理论模型是图灵机本身。它具有命令性程序的两个基本组成部分:无界可修改状态和在其上运行的状态机。
您也可以通过将程序视为通过并返回修改后的全局状态版本的单子运算的组合来使命令式编程成为函数式编程的基础,就像在Haskell编程语言中所做的那样。
简而言之,我想说命令式编程源于机器语言和编程实践。另一方面,monad提供了一个适当的语义框架,用于描述命令式编程语言功能的语义。Moggi的论文 “计算和单子概念”建立了正式的基础。菲尔·瓦德勒(Phil Wadler)推广了这一想法,并为将命令性功能集成到Haskell编程语言中的关键方法做出了重要贡献。Plotkin的最新工作和计算的幂概念决定了Monads 换句话说,(命令式)计算的一些但不是全部概念实际上给出了单子,这意味着单子在非常必要的方式上对应于命令式(和其他)计算概念。
我这个问题迟到了,但这是一个有趣的问题。所以,这是我的看法。
当我还是一名本科生时,我们有一位出色的数学教授,他曾经给我们讲过数学的历史和发展。据他介绍,数学是在“扩张”和“巩固”的浪潮中发展的。在扩展阶段,考虑并研究了以前未知的新想法。然后,在巩固阶段,新理论被整合到现有的知识体系中。他说,然而,在20世纪,扩张和整合同时进行。
命令式编程目前是数学的一项扩展活动。它以前是“未知的”。(这可能并非完全正确 。Hoare告诉我们,欧几里得在他的《几何》一书中做了类似命令式编程的事情。但是,数学对它的兴衰越来越好,或者越来越糟。)数学家仍然对命令式编程不感兴趣。对于他们来说损失如此之大。但是我从抽象的意义上将所有计算机科学视为数学的一个分支。我们正在研究它,并在此过程中扩展数学。
因此,我不会特别在意命令式编程是否具有先验的理论基础。如果没有,请让我们找到它。我们所知道的已经告诉我们,命令式编程非常深入和美丽。比较而言,函数式编程显得苍白无力。但是,我们还有很多工作要做,以将所有这些理论带给人们。
函数式编程在数学上有明确的基础,因为函数式编程语言是与相关数学并行发展的,并且它们的设计师通常高度重视数学。牢固而直接的关系是一种自我实现的预言。
命令式编程的历史更加混乱,与业务和工程问题的联系更为紧密,从历史上讲,它更关注于编译器的性能及其生成的代码,而不是尊重数学形式主义。
许多人试图用(传统的)功能术语来解释命令式编程。这可能是我们最接近您要寻找的东西,但是这些尝试总是笨拙,乏味,法医。我敢肯定,我宁愿将自己的眼睛从脸上移开,也不愿阅读CLR的进度/保存证明。
通常,如果您即将完成一本体面的pl教科书(例如Pierce的类型和编程语言),您将开始看到命令式语言功能的正式建模。这可能对您很有趣。
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
我同意亚历山大所说的,图灵机为命令式编程提供了最初的理论基础。在一定程度上,命令式编程语言的组织反映了机器体系结构,我认为John Von Neumann的工作也将成为其理论基础的关键部分。
祈使式编程是否具有等效的数学基础,或者仅仅是从机器语言的实际硬件应用以及FORTRAN的后续开发中发展而来?
如果说历史意义上的“基础”,我认为没有“等效的数学基础”。但是,即使命令式编程是出于实际考虑而发展起来的,也有几种方法可以以您可能会发现“对建模有用”的方式来全面表征命令式编程的含义,例如Hoare逻辑。
提到hoare逻辑和分离逻辑的帖子在这个问题上是正确的。Hoare逻辑可让您声明程序整个堆配置的属性,而分离逻辑则是更现代的相对逻辑,它使您可以使用“分离并集”,使您可以将一段代码的前后条件陈述为该属性所保留的内容程序段将在对其余堆进行量化时将操作的堆部分。
关于monad的答案不是严格准确的,因为在haskell中使用monad仅是因为它是一种抽象,它可以对评估约束的顺序进行编码并显式跟踪“可能使用的IO”属性。
值得指出的是,可以将hoare / separation逻辑视为monads,并且有许多当代项目(例如哈佛的ynot项目)正在探索这些主题。
分离逻辑的研究是一个持续而活跃的领域。
我什至以后都会提出这个问题,但我同样对此着迷。
为什么认为命令式编程的理论比功能性编程的理论还没有定论。斯科特和德·巴克(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。
在问完问题后不久,麦克马斯特大学的马克·本德(Mark Bender)发表了一篇论文:作业演算:一种纯粹的命令式推理语言(2010年9月8日)。本文描述了一种与lambda演算相对应的简单命令式语言。
分配演算仅由四个基本结构组成:分配
X:=t
,序列t;u
,过程形成¡t
和过程调用!t
。针对AC给出了三种解释:操作语义,指称语义和术语重写系统。这三个显示为等效。
Mark Bender的论文继续探讨了通过懒惰评估,回溯,程序组成扩展的变体。这类似于通过使用小扩展来探索lambda演算。
总体而言,本文为OP问题提供了相对直接的答案。