acm-headergydF4y2Ba
登录gydF4y2Ba

ACM通信gydF4y2Ba

历史的反思gydF4y2Ba

代码从哪里来:从巴贝奇到Algol的自动控制体系结构gydF4y2Ba


EDVACgydF4y2Ba

安装EDVAC的美军照片。gydF4y2Ba

来源:美国陆军gydF4y2Ba

在我们之前gydF4y2Ba通信gydF4y2Ba我们注意到,Ada Lovelace在1843年出版的一个著名的表格并不是一个计算机程序,尽管经常有人声称它是一个相反的程序。这里我们转到一个相关的问题:计算机代码从何而来?早在19世纪40年代,没有人谈论“编程”查尔斯·巴贝奇(Charles Babbage)设计的引擎。更重要的是,当时还没有人把程序的概念表述为控制通用计算机操作的一系列指令。查尔斯·巴贝奇(Charles Babbage)和阿达·洛芙莱斯(Ada Lovelace)的工作在这一发明的道路上提供了一个重要的里程碑,但标志着故事的开始而不是结束。gydF4y2Ba

在本专栏中,我们将探讨这个故事的其余部分,简要地回顾一下洛芙莱斯和巴贝奇的世界,然后再转到20世纪40年代,他们的思想被独立地重新发现、扩展,并最终在实际机器中实现。发展迅猛,从最早的由磁带上的“编码”算术指令控制的中继计算机到ENIAC,仅用了几年时间,就自动执行包括分支和嵌套循环在内的复杂结构的计算的第一台计算机。这就是“编程”一词最初应用于计算机的背景,最初用来描述机器的控制电线、电路和开关在触发适当的数学运算序列时的动作。甚至在ENIAC完成之前,它的创造者就与约翰·冯·诺伊曼(John von Neumann)合作,提出了一种新的方法,将控制和算术运算都表示为存储在可寻址存储单元中的单个编码指令序列。这很快就被称为计算机程序,尽管这个术语的含义不断演变,但它仍然保留了指导一系列操作执行的一组指令的基本含义,使计算机能够在没有人为干预的情况下执行一项任务。gydF4y2Ba

回到顶部gydF4y2Ba

巴贝奇提出控制操作gydF4y2Ba

与巴贝奇早期提出的计算器“差分机”不同,分析机是后来被称为“通用”的自动计算机。这种灵活性意味着它必须被“命令”或“指示”,才能执行所需的任何特定的算术运算序列(加减乘或除)。这些顺序被打到连接成连续链的“操作卡”上,形成类似于自动钢琴的控制卷或后来计算机使用的纸带的东西。gydF4y2Ba一个gydF4y2Ba一个单独的“变量卡”序列告诉引擎在它的“存储”中使用哪个位置作为每个操作的参数和结果。gydF4y2Ba

巴贝奇认识到,对于复杂计算中需要的每一个操作都打卡是低效和不灵活的,因为大多数计算都有一个重复操作序列的结构。完全自动化的计算意味着,不仅要使算术运算序列显式和机械化,还要使指导这些重复操作所需的控制过程机械化。巴贝奇设想了一种机制,可以“备份”纸牌链,以重复一系列操作。倒卷操作将由放置在操作卡之间的特殊“组合卡”触发。当Lovelace公布她计划的计算细节时,她在定义两个嵌套循环时就依赖于这种能力,这已经成为历史上最著名的结尾注释之一。在我们之前的专栏中,我们观察到她的表忽略了引导引擎通过这些循环所需的控制信息,更接近于模拟跟踪,而不是实际的程序。她用一种受数学符号启发的符号表达式更抽象地描述了计算的整体结构。gydF4y2Ba

这种遗漏并不令人惊讶,因为巴贝奇关于备份方案的想法仍然相当临时。直到1844年,他才准备好了他的引擎将支持的操作清单。gydF4y2Ba1gydF4y2Ba巴贝奇专家艾伦·布罗姆利(Allen Bromley)将它们描述为记录“程序员的界面”。除了预期的算术运算,巴贝奇还定义了一种“确定是否有变量= 0”的运算。排序此操作的卡片将指定如果当前变量卡片定义的变量为零,将跳过多少张卡片。这标志着对“运算”概念的一个至关重要的概括,它超越了我们熟悉的算术运算,包含了控制运算,这些控制运算精确地决定了哪些算术运算序列被执行。gydF4y2Ba

