如何给一个外行人解释:世界上第一个程序是如何写出来并让它按规定运行?

时间:2022-08-20 19:07:24
一堆土怎么盖出高楼大厦的?其实是一个道理,两个字,工程。
完成一项大的工作,有三个步骤:
  1. 找到一个可行的理论,这是科学的范畴,也是最困难的一步
  2. 将理论的可行性转化为实践的可行性,这是技术的范畴,同样需要天才和灵感
  3. 用这个可行的方法重复一千遍,在这个过程中找到最有效率的执行方案,然后再重复更多次来做出更复杂的应用,这是工程
工程是看上去最神奇最宏伟的一步,但其实是最不复杂的一步,毕竟路都铺好了,工程师们通常要做的只有:
  1. 创造出更合理的工具来提高工作效率
  2. 发明出更合理的分工来提高工作效率
  3. 总结出更容易学会的经验来提高工作效率

它无非是对于这件事,要如何把更多的人力投上去、让这些人力发挥最大效率、从而在最短时间内完成工作的问题,跟前两步来说,根本没有什么困难的。就像研究力学原理最困难,发明大楼的设计方法其次,而设计出大楼并没有那么难,照着图纸施工更是搬砖的活了。


对于计算机科学也是这样的。提出存储程序原理的冯诺依曼是天才,提出可计算理论的图灵是天才,发明出晶体管的肖克利是天才,发明锁存器、DRAM、总线、操作系统原理、编译原理、C语言……这些天才的名字我甚至没法一一叫出,我们这些工程师只是在前人种下的大树下,用前人发明好的方法重复着自己的工作,同时尝试着做出一点点微小的贡献而已。


计算机能进行计算,首先归功于非线性元件的发现,这个开端还不是半导体晶体管,而是继电器、电子管等等。在这之前人们已经可以用电阻分压进行一些计算了,但是很幼稚,得到的结果也不准确;而经过这些元件的研究,人们发现我们可以将信息表示为数字信号,用0-1的二进制来进行运算,这样就可以通过电路得到精确的结果,这很快就表现出了对手摇计算机的领先。某些电路可以让一个输入信号变成它的相反的值,0变成1,1变成0;某些电路可以让两个输入信号变成与或者或的关系,与也就是00、01、10都变成0,而11变成1,或则是00变成0,而01、10、11都变成1。布尔代数这个工具告诉我们,以上的逻辑加在一起就足够表达所有可能的逻辑了,包括加减乘除在内,于是我们可以用二进制进行运算。


曾经对计算机来说,所谓“编程”,指的是把线路板上可变的线路重新插接起来,让它们连接成可以工作的电路;甚至于debug,指的是有虫子飞进线路里被电死了,造成了短路,需要人去把它们取出来,所以叫做de-bug,bug就是虫子的意思。后来冯诺依曼提出了存储程序的概念,我们不是用插线,而是用存储在电子元件中的程序来控制线路之间的连接,这样就大大提高了我们重新布线的效率;而这样的机器能完成怎样的任务,这个问题则由另一名天才图灵解决了:简单来说,能完成任何任务。这样人类就有了第一台通用电子计算机ENIAC,一个庞然大物。虽然不知道细节,但它大概是从穿孔卡片之类的外设中读入第一个程序的。穿孔卡片的历史就远比计算机要早了,甚至可以上溯到十八世纪;IBM最早也是靠它发家的。为了存储数据,ENIAC甚至用了一个水银槽,把电转换成声波,让声波沿着水银槽传播来实现延迟,从而暂存数据。不管怎么说它的确是可以工作的。


程序是如何替代线路来运算的呢?其实并没有什么神秘的。我们看继电器,它通电的时候,就导通一条线路,关闭的时候则断开;如果我们将所有的可能的连接上都连上线,就可以用继电器来控制这些线是通还是断,也就相当于控制了电路。更好的一点是,我们运算的结果可以反过来修改存储的状态,于是这个运算可以按照我们设计的步骤连续不断地运作下去,大大扩展了计算机可以进行的任务种类。


如果你想知道第一个程序如何运行的,大概到这里就结束了;但是离office还远。


电子管计算机不管是价格还是寿命都有大问题,后来人类发明了晶体管,然后是集成电路,它大大降低了计算机的尺寸和成本,于是小型机甚至个人PC变为可能。再后来,计算机越来越廉价,也就有越来越多的人用得起,为了让所有人都能用得上,IBM、贝尔实验室等机构就联合起来想要开发一个叫做multics的操作系统。


操作系统是什么呢?以前的计算机一次只运行一个程序,它接受指定好的输入,完成指定的工作,打印到纸带输出,然后就停机。但现在的计算机计算能力很强,仅仅一条纸带的输入速度已经满足不了它了,为了提高效率,它必须能同时输入多道数据,运行多个任务,从而提高效率。对于以前的计算机来说,计算,然后决定读取数据,然后等待数据读进来,这时候计算机完全停转等待着穿孔卡片(纸带),这是对计算机的浪费;而有操作系统了之后,计算机会在等待数据输入的时候,切换到其他计算任务上,直到读取完成之后再切换回来进行原来的任务,这样就让输入输出(IO)与计算进行了重叠。


