白话架构(1)- 从大爆炸开始
达芬奇:“学习如何看。现实中的一切都相互关联”
我们所在的宇宙是如何开始的,还没有一个明确的答案,但目前科学家比较倾向于大爆炸宇宙论。一切源于大爆炸。
1929年,爱德文·鲍威尔·哈勃
(Edwin Powell Hubble,就是冠名哈勃望远镜
的那位科学家)总结了 红移现象,之后爱因斯坦也来到哈勃工作的威尔逊天文台进行了红移现象的观测。在此基础上,到了1948年前后,乔治·伽莫夫
(George Gamow)第一个建立了热大爆炸的观念。
二战期间,大名鼎鼎的曼哈顿计划,哈勃并没有直接参与,但他在二战期间为美国海军研究局(ONR)提供咨询,研究雷达技术对天文学观测的干扰问题。在哈勃研究雷达技术时,可能就在他隔壁房间,有一个人正在忙着研究原子弹。
这个研究原子弹的就是约翰·冯·诺依曼
(John von Neumann)。冯·诺依曼
作为曼哈顿计划的核心成员,负责原子弹的理论设计与计算。他在洛斯阿拉莫斯实验室的工作涉及复杂的数学建模,例如内爆式核装置的计算。
1944年8月,冯·诺依曼
赴美国陆军的阿伯丁试射场开完会后,在火车站台上等车时,突然有人过来和他致意,这人是负责督导摩尔电机学院制作射表的陆军中尉赫曼·哥尔斯廷
(Herman Goldstine)。赫曼·哥尔斯廷
除了有美国军人的身份外,他还是一位数学家,而且他还是冯·诺依曼
的超级迷弟。
冯·诺依曼
和哥尔斯廷
此时并不相识,但对哥尔斯廷
而言,偶像在前,一定得“追个星”。哥尔斯廷
在聊天中提及自己负责的计算机项目正在开发 ENIAC,每秒可执行 333 次乘法时,冯·诺依曼
眼睛一亮,不断追问技术细节,哥尔斯廷干脆邀他前来参观。
左二为哥尔斯廷,右一为冯·诺依曼
大佬不愧是大佬,参观 ENIAC 后,冯·诺依曼
提出物理接线编程方 式严重限制了灵活性和效率,接着他又应邀加入了顾问团队,在 ENIAC 研发后期协助改进其设计。ENIAC 此时已经交付美国军方了,团队就准备开启新的项目 EDVAC。在 EDVAC 设计过程中,冯·诺依曼
和团队成员一起进行了很多很多技术讨论和改进实验。
1945年6月,冯·诺依曼
和小组成员开完会后,搭火车横越美国返回新墨西哥州。他在火车上文思泉涌,把大家这十个月来的讨论进行了一番总结,整理成一篇涵盖所有技术细节的书面报告。哥尔斯廷
收到这份手稿后,立即打印成 101 页的正式文件,这就是 《EDVAC 报告初稿》 (First Draft of a Report on the EDVAC)。
正是这份初稿,确定引领现代计算机发展的架构:运算单元、控制单元、存储单元,输入\输出装置。这一架构彻底解决了 ENIAC 的编程效率问题,成为现代计算机的核心设计原则,也就是著名的冯·诺依曼架构。但哥尔斯廷
在报告中只署了冯·诺依曼
一个人的名,这为之后的知识产权争端埋下了伏笔。
《EDVAC 报告初稿》封面
EDVAC 在1951年完成,它是首个基于冯·诺依曼架构的计算机,采用二进制和统一存储,成为了现代计算机的蓝本。
EDVAC 是众人努力的成果,真正属于冯·诺依曼
个人创见的只有可变内存地址,但哥尔斯廷
却在报告上将冯·诺依曼
列为唯一作者。尤其使普雷斯伯・埃克特
(J. Presper Eckert)觉得不能忍受的是,他早就提出储存程序的想法,做为内存的水银延迟线也是他发明的,如今却由让冯·诺依曼
一人独享荣誉(至今大家仍以“冯·诺依曼架构”称呼)。
团队中更严重的分歧是,哥尔斯廷
没有征得过团队成员同意,就将报告分发给美、英两国 24 个单位。哥尔斯廷
与冯·诺依曼
认为,这份公开报告就是一份“学术成果”,能有助于高速计算机的发展。但对约翰・莫克利
(John Mauchly)与埃克特
而言,这导致他们申请的专利无法获批。
冯·诺依曼架构是现代计算机的一种架构,而与之齐名的还有一种架构:哈佛架构。哈佛架构最早起源于1944年哈佛大学的哈佛 Mark I 计算机
。而在1947 年的哈佛 Mark III 计算机
中哈佛架构才得到完整的实践,该计算机采用真空管技术,首次实现了程序存储器与数据存储器的物理分离,并通过独立总线并行访问指令和数据。
哈佛架构的分离程序和数据存储、独立总线的设计,现在常用于数字信号处理器(DSP)、微控制器(MCU)、实时控制系统和专用计算设备。哈佛架构通过存储分离和并行访问,成为实时计算与嵌入式系统的基石。
更进一步随着技术的发展,两种架构技术上在实践中也存在混合、借鉴等情况。
有了作为基础的计算机硬件的发展,配套的编程语言也有了发展的空间。
在机器语言时代,用户以二进制指令直接操控硬件,如 ENIAC 就通过打孔卡编程。机器语言的特点就是开发效率极低但执行速度最快。
为了便于记忆,英国计算机科学家莫里斯・威尔克斯
(Maurice Wilkes)在1949年提出 “符号地址” 概念,用字母或符号(如LOAD、ADD)代替二进制操作码,并用符号(如X、Y)表示内存地址。
IBM 的纳撒尼尔・罗切斯特
(Nathaniel Rochester)领导团队为 IBM 701 计算机(美国首台批量生产的商用科学计算机)开发了名为 Short Code 的符号化编程系统。尽管 Short Code 严格来说是 “半汇编” 工具,但其用符号替代机器码的核心思想成为汇编语言的基石。
后来随着计算机架构的标准化,汇编语言逐渐成熟。汇编语言需要通过汇编器将助记符转换为二进制,性能略低于机器语言,但胜在忆于记忆,使得程序员的编程效率大幅提升。
在后续的时光中,高级编程语言陆续登场:FORTRAN(1957年)、LISP(1958年)、COBOL(1959年)、C(1972年)等。
进一步的,具有面向对象特性和脚本化的语言也开始出现:C++(1983年)、Python(1991年)、Java(1995年)、JavaScript(1995)等。
来到新世纪以后,就是我们熟知的更新的语言:Go(2009)、Rust(2010)、Swift(2014)等。
以上仅列出部分时间点有代表性的编程语言,未覆盖全部。
编程语言用于开发程序。在早期,程序简单、规模小,一般就数千行代码,多数为单个程序员手工编写,多依赖机器语言或汇编语言,缺乏系统化设计。只要个人能力强,他就能写程序。
1964年 IBM OS/360 操作系统,作为首个大规模复杂软件,包含500 万行代码,由 3000 人开发,但最终超预算 5 倍,延期 4 年才发布。在这个时候,软件开发就是开发模式中最典型的大爆炸模式.
这种模型下缺乏团队开发方法论,完全依赖 “天才程序员” 个人能力,文档和规范严重不足。
在这之后,学术界和工业界才一起从理论和实践角度出发,逐渐完善软件开发的方法论和管理模 型,最终形成了现代软件工程的概念和相关的方法论,并且还在不断的发展完善。其中很多思想至今依然是软件开发的重要瑰宝。例如,1975年,布鲁克斯
(FrederickP.Brooks.Jr.) 的著作 《人月神话》,至今依然是软件开发的经典之一。
从大爆炸宇宙论中,嘭的一声响,粒子们在未知的命运中分散、组合最终形成了现在我们生活的宇宙。软件开发中那原始的大爆炸开发模式也造就了如今丰富多彩的软件,和它们背后开发相关的方法论和实践经验。
一切始于大爆炸。软件开发的方法论、系统架构等也始于它自身的大爆炸。
后面的文章中,我将继续展开,最终带你领略系统架构的一切。