回到顶部gydF4y2Ba

穿孔卡片和模拟计算机gydF4y2Ba

分析机从未建造,甚至从未完全稳定地设计过。在接下来的90年里,各种各样的计算和计数机器被开发出来,包括各种穿孔卡片制表设备和许多微分分析仪。它们的设计者中没有一个人试图复兴巴贝奇和拉芙莱斯对通用自动计算机的追求。配置这些机器不叫“编程”。gydF4y2Ba

每台打孔卡片机都有一项专门的操作,比如将卡片制表或分类。每台机器都可以通过连接来执行这项任务的特定变体,例如,在根据其他列计算总数和小计时,忽略卡片上的某些列。虽然这些机器从20世纪30年代开始应用于科学计算,但我们所认为的执行程序的大部分工作都是由操作员执行的,而不是由机器本身。gydF4y2Ba

模拟计算机,如微分分析仪和枪械控制系统,则采用了一种截然不同的方法,它将数字表示为连续变化的数量,而不是数字。变化的变量被建模为机器内某一特定单元的电压或机械旋转的变化。计算机可以配置,通常使用扳手或螺丝刀,以指定这些单元之间的特定关系,在方程中建模项。机器的每一部分在整个计算过程中执行单一任务。这些机器在进行计算时并没有遵循指令,因此程序的概念——设备根据程序在一段时间内执行一系列不同的操作——并不适用于它们。gydF4y2Ba

回到顶部gydF4y2Ba

编码和编码gydF4y2Ba

因此,我们将从巴贝奇时代直接跳到20世纪40年代初,那时第一台自动数字计算机正在建造。它们的功能与巴贝奇为分析机所设计的功能相似,尽管它们是在不了解巴贝奇的设计的情况下构思出来的,而且大多数使用机电继电器而不是齿轮来表示数字。其中包括IBM为哈佛大学建造的马克1号计算机,纽约贝尔实验室建造的一系列战时机器,以及柏林康拉德·祖斯建造的Z3。gydF4y2Ba

和计划中的分析机一样,这些机器执行一系列算术运算,现在用在控制磁带上打孔的图案来表示。这些模式被称为“码”,反映了“码”的早期用法,用来描述将信息编码到纸带上以供机器传输(波多码)或转换成点和破折号以供人类传输(莫尔斯码)。gydF4y2BabgydF4y2Ba

马克一世的设计者认为这些命令主要是算术,每一个命令都指定了数据从一个寄存器转移到另一个寄存器时要执行的操作。他们并没有把控制磁带卷回去重复序列,而是用最字面意义上的方式实现了循环:把控制磁带的两端粘在一起,形成一个物理循环。我们强烈怀疑,这就是“循环”一词的起源。因此,马克一世将编码顺序用于算术,而不是控制结构。循环被映射到磁带的物理结构上,控制的转移由人类手工完成。完成这些功能需要代码、纸循环和人工,而这些功能后来只需要程序代码就可以实现自动化,因此指定一个问题在Mark I上运行,既需要为机器准备编码指令,也需要为操作员准备详细的操作说明。gydF4y2Ba

少数指令确实执行了控制功能,最重要的一个指令在满足循环终止条件时自动停止机器。这时,机器操作员会从磁带阅读器上取下循环的控制磁带,用接下来的任何顺序替换它。手动更换磁带可能看起来效率很低,但机器运行得非常慢,操作员可以合理地跟上它们。马克1号上的循环执行时间是以分钟而不是微秒为单位的。gydF4y2Ba

