世界上第一个程序是如何写出来并让它按规定运行?

  所以说,指令的实质作用就是把人工布线的操作给抽象出来,用0、1的电子信号来控制晶体管的状态,进而控制电路的通断,从而选择出处理器中我们需要的功能单元,来完成指令的任务。因此,我觉得存储程序的最大好处就是,把人手工布线的过程也给自动化了,通过电信号控制的方式自动实现了布线,于是实现了计算机完全自动化的完成不同的任务,只需预先存储好相应的指令序列就行了。因为只要有人参与的步骤都快不了多少,总有个度,所以这种创新极大的提升了计算的效率。

    还有,这些指令中,最重要的创新就是逻辑判断指令(不是逻辑运算),即所谓的控制类指令,能对信息进行比较和判断,并能根据判断的结果自动选择要执行的下一条指令。我觉得以前的计算工具都有进行运算的能力,而从没有想过要拥有逻辑判断能力。而根据图灵的图灵机理论,拥有逻辑判断功能的计算机才能模拟图灵机的全部功能,也才可以实现任意计算。我觉得对于使用没有逻辑判断能力的计算工具,都是由我们人类来执行这个逻辑判断的工作的,即我们自己根据执行的状态来选择接下来的处理方法。所以说,即使实现了存储程序,但是如果指令集缺少逻辑判断指令,也会大大限制了计算机能自动完成的计算过程。因此,只有具备了逻辑判断指令的计算机才是真正的通用计算机,才能在没有人类参与的情况下自动完成任意计算。也正因为没有人类参与,才得以让计算机的计算速度快得突破天际!

    好了,从此之后,我们有了能根据程序来自动执行任意计算的工具。于是,程序员们就在软件领域大做文章,创造出丰富多彩的软件世界,他们有的专注于建造软件世界的基础设施,有的则喜欢建造直接面向用户的应用程序。总之,通过他们的通力合作,软件世界得以蓬勃发展,不断的赋予计算机新的能力,于是计算机替我们完成了越来越多的任务,从而改变了我们每个人的生活!

灵剑

灵剑

微博一般不上 http://weibo.com/hubo1016

409 人赞同了该回答

一堆土怎么盖出高楼大厦的?其实是一个道理,两个字,工程。
完成一项大的工作,有三个步骤:

  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位,从文本模式到图形模式,从实模式到保护模式,我们的工具每天都在进步,但我们做的事情其实与几十年前没有多大区别。就像是搭积木,我们每个人都学会了怎么搭上自己的一块,最终我们搭出了庞然大物,但这其实并没有什么可稀奇的。

发布于 2016-11-01

409​28 条评论 

​分享

 ​收藏​取消感谢 

 收起

Garvey

Garvey

借题发挥

578 人赞同了该回答

世界上第一台机械计算机,出现于崇祯十五年,清崇德七年,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
数学爆发,是发生在明末清初的法国。
两三百年后的清末民国,是电磁学爆发。
三年内战抗美援朝十年文革,是计算机爆发。
几次技术革命,我们全在乱世。现在,我们终于在和平年代,赶上互联网。
眼下知识尚未再次垄断,理应借助互联网,发展起来——这句话不是说国家,而是说个人。









我佛慈悲。

编辑于 2016-11-11

578​85 条评论 

​分享

 ​收藏​感谢 

 收起

猜你喜欢

转载自blog.csdn.net/sinat_30955745/article/details/84062592