如果...那么...还必须发明(2019)

2020-12-13 18:13:28

Permalink GitHub是超过5000万开发人员的家园,他们共同致力于托管和审查代码,管理项目以及共同构建软件。 注册 数以百万计的开发人员和公司在GitHub(全球最大,最先进的开发平台)上构建,发行和维护其软件。 嗨,我是埃里克。 我在这里谈论的是一个荒唐的主意:必须发明“ if-then-else”。 If-then-else是我们谈论编程语言中的条件的方式:如果某件事是正确的,那么就做一件事,否则做另一件事。 那只是英语,对不对? 除了不是,我不能使用< 34; else" 仅在计算机程序中作为普通语音的连词。 这是哪里来的? 这是一个谜。它的细节过于细微,无法将其纳入有关编程语言历史的书籍中。

它似乎不是来自调查,法律程序或算法,因为它们是在计算机出现之前编写的。您会发现“如果是”和“如果否”,以及“如果但是”,但不是“否则”。

Eniac似乎是第一台能够根据先前的计算结果执行不同指令的计算机。1946年,Haskell Curry和Willa Wyatt撰写了此报告,描述了用于反转功能的程序。他们使用"歧视"因为可以根据两个数字中的较大者来进行决策。

Eniac没有称为``歧视''的指令,它是通过电线和插板上的拨盘进行编程的,而用于进行决策计算的指令的控制面板通过物理线路与可能遵循的指令相连它。

很快,计算机开始拥有足够的内存,可以将程序存储在内存中,而不必连接在一起。代替了物理上的指令序列,它是一个数字序列。一些特殊的指令可能会导致计算机跳到序列中的另一个点。

例如,这里是来自第一批商业生产的计算机之一的条件跳转指令。检查最后计算的数字是否为负。如果是这样,它将控制流转移到内存中的某些指定位置。否则,它使控制继续到下一条指令。

它是针对特定的使用模式的:如果您想执行一项任务,例如,执行10次,则您的程序会计算到目前为止已执行的次数,然后减去10。如果结果是否定的,则该任务不是。 tdone,所以它跳回去做另一轮。

这个想法被推广到了第一批高级编程语言中,例如Halcombe Laning和Neal Zierler的Whirlwind语言。他们的条件跳转以相同的方式工作,除了程序的编号步骤是代数表达式,而不是单机指令。

第一种流行的编程语言,Fortran,通过根据计算是负数,零值还是正数来一次指定跳转到三个位置的方法来概括该思想,并将其命名为" if。

三向" if"它不仅比检查是否定的要强大,而且可能更令人困惑,因为每个决定都意味着控制流程中的不连续性,而不是程序员只需要考虑继续发生的正常情况和跳跃的异常情况。

Flow-Matic是COBOL的前任Grace Murray Hopper的前任,他通过谈论比较两个数字而不是数字的符号,使三向思考变得更容易了。它引入了名称"否则"对于不是您要查找的内容的情况。

所有这些编程语言都与一个特定制造商的一台特定计算机相关联。 1958年,两个美国和德国的计算机组织开始了一个联合项目,以开发一种标准的与机器无关的语言,这对于人们来说是自然而然的事情,而不是自然地在某些特定机器上实现。每个小组向联席会议提出了一项提案草案。

首先是让条件由任何布尔表达式控制,而不是给予小于/等于/大于的形式特殊的优先级。

第二个大飞跃是,他们的&if34; if"并没有引起控制流程的突然跳跃。语句仅导致流程暂时转移。在条件结束时,无论条件是对还是错,程序都将在“始终”处恢复运行。块末的声明。唯一的区别是是否执行了子公司报表。

屏幕上的示例显示了两个" ifs&#34 ;;在单个代码块中,您可能会认为第二个代码是要作为&elph; if"现在做。但是他们希望对所有条件进行评估,即使已经发现它是真实的。因此,如果由第一个控制的语句更改了第二个比较所依赖的值,则两个语句块都可能执行。

德国提案的确有类似" else"的地方是另一种完全不同的条件格式,称为" case。"不同于" case"如我们现在所知,他们的" case"这是编写布尔条件的另一种方法,条件是将条件与所控制的语句分开放置在一个单独的块中。听起来,他们认为这种形式对于更复杂的比较会更容易。