“程序”和“编程”这两个词最初并不适用于这些机器。然而,到了1944年,哈佛计算实验室的工作人员已经认识到,将问题“编码”成操作代码序列的工作是一项独特的任务:“……数学家……选择数值方法…然后计算、编码和打孔所需的功能、值和控制带。由于计算器运行时数学家不可能一直在场,所以必须准备好指导操作人员的说明。”gydF4y2BacgydF4y2Ba

磁带驱动的自动控制系统后来通过提供指令在多个磁带阅读器之间转移控制而得到扩展。例如,一台有四个读卡器的计算机可能会将它们用于对应内环、外环、初始设置和结果打印的代码序列。随着1948年IBM公司的选择性序列电子计算器的完成,这一系统被扩展到极限,甚至超越了极限。正如“选择性”一词所暗示的那样,SSEC可以从几十个纸带阅读器中自动选择下一个指令。SSEC的工作人员不得不与重达400磅的磁带卷作斗争,这些磁带被用来准备高速循环的数据磁带,以通过多个读取头,以便从编码表中查找值。他们设计了一个定制的升降机来提升这些胶带,这些胶带太宽了,以至于制造了一台特殊的机器来把它们的两端粘在一起。gydF4y2Ba

回到顶部gydF4y2Ba

ENIAC和控制自动化gydF4y2Ba

“编程”一词有点间接地来自于宾夕法尼亚大学(University of Pennsylvania)建造速度更快的电子计算机的项目。1945年完成的ENIAC以前所未有的速度,迫使它的设计者想出了一种完全不同的控制系统。任何纸带都不可能以足够快的速度读取操作代码,让它的电子电路保持忙碌。当ENIAC完成一个循环或子程序,需要继续进行下一个操作序列时,期望操作员每隔几秒钟就更换一次磁带也不现实。gydF4y2Ba


“程序”和“编程”这两个词最初并不适用于这些机器。gydF4y2Ba


人们常常期望科技史是由一系列相当直接的进步组成的,通过这些进步,原始的旧机器逐渐变得越来越像现代机器的外观和行为。ENIAC很难符合这种历史观。它是第一台通用电子数字计算机,经过重新配置,可以处理从天气预报到质数检测等完全不同的问题。它的控制机制提供了我们与现代计算机联系在一起的所有功能,包括条件分支和嵌套循环,但使用了一种完全不同的方法。gydF4y2Ba

正如我们在新书中解释的那样,gydF4y2BaENIAC在行动:制造和改造现代计算机gydF4y2Ba,gydF4y2Ba3.gydF4y2BaENIAC由几十个不同的单元组成,大多数被构建来执行专门的计算功能,如乘法、加法和数字存储、循环控制或表查找。当一个单元完成一项任务时,它会产生一个“程序脉冲”,通知负责下一个操作的单元,它是时候醒来做点什么了。ENIAC下一步的行动由两件事决定。首先是它的布线,因为程序脉冲的目的地取决于ENIAC中承载它的电线的另一端被插入的位置。第二个因素是接收装置上的开关设置。ENIAC类似于RadioShack盒装电子套件,为特定工作配置它包括将制造特殊用途机器所需的单元连接在一起。gydF4y2Ba

ENIAC团队最初将配置ENIAC以执行某个特定问题的任务称为“设置”机器。一个特定的配置被称为“设置”,并以图表的形式记录下来,显示每个单元所需的布线模式和开关设置。这种表示方式与现代程序,甚至与哈佛马克1号控制磁带有很大的不同。事实上,与中继计算机使用的编码指令相比,ENIAC的排序操作方法对现代观众来说要难掌握得多。gydF4y2Ba

当计算机科学家回顾20世纪40年代的计算机时,他们经常会争论哪一种计算机是“图灵完备的”。这在很大程度上取决于它们实现条件分支的能力,这意味着在两种可能的行动过程中进行选择的能力。决定是否终止一个循环被视为条件分支的一个特例,这确实是后来计算机的指令集实现循环的方式。gydF4y2Ba