然而这个计划悲惨地失败了,大概是因为当时的人们还没有充分认识到,软件的开发是一项独立于硬件的工程,直到认清这件事的时候已经晚了,贝尔实验室和IBM都因为开发延迟而退出了这项计划。但通过这个大项目,人们认清了几件事:

  1. 软件开发的复杂度超过了人们的想象,必须用正确的方法来进行;这个正确的方法叫做模块化。将软件的功能拆分成小的模块,这样人们才能有效地协同起来共同工作;否则仅仅投入人力是不够的。
  2. 工具的重要性。要高效率的开发软件,我们需要高级语言而不是汇编。

后来,multics的遗迹上,两个爱玩游戏的工程师为了玩游戏,从遗弃的代码中开发出了Unix,顺便发明了C语言。

从这以后,软件工程的路上一片坦途。没过多久,也有了我们熟知的DOS和Windows。


这之后的故事就简单了,就像我最早说的,我们工程师只是在铺好的路上重复劳动,再一点点改进原来的方法,从DOS到Windows,从16位到32位,从文本模式到图形模式,从实模式到保护模式,我们的工具每天都在进步,但我们做的事情其实与几十年前没有多大区别。就像是搭积木,我们每个人都学会了怎么搭上自己的一块,最终我们搭出了庞然大物,但这其实并没有什么可稀奇的。

世界上第一台机械计算机,出现于崇祯十五年,清崇德七年,1642年(1643年牛顿出生,1644年李自成攻陷北京,崇祯帝自缢,留血书“任贼分裂朕尸,勿伤百姓一人。”明廷进入南明时代),19岁的法国数学家~帕斯卡~制造了钟表齿轮式机械计算机,但仅能做加减法运算。