这是世界的第一次出现,"对于其他情况均不适用的情况。

他们说的是该文档最初是用德语编写的,然后急速翻译成英文。我认为精心选择的德语单词可能被翻译成古英语单词,然后再也没有重新访问过,不幸的是我们没有原始的德语文本可供参考。

美国的提案还具有通过布尔表达式控制语句的想法。它甚至没有一个if"相反,如果在表达式后跟箭头,则表达式将控制箭头后的语句。

这种表示法并没有使它变得显而易见,但是与美式形式的ifs的德语块不同,如果一个块中的一个表达式的值为true,它将短路并跳过以下表达式,例如"。如果现在就这样做。

这两个组织举行了一次联席会议,并将其提案合并为一个文件,称为国际代数语言。不久以后,该语言便被重命名为Algol。

" if"合并文档中的声明看起来很像德国的提议,但是消除了“总是”语句以结束该块。相反,每个" if"单独使用,并且如果要由同一表达式控制多个语句,可以使用" begin"然后将它们组合在一起。

但是,Algol 58还具有第二种条件形式,称为&#34 ;,如果是。"在这种形式中,您可以说"或如果"。与我们现在对" elif if。"所做的相同的事情。但是没有什么等于&else"本身,没有另一个" if。"

第二年,在一次会议上发表了几篇有关Algolwewe的论文,故事变得泥泞不堪。其中之一就是以前领导Fortran项目的John Backus在论文中介绍了用于编程语言的形式语法的思想。

如他所描述的,Algol没有“如果有”相反,它有一个名为" converge,"的关键字。这使得顶层的ifs"在其块内的行为类似于" else ifs。"尚不清楚这是否是一个更好的想法,如果有的话,"还是先前的想法已经被支持而拒绝了(如果有的话)。

无论哪种方式,"如果有,"将很快被替换。麻省理工学院的约翰·麦卡锡(John McCarthyat)在1957年为该项目编写了一份提案,该提案后来成为LISP,这是另一种非常古老的编程语言,至今仍然存在。

重要的区别在于,表达式必须始终具有值,而如果控制条件不为真,则无法执行语句。

因此,他的“如果函数”总是以称为" otherwise"的子句结尾,该子句会在其他条件都没有计算为true时给出表达式的值。

麦卡锡的条件表达式启发了克劳斯·萨默森(Klaus Samelson)在1959年底清理并统一了阿尔高的两个独立的条件模型。他消除了整个模型,如果有的话形式,仅保留普通的" if,"但添加了一个名为" else"的子句当控制相应的" if"的表达式为false时将执行的操作。

您可以将条件与“否则”链接在一起,就像以前的"允许"或者,"但您也可以使用" else"如果没有一个条件为真,则将运行最后一组语句。

" If-then-else"是第二年在Algol 60报告中出现的唯一条件形式,并且是几乎所有后续编程语言都遵循的形式。

尽管现在看来似乎很清楚,但1960年的人们却很难考虑,该报告花了一个半页的时间解释它的工作原理,包括此箭头图。

正如我提到的那样," else"的使用克里斯托弗·斯特拉奇(Christopher Strachey)的CPL编程语言是C的祖父母,因此是大多数当前编程语言的祖先,因此他拒绝使用“其他”。称它为"显然是错误的英语。"他认为我们应该先写&test…然后…或"。相反,这听起来也不是很自然,也没有流行。

MAD编程语言也有自己的方式。它以其极长的关键字而闻名,并且除了使用“何时”代替" if,"它使用了"否则"而不是&else"和"或代替“否则”。

MAD手册示例中的缩进一文不值。大多数其他编程语言采用这种缩进条件花了很多年的时间,尽管现在看来以其他方式无法实现。

但是,即使CPL和MAD避开了“ else”一词,他们保留了表格,只改变了词汇表。语言设计师仍在寻找编写for循环的理想方法,但对理想条件形式的追求似乎已于1959年结束。谢谢Klaus Samelson,感谢他给我们提供了一个思考的工具和一个令人费解的单词。