然而,巴贝奇、洛夫莱斯和ENIAC的设计者们用循环而不是分支来建模计算的顶层结构。Lovelace的数学表示法将计算以摘要形式表示为重复一定次数的嵌套操作序列。ENIAC的设计者首先考虑建造“大约30个单元,这些单元能够在一条线上接收程序脉冲,并根据另一条线上接收到的脉冲在两条线上任意一条上传输它们。”如果把ENIAC的控制电线想象成铁轨,把控制脉冲想象成火车,那么这些开关就会根据接收到的控制信号,把脉冲引导到一条或另一条轨道上。这也许就是为什么后来引入了术语“分支”来描述这种控制动作的原因,因为根据ENIAC控制电路的操作,脉冲确实会跟随一个或另一个分支通过ENIAC的控制电线网络。gydF4y2Ba

然而,ENIAC的设计者很快就拒绝了简单的二进制开关,而倾向于更复杂的“步进器”,每个“步进器”都能触发多达六种不同的操作序列。ENIAC的“编程大师”单元组合了足够多的步进器和计数器,可以计算每个序列的迭代次数,并控制最多10个嵌套循环。将控制信号路由到每个步进器上的特殊输入将立即终止循环,这意味着循环机制也支持简单的条件分支。这就好像“if…”中的两个备选语句“Then”语句被视为最多迭代一次的循环。将后来的循环概念反转为条件分支的特殊情况,ENIAC将循环和循环终止作为基本行为。gydF4y2Ba

在ENIAC项目的早期,在设计工作还没有取得很大进展之前,哲学家转型的工程师亚瑟·伯克斯(Arthur Burks)制作了一张表,展示了ENIAC如何计算火炮弹道,这是该机器被委托执行的任务。虽然是独立开发的,但伯克斯的表的结构与一个世纪前由洛芙莱斯制作的表非常相似。在这两个表中,行代表计算中的步骤,每个存储单元都被赋予了自己的列,单元格显示了计算中每个点上每个单元的内容。gydF4y2BadgydF4y2Ba正如我们在2015年9月的专栏中所讨论的,这些表本身并不是程序,最好被视为机器运行的轨迹或演练。gydF4y2BaegydF4y2Ba两个表都表明需要嵌套循环,但当它们被生产出来时,两个目标机器都没有明确定义的迭代机制。从某种意义上说,这些表充当了机器设计者的功能规范:设计一种机制来生成这个操作序列,然后你的机器就会成功地完成这个计算。gydF4y2Ba

尽管两台机器的架构截然不同,但这种惊人的趋同进化表明,对一个问题的分析,以及将其简化为一系列算术运算,与最终指导这些运算的控制系统的具体细节几乎没有关系。的确,用于为自动计算机规划计算的方法常常与早期技术的方法相结合,无论是在穿孔卡片机或台式计算器在大规模数学工作中的应用,还是在办公室中对打印表格和文书程序的分析。gydF4y2Ba

回到顶部gydF4y2Ba

最早关于“编程”的讨论gydF4y2Ba

我们在前一节中提到的ENIAC的“编程大师”提醒了你两件事。首先是在ENIAC项目中,“程序”一词与自动计算机的控制纠缠在一起。gydF4y2BafgydF4y2Ba第二,它的意思并不是你想象的那样。到了20世纪50年代,“大师级程序员”读起来就像是一个有点奇怪的职称。在1944年,它是一对塞满电子设备的盒子,通过产生控制脉冲来反复触发操作序列。事实上,“程序”和“编程”这两个词在项目文件中突然出现,用来描述ENIAC控制系统的许多不同方面。除了将其控制信号称为“程序脉冲”外,1944年6月的一份进度报告还描述了两个累加器单元,当程序脉冲触发它们所附的乘法器单元时,它们“被自动编程接收乘法器和乘法器”。这种对“程序”的使用符合巴贝奇所熟悉的一个概念,即自动计算机是为了执行规定的操作序列而制造的。它的控制机制必须以正确的顺序触发正确的操作的执行。这与“节目”在其他情况下的含义非常相似,例如,一个电台节目编写者的工作,他为广播选择和安排节目,为一系列音乐会的节目,或一个学生长期遵循的学习计划。使用“程序员”作为洗衣机上一个简单的机械控制单元的名称反映了类似的用法:将表盘转动到特定的点,就会触发特定洗涤操作序列的执行(旋转、漂洗、洗涤等)。与此相呼应的是,“程序”在ENIAC上的一个主要含义是描述在其中一个单元上设置的单一操作。 What were being programmed were the operations of the internal circuitry of that unit.