如何给一个外行人解释:世界上第一个程序是如何写出来并让它按规定运行?
(永历三十二年,清康熙十七年,1678年,吴三桂称帝,蒲松龄落榜,同年吴三桂逝世,惠更斯向法国科学院提出光的波性理论——德国数学家莱布尼兹发明了可做乘除运算的计算机。 如何给一个外行人解释:世界上第一个程序是如何写出来并让它按规定运行?


道光二十二年,1842年,中国古典时代结束的第三年,英中签订《南京条约》。英国Lovelace女伯爵,一位名为Ada Augusta的女性,编写了世界上第一条程序(十进制),用于在分析机上计算伯努利数。她被认为是人类世界第一位程序员。

如何给一个外行人解释:世界上第一个程序是如何写出来并让它按规定运行?如何给一个外行人解释:世界上第一个程序是如何写出来并让它按规定运行?
(分析机是英国数学家查尔斯·巴贝奇在1837年(道光十七年)提出的只存在于设计阶段的机器,这台机器因为政治经济公关等原因并没有造出来。模型为: 如何给一个外行人解释:世界上第一个程序是如何写出来并让它按规定运行?
用打孔纸带输入。)


……
一战,默哀。
……
二战,默悼。


民国三十年,1941年,世界上第一台用电子元件制作的计算机,由德国~朱赛~用继电器制成。毁于战火。

如何给一个外行人解释:世界上第一个程序是如何写出来并让它按规定运行?

民国三十五年,1946年,举世闻名的第一台通用计算机(不仅仅是专门用于哪类计算,谓之通用)ENIAC埃尼阿克诞生。

如何给一个外行人解释:世界上第一个程序是如何写出来并让它按规定运行?如何给一个外行人解释:世界上第一个程序是如何写出来并让它按规定运行?如何给一个外行人解释:世界上第一个程序是如何写出来并让它按规定运行?如何给一个外行人解释:世界上第一个程序是如何写出来并让它按规定运行?
第一批真正意义上的通用计算机程序员,就是上面六位女孩子,她们的工作,是抽插电线和按开关(以及更换烧坏的零件)——划!重!点!这就是现代意义上!真正意义上的编程!也就是口口相传神乎其神的上古初代编程!——直接改电路!对电路下手!

(关于抽插电线,作为类比,见过老式电话站接线员的接线台吗?

如何给一个外行人解释:世界上第一个程序是如何写出来并让它按规定运行?如何给一个外行人解释:世界上第一个程序是如何写出来并让它按规定运行?如何给一个外行人解释:世界上第一个程序是如何写出来并让它按规定运行?
所谓编程,就是根据数学问题,编出电线的连接方式,然后制作用于输入的一大堆打孔卡片,这可能需要几个月。
但是埃尼阿克运算很快,轰!半个镇子的电都供上了~立马就能算出来~虽然输出也是一大堆打孔卡片~又需要再花几天时间翻译这些二进制孔~但还是快多了~



知道了这些,答主应该明白:现在的所有计算机编程,都是在实现那六个女孩子的工作。所谓按规定运行~这个规定!就是电路~电路不变,程序不变!


更专业点的科普:
计算机的数字电路(也就是各种编码器、译码器、加法器、锁存器、计数器……)是用逻辑门实现的,逻辑门懂吧?就是高中物理说的“与、或、非”,无论输入输出,有电流就叫做1,没电流就叫做0。
埃尼阿克的逻辑门,是用粗大憨实的电子管做的(一个逻辑门是用好多管子做的),所以埃尼阿克极为庞大。而且每过几分钟就会烧坏几根儿管儿。

如何给一个外行人解释:世界上第一个程序是如何写出来并让它按规定运行?如何给一个外行人解释:世界上第一个程序是如何写出来并让它按规定运行?
而现代计算机用半导体管(晶体管,用一两种半导体做的二极管三极管)代替了电子管,所以我们现在的个人电脑小多了,又叫微型计算机(微机)。
如何给一个外行人解释:世界上第一个程序是如何写出来并让它按规定运行?
(所谓半导体,就是位于元素周期表金属和非金属交界附近的硅、锗那类过渡元素,下图黄色部分——给它小电压它不通电,给它大电压它就通——所以叫它们半 · 导体。又因为它的分子结构是有空间规则的,不是乱排的,所以又叫晶体~见人教版高中化学选修3~
如何给一个外行人解释:世界上第一个程序是如何写出来并让它按规定运行?如何给一个外行人解释:世界上第一个程序是如何写出来并让它按规定运行?
换用如此小巧的原件以及他们的制作工艺后,集成电路和集成芯片就出现了。 如何给一个外行人解释:世界上第一个程序是如何写出来并让它按规定运行?如何给一个外行人解释:世界上第一个程序是如何写出来并让它按规定运行?(上图叫做单片机芯片,和下图的英特尔处理器,某种程度上说,是同类。这些处理器的核心,是寄存器,用于记录程序运行中产生的中间数据,以及负责挑选有我们需要的功能的电路(也就是各种“器”)。
还记得那六个女孩的连电线和按开关吗?
!所谓连电线,就相当于单片机编程里的选择寄存器、选择时钟、选择外部设备等等等。……甚至更原始些,现代意义上的有些寄存器,在那时还没有集合到一起,完全需要人下到更下一层的硬件去……接电线。
!所谓按开关,就相当于单片机编程里,给某寄存器的某位置1还是置0。

如何给一个外行人解释:世界上第一个程序是如何写出来并让它按规定运行?如何给一个外行人解释:世界上第一个程序是如何写出来并让它按规定运行?
集成芯片,就把那六个女孩连电线的各个设备,全都用化学材料填充的方法搞到芯片里了,所以叫集成芯片,也就是CPU*处理器。利用半导体各种通和不通的特性,代替了六个女孩子拔插电线的工作,所以里面就省了导线,所以才那么小。
(所以我们说,那时候的计算机,以处理器为核心;而现在的计算机,以存储器为核心;就是因为制作芯片变容易了,而我们需要处理的数据~和产生的数据却更多了。)
而更多的功能,就可以交给芯片外的集成电路了。
——如此这般,也就不需要每次编程都改电路了~只要用到哪部分电路,就在程序写一句代码,电流(0和1)就去找那部分电路了~
也就是说,编程通过控制电流,来选择需要的电路,从而实现那六个女孩子的工作~数据便在选好的电路里走一遍~然后吐出来——这就是“按规定运行”。

可能有的人无法理解那些女孩的工作与现代计算机的联系(所以我就再补充点儿)——那是因为ENIAC没有存储指挥自己指令的功能,所以每次遇到新的数学问题,都要重新接线;而现代计算机,是把指令预先存在了一个地方,所以我们只要敲代码就可以调用这些指令。

后来冯诺依曼又主持构建了EDVAC(1951年——共和三年、抗美援朝第二年、*和平解放——EDVAC才正式运行,虽然草案在ENIAC运行前就有了),这个新的计算机就与现代意义上的计算机很接近了,也是真正意义上的冯诺依曼体系(ENIAC事实上并不符合严格的冯诺依曼体系,因为它没有专门的存储装置,只有计算中必要的暂存器。)

如何给一个外行人解释:世界上第一个程序是如何写出来并让它按规定运行?(此计算机就没有ENIAC那么庞大夸张了,因为已经用到半导体元件了。)
由于EDVAC的指令都是预先存好在内存(那时候应该还没有外存),所以人们把程序与数据全都用有二进制“码”的磁带输入,输出装置则是一个示波器(或者磁带记录仪也有记录输出数据的功能?这方面资料不全,求人赐教。)——这就是“用二进制码编程”的直观由来。



PS
很多人对编程的理解或印象,都是直接从C、C++、Java、python等个人电脑端的高级语言来的。
但其实,只有了解汇编语言,或了解C51之类语言是怎么给单片机编程的人,才真正明白CPU到底是怎么回事,以及具体到实际电路是怎么个原理。远不是高级语言的思维。
所以,我就不再多讲了。连本行里都有一半儿的人拎不清,更别说外行。



PPS
数学爆发,是发生在明末清初的法国。
两三百年后的清末民国,是电磁学爆发。
三年内战抗美援朝十年*,是计算机爆发。
几次技术革命,我们全在乱世。现在,我们终于在和平年代,赶上互联网。
眼下知识尚未再次垄断,理应借助互联网,发展起来——这句话不是说国家,而是说个人。









我佛慈悲。
如何给一个外行人解释:世界上第一个程序是如何写出来并让它按规定运行?

说到第一个,第一个高级程序是低级程序写出来的,第一个低级程序是汇编语言写出来的,第一个汇编是用机器码人工敲出来的。第一个机器码的实现是人在纸上设计出来的。第一个人是吃小苹果的还是泥巴捏的东西方有争议,但那个“东西”一定是最棒的程序员,因为他用一种叫DNA的语言,写一个原型出来,这个原型会自动开发下一个原型来试图修复自己的bug,虽然偶尔会引入新bug,但这个程序居然自己变得越来越健壮了
----------------------
补充:其实原本只是写了一个叫cell的demo,被自发的fork出了很多不同版本。其中一个重量级的叫人。这个版本的出现导致了许多其他版本的消亡。因为对象生成太多随时还有溢出风险。
神级程序猿为了控制人程序,用一个小众语言RNA写了个优化大师(其实是virus),偶尔清清系统。

再补充一些面向对象实现细节:人程序里有M和W两个类,W对象的YD方法偶尔会调用M对象的YJ方法,返回若干亿的DNA代码型数组。最终W对象的ZG函数从中随机抽取1个,和自己产生的1个DNA代码值运算一下作为种子,返回一个新对象。
有些M找不到对象,会用Hand方法调用YJ,然而几亿数组的返回值都被丢弃了...

另:忽然想起来之前好像看到个专栏和我想法差不多:
上帝是个程序员 - oilbeater 的自习室 - 知乎专栏

第一个程序到Office应用可是差了个十万八千里了。不过要浅显地给你解释一个简单点的程序也容易,例如【把大象关冰箱】。

我们都知道这只需要三步:
1)开->冰箱
2)放->大象
3)关->冰箱

到了【电】脑里当然就只能通过【电】解决了!电啊!非常简单,不就是个【有电】跟【没电】啊!

先数数我们上面的程序涉及到的动作和对象:
一共是:【开】【关】【放】【大象】【冰箱】共5个。

因此,我们的第一个电脑的输入设备就只有5根线也就是5个输入端:

如何给一个外行人解释:世界上第一个程序是如何写出来并让它按规定运行?
将上面的程序输入进去就很容易了吧:
1) 如何给一个外行人解释:世界上第一个程序是如何写出来并让它按规定运行?2) 如何给一个外行人解释:世界上第一个程序是如何写出来并让它按规定运行?3) 如何给一个外行人解释:世界上第一个程序是如何写出来并让它按规定运行?我们的第一个程序在第一台简易电脑上就完成了,至于输入,我没记错的话较早时候程序是通过纸带输入的,那么我们做这么个纸带就能输入进去了:
如何给一个外行人解释:世界上第一个程序是如何写出来并让它按规定运行?
【延伸一下】
读过一点计算机基础的应该就能意识到了,计算机本质就是这样的,只不过在现代计算机里程序就是存储在磁盘中的电信号。规定【有电为1】【没电为0】,则我们的程序在现代计算机里就存成这样了:
1)10001
2)00110
3)01001

