我曾经有一个名为“最小程序结构”的文件(也就是一个物理的马尼拉文件夹),但我无法找到我所寻找的意义上的它们,所以它的内容被合并到其他文件中,问题仍然存在。从程序员组合的意义上来说,算法到底是由什么组成的?我所寻求的答案没有部分递归函数那么正式,实际上很普通,基于可寻址的计算机内存和执行所有必要计算和控制的工作中的一些可执行文件。(在这里,我们忽略任务分配而专注于心流。)这种观点认为栈机(它具有“内建”的控制)是欺骗;半加法器过于简单和机械。对于正式的解释,我们可以参考Rapaport从头开始的分析,其中包含了Böhm-Jacopini结果,它告诉我们任何计算机程序都可以只用三个语法规则来编写:序列(广义组合)、选择(条件定义)和重复(while-递归)[派波特, Sec.7.6.3]。图灵机是一个很好的模型,而且相当稀疏,只有一个指令,一个5元组或变体,包含状态、输入符号、输出符号、移动和新状态。但它是什么做?出于对哪些程序控制操作是任意的和哪些是必要的好奇,我们问为了计算我们必须有什么。我们习惯了循环和条件,这在TM指令中并不明显。我们一定要有循环和条件吗?什么是算法的独立模运算?要提醒读者的是,在探索这个问题的过程中,我们会在计算体系结构的不同视角中曲折前进。
我们首先考察了Gilreath和Laplante的OISC模型(发音为“whisk”),即单指令集计算机。考虑这条指令,负数时的减法和分支(SBN):
SBN操作数,操作数,next-address(操作数:=操作数-操作数;如果operandam < 0 goto next-address;)
其他指令(针对其他体系结构)可以用这条指令实现。下面是ADD的方法(其中R1和R2是寄存器,PC是程序计数器,但任何内存单元都可以):
加上x + y SBN r1 r1;清除R1 SBN R1,X,PC;把-X在R1 SBN R1,Y,PC;把-X-Y到R1 SBN R2,R2,PC;清除R2 SBN R2,R1,PC;R2包含X + Y
这很有趣,也很有效,但为什么呢?
我们观察到,一旦我们转向现实世界的应用程序,复杂性就会以长而密集的程序的形式爆发。对于那些疯狂到想用图灵机进行实际计算的人来说,隐现的复杂性也是图灵机的特点,但我们仍然钦佩它描述的优雅。在这里,我们只是向编译器作者表示敬意,许多问题都强加在他们身上。
逻辑中的类似物是功能完全运算符NAND(“非和”)。维基百科(连同逻辑教科书)很好地描述了其他逻辑函数在NAND中的实现[WikiNAND,作为完整性的证明。NOR操作符在功能上也是完整的。当然,它们是二进制的,所以函数NOT P被实现为P NAND P,这并不直观,但它是可行的。但是为什么呢?为什么有一个操作可以提供命题逻辑中所有的标准动作,为什么是这个?除非存在一个只有肯定的最小集,否则就不存在在这种意义上对称的选择。
逻辑否定(否认)是否具有某种魔力,使其变得至关重要?由于零允许清晰的数字位置表示,而不允许单一的逻辑操作NAND,我们可能需要一些“虚无主义”选项,以充分发挥数据的潜力。否定通常在自然语言中被标记出来,因此从现实世界中提取的断言和否定是不对称的,正如经典哲学所指出的那样[角,当学生们在努力画集合补的维恩图时,他们也会理解。我们不能满足于此,因为对于条件结果,我们必须有明确的错误。在编程中,我们依赖TRUE和FALSE作为等效值,无论如何实现。但编码选择通常反映了正常和异常偶发的划分,或者只是方便和不方便选项的具体化,这意味着程序员将条件压入人为的矛盾中,并表明重要的不是否定,而是二分法。所以NOT可能并不重要,除了作为行动选择的手段。
让我们转到指令,看看在SBN中发生了什么。我们有一个算术运算,它改变了操作数的值。我们对操作数的特定值进行了测试。我们有一个分支,操作顺序的变化,标准顺序的例外。这是所有。但为什么?为什么有一个指令可以完成我们想要的一切,为什么是这个指令?我们需要一些符合编码直觉的解释,它看起来很自然,提供了一组有品位的对等操作来完成工作。在SBN中,我们看到了一个向前发展的概念,和一个阻碍“向前发展”的偶然性的概念,以及一个测试值来决定偶然性的概念。当然,分割偶发事件的值0是一个占位符;对数字负性的检验只是与某个固定值进行比较。
现在考虑一下序列的重要性,提醒一下,在现实工作中被认为是理所当然的最简单的约定,必须指定给计算机。作为惯例的处理需要一个额外的操作,分支,来打破它。这意味着我们不需要重复;我们只是去了一个没顺序的地方。我们有这样一种操作——谦逊的(被弃用的)GOTO。给定一个指令序列,一个GOTO到一个更大的序列号是一个跳转;一个GOTO到前一个序列号是一个重复[Gilreath]。
但偶数序列是“后到”(GOTO),目标只是下一步。所以序列是一种人工制品,它可以和分支结合在一起形成一个概念订购.这就产生了原语订购(find-next-step)和测试.这是否相当于一个程序计数器和一个比较,然后把我们扔到CPU,滑过最小程序结构的点?好吧,我们可以转到Böhm和Jacopini开始的地方——流程图。我们需要(1)一个有一个箭头的方框和(2)一个有两个箭头的方框,(2.5)包含一个基于二分法(2.5.5)确定跟随哪个箭头的测试。这个勤劳的设计工具一直都有答案。(嘿,编程语言的原理不是已经告诉我们了吗?)但是,流程图的图形形式,具有特殊的可视性和自由度,引发了进一步的问题,即是什么在演示和程序操作(如SBN)之间架起了概念上的桥梁。
我们只探讨了最小控制结构的一个方面——公开操作。Gilreath和LaPlante提供了最小指令集的标准,但它描述的是状态,而不是操作。(我认为希尔2016]算法不是声明式的,而是命令式的抽象——不是由状态组成,而是由命令组成。)要遵循一个有趣的切线,参见页面故障的奇怪机器[Bangert],用于没有CPU指令的计算。
参考文献
[班格特]朱立安·班格特,谢尔盖·布拉图斯,丽贝卡·夏皮罗,肖恩·w·史密斯。2013。页面错误的怪异机器:无指令计算课程。第七届USENIX攻击技术研讨会(WOOT 13)。USENIX协会。
[吉尔里斯]威廉。F.吉尔里斯。菲利普。拉普兰特。2003。计算机体系结构:极简主义视角。科学与商业媒体第730卷。
[希尔2016]罗宾·k·希尔。2016。什么是算法。哲学与技术29:1。
[霍恩]劳伦斯·r·霍恩,海因里希·万辛。否定。2020。《斯坦福哲学百科全书》,Edward N. Zalta主编。
[Rapaport] William J. Rapaport. 2015。计算机科学哲学“,”网上。
WikiNAND维基贡献者。2021.与非逻辑。在维基百科,自由百科全书。检索日期:2021年5月26日23:18。
罗宾·k·希尔他是怀俄明大学计算机科学系的讲师,也是哲学与宗教研究系和怀俄明人文研究所的附属机构。她自1978年以来一直是ACM的成员。
没有发现记录