然而,到了1945年底,ENIAC团队开始用一种更接近现代意义的方式来谈论“编程”。这反映了一种思考自动控制的全新方式的出现。gydF4y2Ba

回到顶部gydF4y2Ba

EDVAC与现代代码范式gydF4y2Ba

1945年春,数学家约翰·冯·诺伊曼(John von Neumann)根据他与ENIAC团队成员的合作,撰写了《EDVAC报告初稿》(The First Draft of a Report on EDVAC),但该报告从未有过第二稿,更没有发表过文章。尽管如此,它还是列出了基本的架构,几乎所有后来的计算机都是从这个架构发展而来的。冯·诺伊曼为EDVAC提出的基本结构的计算机通常被称为“存储程序”计算机,EDVAC是宾大根据政府合同设计的ENIAC的后续产品。我们之前批评过这个术语含糊不清,不可救药地充斥着相互矛盾的含义,但这些词至少有一个优点,那就是暗示着EDVAC的吸引力与它的控制系统有关。gydF4y2Ba5gydF4y2Ba

正如冯·诺伊曼所描述的,EDVAC将放弃ENIAC的特殊用途单元及其复杂的分布式控制系统。就像巴贝奇的分析机和20世纪40年代的中继计算机一样,EDVAC将一次读取和解码一个指令,执行代码指定的操作。新奇之处在于,该代码将控制和算术指令集成在一组极简的单一指令中。EDVAC不需要中继机的混合控制方案,也不需要ENIAC的专用机构和编程线和开关。gydF4y2Ba

我们之前已经确定了自动控制EDVAC方法的关键方面为:gydF4y2Ba

  • 程序完全自动执行。gydF4y2Ba
  • 该程序被编写成单个指令序列,在第一稿中称为“命令”,这些指令和数据一起存储在编号的内存位置。这些指令控制着机器操作的各个方面。同样的机制也被用来读取代码和数据。gydF4y2Ba
  • 程序中的每条指令都指定了一组可供程序员使用的原子操作中的一个。gydF4y2Ba
  • 程序的指令通常按照预定的顺序执行。gydF4y2Ba
  • 然而,一个程序可以指示计算机脱离这个普通的序列,跳到程序中的另一个点。gydF4y2Ba
  • 在程序执行过程中,指令所处的地址可以改变。gydF4y2Ba5gydF4y2Ba

冯·诺伊曼的设计融合了算术和控制的设施。它包含了两种指令,格式相似。他的算术电路可以用来有条件地选择数字,而他的存储电路可以改变跳转指令的目的地,也可以覆盖数字数据。这种控制和算术操作的统一,比EDVAC更著名的创新——将指令和数据存储在同一个可写和可寻址存储器中——更重要,也更方便。已知的第一个用EDVAC风格编写的程序是由冯·诺伊曼自己开发的,现在在费城的美国哲学学会展出。gydF4y2Ba6gydF4y2Ba1948年4月,在ENIAC转换为新的编程模式后,第一个在真正的计算机上运行的是直接从一个只读内存中执行的。gydF4y2Ba4gydF4y2Ba几个月后,在曼彻斯特大学,一个程序被加载到一个实验性的可写存储器中并执行。gydF4y2Ba

在第一稿中,冯·诺伊曼遵循了马克一世的术语,给出了定义EDVAC指令集的“指令代码”。1946年,他在高等研究所成立了计算团队,构建了自己的类似edvac的计算机,该团队在一系列颇具影响力的报告中扩展了这一用法。这些报告将问题准备的过程分为两个大阶段。“计划”被描述为“准备的数学阶段”,但“编码”包括绘制流程图和编写说明。gydF4y2BaggydF4y2Ba