【再延伸一下】
某位大师说过程序就是由【指令】和【数据】构成的,如果注意看我上面的图第3和4条线相隔较远,这其实就是指令和数据分离了。因此我们的程序又可以进化成这样了:
1)100 01
2)001 10
3)010 01

【最后一下延伸】
上面的形式已经非常可怕了,分别给前面的操作命个名字不就是现代【汇编语言】的由来吗?汇编都让我们延伸出来了,C、C++、Java还远吗?

结合 为什么现在会有这么多种编程语言? - 知乎用户的回答 的回答可以进一步精进。
通断生01,
01生汇编,
汇编生万物

等同搭积木,利用元器件的开-关,电压高-低等组成一些逻辑指令,这就成了程序。

举个例子,如果你有100盏不同颜色的灯,不同的开关就可以开关不同颜色的灯,咱们觉得很麻烦,有人就想到把这些线路都放到一个盒子里,然后做个键盘,100个按钮分别控制一个灯的开关,这就类似低级语言的代码(例如汇编)。

汇编语言大概感觉如下:

如何给一个外行人解释:世界上第一个程序是如何写出来并让它按规定运行?但还是觉得麻烦,于是把一些特定颜色的灯泡组成的图形组成一个信号,通过另一个键盘和盒子封装控制,这样可能只需要30个按钮来控制,但却足以制定出上千种不同图形满足不同需求,这就类似高级语言。

例如C语言的感觉:

如何给一个外行人解释:世界上第一个程序是如何写出来并让它按规定运行?

这样慢慢产生了一行代码可能就搞定了一个窗口创建或是一个问题解法的时代(例如python语言),早期编程可能还需要考虑各种开灯细节和电路细节,但随着发展,作为编程者的人们更多需要考虑的就是如何使得完成灯泡开关的速度更快,耗费的电费更少,完成的功能更多,打开的效果更炫酷。

在计算机的整体发展上,初期只不过是把这些灯泡开关换成了逻辑线路,甚至机械(差分机)上的数值计算问题,再到完善的电路控制,然后逐步缩小模块到一个芯片甚至纳米材料上,并渗入到各行各业。

以现在制作软件的思路,按照容易理解的顺序简单解释一下office等软件的制作过程(没按照软件工程的顺序):
1.整理逻辑框架(要如何向用户展现,点击一个按钮要出现什么)
2.美工设计(小到每个按钮的图形设计,停靠栏,菜单的设计)
3.拼接图形与具体实现,每个小组负责一个模块亦或是分模块编写(写代码)
4.测试运行

这个地方有个回答说得很好:
zhihu.com/question/2000

要是再细分的话,上面四个过程各属一个子行业,说不完了。
当然早期的时候都是一起写,只是类似于office这种大项目考虑的因素远远不是三五个人所能及的。
最开始不是纸带么。。。

节选自 刘慈欣 著《三体》

17. 三体、牛顿、冯·诺依曼、秦始皇、三日连珠


“所以,伟大的皇帝,您的帝国还要发展!”冯·诺伊曼不失时机地说,“如果掌握了太阳运行的规律,你就能充分利用每一个恒纪元,同时避免乱纪元带来的损失,这样发展速度比西洋要快得多。请你相信我们,我们是学者,只要能用三定律和微积分准确预测太阳的运行,不在乎谁征服统治世界。”

