条目中,它指出 ENIAC 有 5 种编程语言。我相信其中一些只是不同图形系统的名称,但 ARC Assembly 和 Curry Notation System 似乎更有希望成为一种看起来更现代的编程语言。尽管如此,我查了一下这些名字,却一无所获。
- ENIAC编码系统(1943-1946年)
- ENIAC短代码(1946年)
- 冯·诺依曼和戈德斯坦图形系统(符号)(1946年)
- ARC 组装(1947 年)
- 柯里符号系统(1948年)
那么,ENIAC 有真正的编程语言吗?
22
最佳答案
4
TL;DR:没有。
至少不是在现代意义上,编程语言意味着(大部分)文本表示,旨在通过自动化(计算机/程序)转换成可由计算机加载和执行的表示。
部分原因是 ENIAC 在 1949 年之前无法自动加载程序,甚至在那之后也不具备翻译功能。
为了接近回答这个问题,重要的是要记住,ENIAC 绝不是当今任何定义下的计算机。同时,对编程含义的理解也并非像今天这样形成。这就像在现代鸡出现之前谈论鸡和蛋是什么一样 (*1)。
如果可以理解,编程就像广播或电视节目一样。一组固定的项目序列。而不是复杂过程的灵活实现。同样,编程的想法是使用一种文本/人类可读的书写形式来描述一个可以像任何其他文本一样阅读的过程,而不是一种固定的形式。毕竟,任何书写的东西都必须变成电路。
哎呀,1945 年甚至连我们现在所知的汇编语言(通常被认为是最低级的编程形式)都还没有发明。让计算机将人类可读的文本转换成程序(又称自动编码器 (*2))的整个想法绝对是科幻小说。更不用说当时没有硬件可以做到这一点 (*3)。
从技术上讲,ENIAC 是组件的“集合”,最值得注意的是由 ALU 和寄存器组成的 20 个“核心”组件。要对其进行“编程”,需要根据预期的数据流连接这些单元并拨入 (*4) 要执行的操作。任何“语言”都是关于如何插入电线的,因此更像是绘制示意图。
冯·诺依曼的上述绘图(使用他与戈德斯坦共同开发的符号)可能是最接近早期 ENIAC 的抽象编程语言。(取自这篇*5)
在 1947 年之后的更新中,功能表被修改并与标准设置相结合,因此它们可以更像(只读)程序存储一样使用。编程现在简化为根据需要设置部分或全部 1200 个拨盘。一些累加器现在被指定为数据寄存器、程序计数器和索引寄存器。
又过了一年,设置才被修改为从穿孔卡读取器读取这些设置,最终将其变成一台存储程序计算机。直到现在我们才开始将 ENIAC 视为一台与今天类似的计算机。相当原始,但至少可以比较(*6)。
所有这些仍然没有今天可以确定的编程语言。而且也没有太多的存储空间——直到 1953 年,ENIAC 才拥有 100 字核心内存(约 500 字节)。
因此,任何“语言”在使用过程中都严格遵循某种私人符号方案,用于准备任一阶段(接线、拨号、打孔卡),然后必须手动将其转换为其中任一格式。因此,如果您想了解这两种语言是什么,您可能需要阅读相关论文。最著名的是 RF Clipingerer 于 1948 年发表的《(),提供了很好的概述。
可能也是一个有趣的开始,里面有关于 ENIAC 编程的各种故事。当然,你也可以立即 ;))
附言:是的,我还必须知道,上述五项清单可以在整个网络上找到,但几乎没有进一步的信息。所有这些复制粘贴都很糟糕。它只能满足肤浅的好奇心,但对于任何寻求真正知识的人来说都是无用的。
*1 – 是的,它们是恐龙的后代,恐龙也会下蛋,尽管如此,我们今天所知道和使用的大多数鸡种仅起源于大约 800 年前的意大利北部。因此,任何有关之前鸡的问题都会变得相当模糊。
*2 – 是的,Autocoder,就好像计算机在编程自己一样。从本质上讲,开发人员第一次梦想一台计算机,每个人都可以编程,而不需要太多的计算机知识……不难看出,从 Autocoder 到 COBOL、BASIC 和 4GL,再到如今人工智能让程序员变得不必要的承诺,这种重复是层出不穷的。
*3 – 事实上,第一个类似自动编码器/汇编器的编程环境是一个硬件设备,即“Planfertigungsteil”(现代翻译可能是程序制造设备),由 Zuse 于 1942-1945 年为 Z4 计算机实现。这是一个机电硬件设备,允许使用抽象操作名称以及符号地址写入穿孔带。该设备在输入过程中会检查操作及其参数是否为有效组合。
有趣的是,构建了 Planfertigungsteil (*3) 的 Zuse 设想使用一种更高级的编程语言,这种语言将使用二维的、几乎是图形的符号,与今天截然不同。
*4-每个累加器需要转动十几个真实表盘:)
*5 –解释了在当今术语及其含义的基础上研究真正的早期技术时的一些问题。RC.SE 用户可能很容易遇到的问题。幸运的是,对于这个问题,编程 ENIAC 是所用示例的一部分 🙂
*6 – 一个有趣的影响是,这种“进步”是以性能的急剧下降为代价的。速度比没有时慢了大约 6 倍,并且所有单元不再并行运行。但编程速度却有了巨大的提高。不再需要花费数小时或数天来设置所有线路和刻度盘,之后可能还需要花费数天甚至数周的时间进行调试。
5
-
非常感谢您所做的研究和撰写——ENIAC 的悠久历史总是令我印象深刻。出于好奇,您从哪里得到这张图片?
– -
@Schilive 哎呀。来源已添加。
– -
我可能错了,但《ENIAC In Action》这本书似乎有很多信息。在他们的网站上,他们有一张,上面有一些旧的编程语言示例。
– -
@Schilive 把那本书放在了我的书架上。
– -
Raffzahn,我刚刚预订了电子书!
–
|
这个答案补充了@Raffzahn 的优秀答案。
最近读了凯西·克莱曼 (Kathy Kleiman) 著的《试验场——编写世界第一台现代计算机的六位女性不为人知的故事》,赫斯特出版社,2022 年出版。这本书讲述了 1945 年和 1946 年首次编写 ENIAC 程序的女性,当时它还在宾夕法尼亚大学摩尔工程学院,后来被搬迁到位于马里兰州阿伯丁试验场的美国陆军弹道研究实验室 (BRL)。
这些女性都是数学家,拥有大学或学院数学学位。二战期间,她们担任人体计算机团队负责人,使用机械计算器和微分分析仪为美国陆军计算弹道表。随后,她们被邀请参与 ENIAC 的研发。
当时没有用于 ENIAC 的编程语言,也没有操作系统或编译器。妇女们通过研究电路图自学了如何编写 ENIAC 程序。
摘自第137页。
六个女人必须从亚瑟留给她们的图画中寻找线索。
… 想想设备正面的示意图,“我们必须弄清楚如何解决问题,如何让机器按照你的意愿工作。你必须从前面设置开关、插入插头等来做到这一点”
他们必须
将 ENIAC 的单元串在一起,将数字从一个单元传递到另一个单元,进行乘法、除法和其他运算……数字被称为数字,这些十位数字通过“数字线”和“数字托盘”在单元之间传递。
他们需要将程序脉冲从循环单元(ENIAC 的 GO!)移动到每个单元以启动其运行。循环单元脉冲沿着单元的背面运行,程序员可以使用它来启动一个或多个单元以执行程序的下一步或几步。
… ENIAC 的编程意味着“我们必须将机器连接起来……以便进行排序”。他们需要处理程序的每一个逻辑和物理步骤,并准备整个“问题的排序”。
多年后,在 BRL 工作的人们将这种编程称为“通过脉冲、开关和电缆进行编程”,其他人则称之为“直接编程”。
通过研究图纸,一位女士意识到主编程单元的一个功能是能够运行循环。这是通过设置开关来实现的(第 139 页)。
在设置程序时,数字电缆又粗又重,而程序脉冲电缆则较细。
接续第147页。
在开发程序时,一位女士(数学家 Jean)将复杂的弹道方程(用于弹道学)分解为更易于管理的方程。另一位女士(后勤专家 Betty)将这些数学部分进一步分解为 ENIAC 可以处理的细小步骤和增量步骤。
要使 ENIAC 完成两个数字之间的加法,所需的步骤如下:
知道累加器 4 保存了下一步所需的先前计算的结果(要添加的第一个数字,例如 10)。
将累加器 4 的操作开关设置为希腊字母 alpha,以接收位于编程开关上方的字母数字输入连接器上的数字
将累加器 6 的操作开关设置为 A,以通过其 A 数字输出连接器将其数字(例如 5)传输并添加到累加器 4。
在相同的程序脉冲上启动累加器 6 进行发送,并启动累加器 4 进行接收。
将结果保存在累加器 4 中,直到程序稍后需要它为止
接续第149页。
为了简化编程过程,妇女们设计了“踏板表”。这是一张大纸张,有 27 列和 16 行。
各列从左边开始标记,第 1 列为 MP(主程序员),然后是 Acc 1 和 Acc 2(累加器 1 和 2)、Divider(除法器)和平方根器、Acc 3 到 Acc 10、HSM(高速乘法器),等等,ENIAC 的大多数单元都是如此。
行代表程序的每个增量步骤。表格上的每个方格都填有程序详细信息,例如数字线、程序脉冲线、开关设置等。
为了添加更多信息,我们用四支彩色铅笔来表示颜色。它有助于标记计算机中脉冲、开关和电缆的顺序。它有助于显示整个计算机的数据流。
接续第155页。
最终,两位女士找到了一种并行编程 ENIAC 的方法,因为如果没有它,ENIAC 的速度会太慢。这很难做到,因为它依赖于正确的时间安排。
这个概念很简单。一个程序脉冲可以同时输入到多个单元。因此,累加器可以开始加法,高速乘法器可以同时开始乘法。
但时间是个问题。累加器的运行速度比乘法器快十倍——它每秒可以对乘法器执行 5000 次加法,每秒执行 500 次乘法。因此,如果程序的下一步需要累加器和乘法器的结果,程序员必须确保等待足够长的时间,让乘法器完成计算,然后再使用累加器和乘法器的结果开始下一步。
|
既然你说“你查了这些名字却什么也没找到”,也许解释一下这些语言是什么是很有说明性的,这样你就能看到它们都是“真实的”。
ENIAC编码系统
我认为这指的是 ENIAC 最初的编程方式。对此的描述如下:
在运行的最初两年里,ENIAC 的问题通过列出复杂的开关设置和电缆连接来编码。
每个单元都进行了编程:
累加器前面板从下到上包含:程序托盘和插座;程序控制霓虹灯;输入、输出插座;程序控制;数字输入和输出插座;数字托盘和插座;最后是计数器霓虹灯。[…] 程序脉冲通过电缆从程序线路由到程序输入插座 1i、2i 等。
所引用的报告第 9 页有一张图表。
看到配电盘和电缆的图像:
ENIAC 短代码
最重要的贡献之一就是现在所谓的:程序和数据是相同的,程序可以编码为数字,并存储在相同的内存中。
因此,为 ENIAC 选择固定电缆,并赋予某些累加器专用角色,并通过使用附加硬件将十进制数字对解码为控制线,就可以将程序存储在“函数表”(基本上是系数表)中。
这与当今机器代码的工作方式非常相似。
来自“逻辑编码系统”的短代码表的一部分:
冯·诺依曼和戈德斯坦图形系统(符号)
报告中有所描述。
它相当于您正在寻找的高级语言。
请记住,ENIAC 的典型应用是例如用数字方式求解微分方程。没有人能够看到微分方程然后开始将电缆插入不同的 ENIAC 单元。因此,必须先以抽象的方式写下求解该微分方程的算法,然后手动将其转换为电缆和系数或顺序列表。
图表在今天的计算中仍然有使用,而且不需要计算机通过编译器将文本文件转换成其他内容,它实际上是一种比今天的高级语言更明显的符号表示方式。
以下是报告中的一个例子:
感兴趣,这是为 Zuse 计算机开发的类似的高级语言。
ARC 组装
ARC(自动继电器计算器或自动继电器计算机)实际上是与 ENIAC 不同的计算机,但我认为这里的意思是将 Kathleen Booth 为 ARC 开发的相同原理应用于 ENIAC。
她的想法是使用简短的“图形”描述来表示“命令”或指令,而不是使用数字本身。我曾在 ENIAC 的后继产品中看到过这种表示方式,但实际上 ENIAC 本身并没有使用这种表示方式(尽管可能曾经使用过)。指令通常用箭头表示值的流动。
这与今天的汇编类似,但没有助记符。
中找到(这使用“to”而不是箭头,因为这在打字机上更简单)。
柯里化符号系统
是一位逻辑学家。他与 Schönfinkel 一起开发了一种“组合子”逻辑,该逻辑可应用于 lambda 演算(以及非常间接地应用于基于 lambda 演算的现代函数式编程语言,如 Haskell 和 ML 系列)。
找到一组有关 ENIAC 与他的工作有何关联的幻灯片。
简而言之,他的符号是关于计算元素的可组合性(很像逻辑组合器)。这又是一个非常图形化的符号,尽管至少逻辑组合器都有公式和归约规则等价物。
|
正式地说,正如有人所说,计算机语言必须翻译成机器可读的语言。我曾经编写过由硬件直接执行的 BASIC 语言。按照这个定义,它不能算是一种语言。
但问题实际上是文本字符串是否代表计算机可以执行的指令。冯·诺依曼提供了语言的绝佳示例。
我清理了这张图片:
我们(似乎)看到:
- 将 B 和 S 寄存器初始化为 0
- 将常数存储到 X 寄存器
- 将 B 寄存器加 1
- 检测结果为阳性并跳转(方框)
- 增加寄存器 M 并存储在 X 寄存器中
- 取反寄存器 S
- 循环索引范围从 1 到寄存器 B
这种粗糙、临时的语言缺乏语法,但是有控制结构。
令人惊讶的是,这个东西看起来与我必须修复无数错误的一些旧代码几乎完全相同。
0
|
–
–
–
–
–
|