然而,在宾夕法尼亚大学,动词“编程”的含义迅速从描述负责在正确时间触发操作的控制电路的动作,转变为描述设计这种序列的人类的工作。1945年底,一份报告将“为ENIAC规划设置”中使用的做法描述为“编程技术”,gydF4y2Ba2gydF4y2Ba该项目的一位负责人在信中指出,“EDVAC将包含大量能够记住编程指令的单元”,“在实际程序启动之前”将从磁带上复制这些单元。gydF4y2BahgydF4y2Ba那时,“编程”基本上等同于冯·诺伊曼的“编码”,到1947年初,“程序”这个名词已经被牢固地定义为指编码的指令序列。gydF4y2Ba我gydF4y2Ba

在20世纪50年代,“编码”获得了一个更具体的含义,作为编程任务中最机械的部分,如查找与特定指令对应的数字代码。在一些组织中,“编码员”一直是初级程序员的工作头衔。在过去十年左右的时间里,它又作为极客自豪感的表达而重新流行起来,这也许是对软件开发人员越来越抽象的工作头衔(如“软件工程师”或“解决方案架构师”)趋势的一种反应。gydF4y2Ba

回到顶部gydF4y2Ba

新的意义gydF4y2Ba

篇幅不允许我们在任何细节上跟踪节目和编程概念的进一步演变,因此我们将标记后续历史的几个关键方面。首先是在20世纪40年代末和50年代,有时会对装入内部存储器的“存储程序”和连接到插板上或从磁带上一次读取一条指令的“外部”程序进行区分。gydF4y2Ba5gydF4y2Ba

在20世纪50年代初,“自动编程”系统,如汇编器,使程序的概念变得复杂。由计算机实际执行的程序,一串数字代码,变成了可以由另一种输入自动生成的东西,也就是俗称的“伪代码”。这就引入了可以查看程序的两个层次,而这两个层次之间的关系被广泛理解为翻译的关系之一。gydF4y2Ba8gydF4y2Ba

随着自动编程系统变得越来越复杂,语言隐喻开始流行起来。IBM在1957年发布的FORTRAN系统,将数学表达式、数据结构定义和控制结构翻译成可执行程序。FORTRAN被认为是第一种广泛使用的“高级编程语言”。Donald Knuth和Luis Trabb Prado探索了许多导致这一里程碑的晦涩和实验性的系统,他们得出的结论是,Konrad Zuse在1948年发表的提案Plankalkül是对编程语言概念的第一个公开描述。gydF4y2Ba7gydF4y2Ba

整个20世纪50年代,在不同类型的机器上运行程序的需求不断增加,导致人们开始寻找一种“通用的”编程语言,最终在1958,1960年Algol提议的发表中达到了顶峰。一个Algol程序与特定的计算机没有关联,之后gydF4y2Ba通信gydF4y2Ba在“算法”部门的语言上进行了标准化,通常主要是为了让人类阅读,而不是由机器执行。如今,“程序”一词的使用范围已经扩大到既可以指用高级语言编写的“源代码”,也可以指在特定机器上翻译为可执行的“目标代码”。gydF4y2Ba

回到顶部gydF4y2Ba

结论gydF4y2Ba

在20世纪40年代之前,没有人谈论计算机编程,也没有计算机具有我们所认为的可编程性的原始和基本含义:自动执行指定的一系列操作的能力。虽然这种编程的意义可以应用于能够执行一系列编码算术运算但不能自动化复杂控制结构的机器,但事实是,“编程”最早的引用出现在第一个能够自动执行嵌套循环和条件分支的计算机:ENIAC的背景下。gydF4y2Ba

我们将ENIAC的控制创新视为实用的工程响应,以满足对机制的需求,不像纸带或人工干预,能够跟上其前所未有的电子操作速度。它的设计者依靠特定问题的布线,将“编程脉冲”网络路由到机器周围。在EDVAC的“初稿”设计中,冯·诺伊曼扩展了中继计算机的编码方法,设计了一个单一指令集,它不仅可以表达算术运算序列,还可以表达ENIAC上首创的控制结构。EDVAC代码统一了算术和控制,编写了单一的一组逻辑电路。正是在这种背景下,人们开始将编码的指令称为“程序”,这个用法是从ENIAC项目中“程序”和“编程”的相关但截然不同的含义演变而来的。gydF4y2Ba