“朕当然需要预测太阳的运行,但你们让我集结三千万大军,至少要首先向朕演示一下这种计算如何进行吧。”

“陛下,请给我三个士兵,我将为您演示。”冯·诺伊曼兴奋起来。

“三个?只要三个吗?朕可以轻易给你三千个。”秦始皇用不信任的目光扫视看着冯·诺伊曼。

“伟大的陛下,您刚才提到东方人在科学思维上的缺陷,就是因为你们没有意识到,复杂的宇宙万物其实是由最简单的单元构成的。我只要三个,陛下。”

秦始皇挥手召来了三名士兵,他们都很年轻,与秦国的其他士兵一样,一举一动像听从命令的机器。

“我不知道你们的名字,”冯·诺伊曼拍拍前两个士兵的肩,“你们两个负责信号输入,就叫‘入1’、‘入2’吧。”他又指指最后一名士兵,“你,负责信号输出。就叫‘出’吧,”他伸手拨动三名士兵,“这样,站成一个三角形,出是顶端,入1和入2是底边。”

“哼,你让他们成楔形攻击队形不就行了?”秦始皇轻蔑地看着冯·诺伊曼。牛顿不知从什么地方掏出六面小旗。三白三黑,冯·诺伊曼接过来分给三名士兵,每人一白一黑,说:“白色代表0,黑色代表1。好,现在听我说,出,你转身看着入1和入2,如果他们都举黑旗,你就举黑旗,其他的情况你都举白旗,这种情况有三种:入l白,入2黑;入l黑,入2白;入1、入2都是白。”

“我觉得你应该换种颜色,白旗代表投降。”秦始皇说。

兴奋中的冯·诺伊曼没有理睬皇帝,对三名士兵大声命令:“现在开始运行!入1入2,你们每人随意举旗,好,举!好,再举!举!”

入1和入2同时举了三次旗,第一次是黑黑,第二次是白黑,第三次是黑白。出都进行了正确反应,分别举起了一次黑和两次白。

“很好,运行正确,陛下,您的士兵很聪明!”

“这事儿傻瓜都会,你能告诉联,他们在干什么吗?”秦始皇一脸困惑地问。

“这三个人组成了一个计算系统的部件,是门部件的一种,叫‘与门’。”冯·诺伊曼说完停了一会儿,好让皇帝理解。

秦始皇面无表情地说:“朕是够郁闷的,好,继续。”

冯·诺伊曼转向排成三角阵的三名士兵:“我们构建下一个部件。你,出,只要看到入1和入2中有一个人举黑旗,你就举黑旗,这种情况有三种组合——黑黑、白黑、黑白,剩下的一种情况——白白,你就举白旗。明白了吗?好孩子,你真聪明,门部件的正确运行你是关键,好好干,皇帝会奖赏你的!下面开始运行:举!好,再举!再举!好极了,运行正常,陛下,这个门部件叫或门。”

然后,冯·诺伊曼又用三名士兵构建了与非门、或非门、异或门、同或门和三态门,最后只用两名士兵构建了最简单的非门,出总是举与入颜色相反的旗。

冯·诺伊曼对皇帝鞠躬说:“现在,陛下,所有的门部件都已演示完毕,这很简单不是吗?任何三名士兵经过一小时的训练就可以掌握。”

“他们不需要学更多的东西了吗?”秦始皇问。

“不需要,我们组建一千万个这样的门部件,再将这些部件组合成一个系统,这个系统就能进行我们所需要的运算,解出那些预测太阳运行的微分方程。这个系统,我们把它叫做……嗯,叫做……”

“计算机。”汪淼说。

“啊——好!”冯·诺伊曼对汪淼竖起一根指头,“计算机,这个名字好,整个系统实际上就是一部庞大的机器,是有史以来最复杂的机器!”

游戏时间加快。三个月过去了。

秦始皇、牛顿、冯,诺伊曼和汪淼站在金字塔顶部的平台上,这个平台与汪淼和墨子相遇时的很相似,架设着大量的天文观测仪器,其中有一部分是欧洲近代的设备。在他们下方,三千万秦国军队宏伟的方阵铺展在大地上,这是一个边长六公里的正方形。在初升的太阳下,方阵凝固了似的纹丝不动,仿佛一张由三千万个兵马俑构成的巨毯,但飞翔的鸟群误入这巨毯上空时,立刻感到了下方浓重的杀气,鸟群顿时大乱,惊慌混乱地散开或绕行汪淼在心里算了算,如果全人类站成这样一个方阵,面积也不过是上海浦东大小,比起它表现的力量,这方阵更显示了文明的脆弱。

“陛下,您的军队真是举世无双,这么短的时间,就完成了如此复杂的训练。”冯·诺伊曼对秦始皇赞叹道。

“虽然整体上复杂,但每个士兵要做的很简单,比起以前为粉碎马其顿方阵进行的训练来,这算不了什么。”秦始皇按着长剑剑柄说。

“上帝也保佑,连着两个这样长的恒纪元。”牛顿说。

“即使是乱纪元,朕的军队也照样训练,以后,他们也会在乱纪元完成你们的计算。”秦始皇骄傲地扫视着方阵说。

“那么,请陛下发出您伟大的号令吧!”冯·诺伊曼用激动得发颤的声音说。

秦始皇点点头,一名卫士奔跑过来,握住皇帝的剑柄向后退了几步,抽出了那柄皇帝本人无法抽出的青铜长剑。然后上前跪下将剑呈给皇帝,秦始皇对着长空扬起长剑,高声喊道:

“成计算机队列!”

金字塔四角的四尊青铜大鼎同时轰地燃烧起来,站满了金字塔面向方阵一面坡墙的士兵用宏大的合唱将始皇帝的号令传诵下去:

“成计算机队列——”

下面的大地上,方阵均匀的色彩开始出现扰动,复杂精细的回路结构浮现出来,并渐渐充满了整个方阵,十分钟后,大地上出现了一块三十六平方公里的计算机主板。

冯·诺伊曼指着下方巨大的人列回路开始介绍:“陛下,我们把这台计算机命名为‘秦一号’。请看,那里,中心部分,是CPU,是计算机的核心计算元件。由您最精锐的五个军团构成,对照这张图您可以看到里面的加法器、寄存器、堆栈存贮器;外围整齐的部分是内存,构建这部分时我们发现人手不够,好在这部分每个单元的动作最简单,就训练每个士兵拿多种颜色的旗帜,组合起来后,一个人就能同时完成最初二十个人的操作,这就使内存容量达到了运行‘秦1.0’操作系统的最低要求;你再看那条贯穿整个阵列的通道,还有那些在通道上待命的轻转兵,那是BUS,系统总线,负责在整个系统间传递信息。”

“总线结构是个伟大的发明,新的插件,最大可由十个军团构成,能够快捷地挂接到总线上运行,这使得‘秦一号’的硬件扩展和升级十分便利;再看最远处那一边,可能要用望远镜才能看清,那是外存,我们又用了哥白尼起的名字,叫它‘硬盘’,那是由三百万名文化程度较高的人构成,您上次坑儒时把他们留下是对了,他们每个人手中都有一个记录本和笔,负责记录运算结果,当然,他们最大的工作量还是作为虚拟内存,存贮中间运算结果,运算速度的瓶颈就在他们那里。这儿,离我们最近的地方,是显示阵列,能显示计算机运行的主要状态参数。”

冯·诺伊曼和牛顿搬来一个一人多高的大纸卷,在秦始皇面前展开来,当纸卷展到尽头时,汪淼一阵头皮发紧,但他想象中的匕首并没有出现,面前只有一张写满符号的大纸,那些符号都是蝇头大小,密密麻麻,看上去与下面的计算机阵列一样令人头晕目眩。

“陛下,这是就我们开发的‘秦1.0’版操作系统,计算软件将在它上面运行。陛下您看——”冯·诺伊曼指指下面的人列计算机,“这阵列是硬件,而这张纸上写的是软件,硬件和软件,就如同琴和乐谱的关系。”说着他和牛顿又展开了一张同样大小的纸,“陛下,这就是数值法解那一组微分方程的软件,将天文观测得到的三个太阳在某一时间断面的运动矢量输入,它的运行就能为我们预测以后任一时刻太阳的运行状态。我们这次计算,将对以后两年太阳的运行做出完整预测,每组预测值的时间间隔为一百二十小时。”

秦始皇点点头:“那就开始吧。”

冯·诺伊曼双手过顶,庄严地喊道:“奉圣上御旨,计算机启动!系统自检!”

在金字塔的中部,一排旗手用旗语发出指令,一时间,下面大地上三千万人构成的巨型主板仿佛液化了,充满了细密的粼粼波光,那是几千万面小旗在挥动。在靠近金字塔底部的显示阵列中,一条由无数面绿色大旗构成的进度条在延伸着,标示着自检的进度。十分钟后,进度条走到了头。

“自检完成!引导程序运行!操作系统加载!!”

下面,贯穿人列计算机的系统总线上的轻转兵快速运动起来,总线立刻变成了一条湍急的河流。这河流沿途又分成无数条细小的支流,渗入到各个模块阵列之中。很快,黑白旗的涟漪演化成汹涌的浪潮,激荡在整块主板上。*的CPU区激荡最为剧烈,像一片燃烧的火药。突然,仿佛火药燃尽,CPU区的扰动渐渐平静下来,最后竟完全静止了,以它为圆心,这静止向各个方向飞快扩散开来,像快速封冻的海面,最后整块主板大部分静止了,其间只有一些零星的死循环在以不变的节奏没有生气地闪动着,显示阵列中出现了闪动的红色。

“系统锁死!”一名信号官高喊。故障原因很快查清,是CPU状态寄存器中的一个门电路运行出错。

“系统重新热启动!”冯·诺伊曼胸有成竹地命令道。

“慢!”牛顿挥手制止了信号官,转身一脸阴毒地对秦始皇说,“陛下,为了系统的稳定运行,对故障率较高的部件应该采取一些维修措施。”

秦始皇拄着长剑说:“更换出错部件,组成那个部件的所有兵卒,斩!以后故障照此办理。”

冯·诺伊曼厌恶地看了牛顿一眼,看着一组利剑出鞘的骑兵冲进主板,“维修”了故障部件后,重新发布了热启动命令。这次启动十分顺利,二十分钟后,三体世界的冯·诺伊曼结构人列计算机在“秦1.0”操作系统下进入运行状态。

“启动太阳轨道计算软件‘ThreeBody 1.0’!”牛顿声嘶力竭地发令,“启动计算主控!加载差分模块!加载有限元模块!加载谱方法模块……调入初始条件参数!计算启动!!”