这为计算机编程的发明及其与逻辑的关系提供了一种截然不同的观点,而不是人们普遍认为的20世纪40年代计算机的发展是由艾伦·图灵的理论工作直接指导的。在这种历史观中,一种对“普世性”思想的形而上的吸引力,激发了计算机建造者之间的一场竞赛,希望能第一个勾选一个标记为“图灵完备”的方框。冯·诺伊曼对EDVAC的设计是优雅的,它对ENIAC控制能力的概括和简化无疑反映了他在数学逻辑方面的基础。能够处理多种不同计算的计算机的有用性当然得到了第一批自动计算机的创造者的赏识。20世纪40年代和50年代的计算机建造者采用了EDVAC的新设计范式,因为它们提供了一种有效的方式使真实的机器自动化,运行真实的计算来解决真实的问题。gydF4y2Ba

回到顶部gydF4y2Ba

参考文献gydF4y2Ba

1.布罗姆利,A.G.巴贝奇的分析机方案28和28a的程序员界面。gydF4y2BaIEEE计算史编年史22gydF4y2Ba, 4(2000), 519。gydF4y2Ba

2.埃克特,j.p.,莫切利,j.w.,戈尔茨廷,h.h.,和布雷纳德,J.G. ENIAC的描述和电子数字机器的评论。AMP报告171.2 r。由国防研究委员会应用数学小组分发(1945年11月30日)。摩尔电气工程学院,费城,PA, 1945年。gydF4y2Ba

3.黑格,T.,普里斯特利,M.,和兰普,C.。gydF4y2BaENIAC在行动:制造和改造现代计算机。gydF4y2Ba麻省理工学院出版社,剑桥,马萨诸塞州,2016年。gydF4y2Ba

4.Haigh, T., Priestley, M.和Rope, C. Los Alamos押注ENIAC:核蒙特卡洛模拟,1947-1948。gydF4y2BaIEEE计算史编年史36gydF4y2Ba3 (JulySept。2014), 4263。gydF4y2Ba

5.Haigh, T., Priestley, M.和Rope, C.重新考虑存储程序的概念。gydF4y2BaIEEE计算史编年史36gydF4y2Ba1 (Jan.Mar。2014), 417。gydF4y2Ba

6.Knuth, D.E.冯·诺伊曼的第一个计算机程序。gydF4y2BaACM计算调查2gydF4y2Ba, 4(1970年12月),247260。gydF4y2Ba

7.编程语言的早期发展。在gydF4y2Ba《二十世纪计算机史》gydF4y2Ba, N. Metropolis, J. Howlett和g . c。Eds的罗塔。,Academic Press, New York, 1980, 197273.

8.Nofre, D., Priestley, M.和Alberts, G.当技术成为语言。gydF4y2Ba科技与文化55gydF4y2Ba, 1(2014年1月),4075。gydF4y2Ba

回到顶部gydF4y2Ba

作者gydF4y2Ba

托马斯·黑格gydF4y2Ba(gydF4y2Bathaigh@computer.orggydF4y2Ba)是威斯康星大学密尔沃基分校信息研究副教授,SIGCIS计算历史学家小组主席。gydF4y2Ba

马克·普里斯特利gydF4y2Ba(gydF4y2Bam.priestley@gmail.comgydF4y2Ba)是研究计算历史和哲学的独立研究者。gydF4y2Ba

回到顶部gydF4y2Ba

脚注gydF4y2Ba

a.查尔斯·巴贝奇(Charles Babbage),《论计算引擎的数学力量》(On the Mathematical Powers of the computation Engine), 1837年的手稿被几集转载。gydF4y2Ba