主板上波光粼粼,显示阵列上的各色标志此起彼伏地闪动,人列计算机开始了漫长的计算。

“真是很有意思。”秦始皇手指壮观的计算机说,“每个人如此简单的行为,竟产生了如此复杂的大东西!欧洲人骂朕*暴政,扼杀了社会的创造力,其实在严格纪律约束下的大量的人,合为一个整体后也能产生伟大的智慧。”

“伟大的始皇帝,这是机器的机械运行,不是智慧。这些普通卑贱的人都是一个个0,只有在最前面加上您这样一个1,他们的整体才有意义。”牛顿带着奉承的微笑说。

“恶心的哲学。”冯·诺伊曼瞥了牛顿一眼说,“如果到时候,按你的理论和数学模型计算出的结果与预测不符,你我可就连零都不是了。”

“对,那时你们可真的什么都不是了!”秦始皇说着,拂袖而去。

时光飞逝,人列计算机运行了一年零四个月,除去程序的调试时间,实际计算时间约一年两个月,这期间,只因乱纪元过分恶劣的气候中断过两次,但计算机存贮了中断现场数据,都成功地从断点恢复了运行。当秦始皇和欧洲学者们再次登上金字塔顶部时,第一阶段的计算已经完成,这批结果数据,精确地描述了以后两年太阳运行的轨道状况。

这是一个寒冷的黎明,彻夜照耀着巨大主板的无数火炬已经熄灭,计算机完成后,“秦1.0”进入待机状态,主板表面汹涌的浪涛变成了平静的微波。

  • 将程序“固化”成电路的连接方式,和将程序用打孔纸带塞进去,区别很小。
  • 打孔纸带和硬盘、键盘、鼠标的区别也很小。

(以下全部为凭记忆手打,如有笔误或史实型错误,欢迎提出)
1.17世纪以来,数学发展得越来越快,实际应用得也越来越多。
(例如航海,需要准确的对数表,但当时对数是由人工计算的,所以就会带来错误,而在航海中的错误,是很严重的。人们迫切需要准确的、最好是快速的计算方式。注:computer最早的意思就是计算员。)

2.19世纪出了一个天才,巴贝奇,一个博学多才的人。早期是剑桥被授予卢卡斯数学教授席位,在他的一百多年之前处于这个位置的人是牛顿。

他热爱机械,因此他想发明一台机器来进行数学计算。之后差分机就诞生了,一台纯机械的计算机器,动力来自蒸汽机而不是电机,通过转轮完成数的输入和输出。

进而他设想发明一台机器,名为分析机,希望这台机器能完成数学计算和逻辑分析。他的一名异性好友Ada对此也很有兴趣,开始分析这台设想中的机器并为其编程,但不幸的是分析机并未制造完成,Ada也因病早逝。(注:Ada很不简单,她是世界上第一位程序员,是一位伯爵夫人,是一位美女,是一位天才数学家,也是诗人拜伦的女儿。为纪念Ada,美国军方有一种编程语言名为Ada。)

3.随着电气革命,电灯得到了广泛的使用,也因此在众多工程师和科学家的摸索中,电子管诞生了。

4.即使能源由蒸汽变为了电力,但人们对于计算机器的需求从未减退。

上世纪三十年代末,图灵被任命去参与破译恩格尼码,在8号小组,图灵让数学家和逻辑学家代替语言学家去完成破译工作,同时也建造了一台电子破解密码的机器。期间图灵渐渐完善了“图灵机”的构想。

在同一时代,1938年,香农发表了一篇论文,开始用继电器去进行0和1的布尔运算。

(有趣的是,在当时图灵和香农也有过几次会面,期间有讨论也有争论。他们当时并不知道对方都在干嘛,图灵在破译德军的密码,香农在进行罗斯福和丘吉尔之间电话线路的保密工作,这些都是机密中的机密;他们也不知道,他们二人的贡献会对后来的世界有着怎样天翻地覆的影响。)

5.1948年,贝尔实验室搞了两个大新闻:肖克利发明晶体管;香农的《信息论》问世。我们离想象中的、可用的计算机又进了一步。

6.上世纪五十年代后,冯诺依曼体系计算机不断完善,计算机工作起来井然有序:有的部分储存数据,有的部分储存程序,有的部分进行运算,等等等等...

7.之后就是 说的了,机器码操作起来困难,就有了汇编;汇编写起来没有效率,不易debug,就有了高级语言。当然这都牺牲了运行速度,但是从工程角度来看,这是很值得的。毕竟摩尔定律在那呢,近五十年来硬件提升的很快很快。

上帝说:要有光。于是,便有了光。

给外行人就解释到这个程度就挺好的,充分体现了程序设计思维,提供接口,隐藏细节,实现可替换,amazing!

在漫长的演化过程中,计算机中的一些无机文件碎片在碎片整理的条件下生成了简单的有机文件汇聚在了硬盘里。

经过漫长的时间,这些有机文件逐渐演化出了原始细胞程序。

然后漫长的进化中,逐渐变成了office程序
电脑在第一个程序之后也没有“智能”的。电脑就是一条指令接一条指令去执行程序的,很傻的。执行一个程序不需要“理解”程序在做什么。

可以认为第一个程序是用电路搭建出来的