b.例如,在贝尔实验室的案例中,“数值结果可能被翻译成特殊的代码,并穿孔在标准的电传磁带上。”(B.L. Sarahan,《中继插补器:对其操作的描述》,海军研究实验室报告R-3177, 1947年9月25日,v.)同样,在《马可福音1》中,“控制胶带上的穿孔对应于Out栏中的代码21”。(哈佛计算实验室的工作人员,gydF4y2Ba自动顺序控制计算器操作手册。gydF4y2Ba哈佛大学出版社,剑桥,麻州,1946,14)。gydF4y2Ba

c.同上,第50页。gydF4y2Ba

d.我们利用这种相似性生产了一个ENIAC设置,执行由Lovelace指定的伯努利计算。在ENIAC模拟器上运行,它确实生成了伯努利数序列。gydF4y2Ba

e.艾伦·布罗姆利在《查尔斯·巴贝奇的分析机,1838年》中使用了“遍历”这个术语来描述洛夫莱斯的表,gydF4y2Ba《计算机史志》4gydF4y2Ba, 3(1982), 215。gydF4y2Ba

f.在D.A. Grier中讨论的“ENIAC,动词“编程”和数字计算机的出现。”gydF4y2BaIEEE编年史计算18gydF4y2Ba, 1(1996年1月),5155。gydF4y2Ba

g. Goldstine, H.H.和von Neumann, J。gydF4y2Ba电子计算仪器的规划和编码问题,第二部分,第一卷gydF4y2Ba(1947年4月1日,第7.9条)。绘制流程图被描述为编码的“动态或宏观”阶段,而编写指令则被描述为“静态或微观”阶段。gydF4y2Ba

h. h. Goldstine致h. Curry, 1945年10月3日,收录于宾夕法尼亚大学档案中的《ENIAC专利审判集》。gydF4y2Ba

i.例如,在S. Lubkin的《EDVAC的建议编程》(1947年1月)中,在宾夕法尼亚大学档案中的《摩尔学院电气工程办公室主任记录,1931 - 1948》合集的第8框中。gydF4y2Ba

回到顶部gydF4y2Ba

数据gydF4y2Ba

UF1gydF4y2Ba数字安装EDVAC的美军照片。gydF4y2Ba

回到顶部gydF4y2Ba


版权归作者所有。gydF4y2Ba

数字图书馆是由计算机协会出版的。版权所有©2016 ACM, Inc.。gydF4y2Ba


评论gydF4y2Ba


CACM管理员gydF4y2Ba

以下信件发表于2016年3月中华艺术学会《致编辑的信》(//www.eqigeno.com/magazines/2016/3/198861)。gydF4y2Ba
——CACM管理员gydF4y2Ba

Thomas Haigh和Mark Priestley的观点《Where Code Comes From: Architectures of Automatic Control From Babbage to Algol》(2016年1月)关注的是“代码”和“编程”这两个词以及它们是如何被定义成今天的样子的。然而,它也提到了在这些词获得当前含义之前的日子里的其他类型的编程,却没有承认它们在那些在“数据处理”层绘制模拟计算机图或绘制工作进度图并在该层连接单元记录设备的插电板的科学家和“卡师”的头脑中是完全相同的。如果实际上没有学者从现代程序员的角度发表过关于这些机器的插拔板布线的回顾文章,那么应该有人这样做。如果你从未连接过配线板,我强烈建议你试一试。学会感知脉搏,让一些有用的事情发生,或者在有人拔走电缆时调试问题。一旦你理解了机器,你会发现你马上进入编程模式,在这种模式下,电缆是代码,插板是子程序,而地板是程序。绘制流程图,曾经是编程的意义所在,不管目标环境是什么。gydF4y2Ba

我所见过的唯一一个在UNIVAC SSII 80(大约1963年)计算机上编写了一个重要的生产程序并看到它第一次运行就成功的程序员,是一个老配线板高手。他把程序的流程图绘制成他学习机房工作流程图的方式。编程的“概念”对他来说并不新鲜。gydF4y2Ba

本·施瓦兹gydF4y2Ba
邓炎昌乡、新泽西gydF4y2Ba


显示gydF4y2Ba1gydF4y2Ba评论gydF4y2Ba

Baidu
map