嗯……所以你要学习数字电子电路么?
可以参考小说《三体》中对“人列计算机”的描写。
占个坑,晚上回来填。
电脑运行程序也就更人用算盘算账差不多。电脑运算有CPU,内存,硬盘。人用算盘有人(相当于CPU),算盘(相当于内存),账本(相当于硬盘)。只不过电脑是用电驱动的。
首先,世间万物本质上是数学运算(不能运算的就用个table直接存下来)。然后,计算机硬件有运算组件。最后,我们将一切转换成数学运算。
可以读读编码的奥秘这本书。
想象一下刚开始一根电线 一块电池 一个灯泡 一个开关 连接起来,一开一关灯泡亮暗就代表了最简单的0和1, 无数个门电路组合在一起就能进行更复杂的表示。随着科技进步 这些东西越来越小,集成度越来越高,当然本质还是开和关。
楼上有说的了 就是编码 和发电报用的那个编码是一样的人~
编码不是一个新名词 程序也不是一个新名词~
因为计算机利用电来自动存储和运算信息~ 很多人只是因为不了解一些电学知识所以才会感觉到很神奇的~
你想想算盘是不是可以算算数,作用是不是和计算机一样~
计算机发展了很多年,但是大体架构思维是没有太大变化,拿现代计算机来说,每个程序(例如你说的office中的word)都是由代码组成,代码被计算机解析为01机器码,01机器码代表了电路的开关状态,计算机里很多电路组织起来,有些电路通了,有些电路被关了,不同的电路开关组合实现了计算机不同的功能,以上仅为粗浅的底层解释,适合外行人了解,什么存储器,控制器等概念什么的无需懂,想要深究可以去学习计算机组成原理,计算机系统结构,还有模电数电等相关,电子类物理类相关专业理解起来较为容易,文科够呛,因为涉及到物理中的电路,半导体二极管等。
先有的程序后来才实现,就跟你现在有个想法然后用各种方式去做一个意思

看了一圈,没一个人说到点上。
不要再说电路了,只有电,是产生不了计算机的,还需要半导体材料,磁性材料,等等材料。(论新型材料之重要性)
首先,现在计算机最重要的是磁盘,就是平常说的几百G,甚至几T,即断电后数据不会丢失的,相信你知道磁带和光碟吧,那种老式录音机见过吧,原理一样,只不过是压缩程度不同,都是用电来控制磁粉,磁粉记录信息,电磁不分家(重要)。
好了,知道了磁盘能记录信息,然后生产时只需要通电,给每个磁盘记录上一样的信息,就可以了。装到电脑上,一按开机键,磁盘里的信息送入存储器即内存,内存是临时存储信息的,断电就丢失信息,就是平常说的几G内存,内存再送入处理器,首先送入处理器内的寄存器,寄存器也是暂时存储信息的,只不过存进去和取出来速度超级快,然后送入运算器,运算器就是做0和1的运算,这时才开始进行信息的真正处理。
然后,编程不是神奇的,不是万能的,编程无法解决硬件问题,比如,我的手机没有指纹解锁,你再编程也没有用,不可能凭空出来一个指纹解锁功能,黑白屏幕再编程也不可能变成彩色的。编程只是把存储在磁盘里的,出厂时已经用磁路刻好的,最最最基本的信息,进行再加工,以实现更多的功能。比如在磁盘里装上电脑系统(windows,安卓),调用系统的基本语句,控制磁路(只是为了更形象而说的),控制运算器,让电路一通一断,产生0和1,接下来应该就知道了吧,01是机器语言,汇编就是把01进行总结编译,用人类需要代替01,高级语言就是用常用语言代替汇编,达到更舒心,更顺手,更便于人类记忆。
这就是编程。

—————————————————————————
补充信息,至于怎么产生0和1
比如你现在需要编程,
printf(“hello world”);
按下键盘p的时候,键盘p键就读取到你先通后断再通,就知道你按了p键,你知道继电器吗?这玩意儿就是产生高低电平的(电平即电压),你知道晶振吗?这玩意儿就是控制产生高低电平的速度的。
让他去看三体
Let there be light
题主有必要明确什么是程序,什么是电脑,这才能理解什么是第一个程序。
如果你值得是"hello world",那解释起来太难了。
如果你单纯像理解计算机科学的起源,那你只需要了解从逻辑电路到单片机
请去看《编码》,这本书就是对你这个问题的完美回答。
他就是把电能,转化成其他能量的一种机器,内部的转化过程是复杂了,这就是科学,要想大致了解可以读一下大学计算机课程或者计算机导论可能对你会帮助。你会感到科技是如此神奇,仿佛有一扇门向你打开了。
就和你按下开关灯就亮一个道理

等于说要从最底层的运算器存储器工作原理一层层上去一直讲到UI而且还要通俗易懂不能带专业术语是吗
。。。
。。。
。。。
。。。
。。。

我反正讲不出来
可以从0/1开关二极管开始,慢慢CMOS,然后再学会逻辑,再慢慢搭积分器,加法减法器……
看看电路基础和数字电路?
第一个程序啊,要不要从兰姆达演算开始解释呢~~
和按下开关灯就会亮是一个道理。计算机芯片无非就是大量的半导体开关,程序的作用就是去拨动它们。
别解释了,搭一个给他看看就好。
至于用的人,还是电子器件,还是仿真模型,量力而行吧。
一开始的程序代码都是由01组成,而实现01的判别是通过物理上的高低电平。
看了三遍也没看懂题目是什么意思
如何给一个外行人世界上第一个程序是如何写出来并让他按规定运行的?