《软件故事》分十一章讲述了软件的发展,从最初的ENIAC编程,到最后Apache软件开源,可以说叙述了整个软件史。
这本书的作者史蒂夫-洛尔,曾是《纽约时报》的技术、商业和经济专栏作家。
第一章 引言:软件和编程艺术的兴起
二战之前,电子技术还不够成熟。软件业真正迅速发展是在二战之后。二战期间催生出第一台通用计算机ENIAC,位于宾夕法尼亚大学,这台计算机还没有存储的功能,每进行一次运算就要重新插拔各种线缆,很是麻烦。有专门人员负责,成为编码员(coder)。1946年约翰·冯·诺依曼撰写了“关于EDVAC的报告初稿”。作为“曼哈顿计划”的顾问,原子弹的设计要进行成千上万次的运算,计算机的潜力引起了冯诺依曼的注意。经过改进有了EDVAC(Electronic Discrete Variable Automatic Computer),即电子离散型变量自动计算机。除了冯诺依曼,还有很多人参与EDVAC的设计,其中最为著名的是ENIAC的项目负责人J·普雷斯普尔·艾克特和约翰·莫克利,由于EDVAC最终负责撰写报告的是冯诺依曼,因此他获得了“存储程序式计算机”的殊荣。
因为存储程序的存在,程序指令就可以存储在计算机中,人们就不用没进行一次运算就要插拔一次线缆,这无疑大大提高了计算的效率。早期开发人员体会到编程的复杂性,第一次出现了bug这个词汇。
计算机投入应用很久之后才有了“软件”这个词出现。1958年《美国数学月刊》上,“软件”作为计算机术语首次出现在出版物上。
计算机编程的大部分历史课看成是努力扩大其使用范围的过程,即让更多人能够更容易地编程。但到目前为止,大部分编程仍然局限于精英阶层。
第二章 FORTRAN:早期的“转折点”
1952年IBM的新型豪华计算机-国防计算机(Defense Calculator)准备好接受实验。1953年更名为IBM 701。
1953年末,巴克斯开启寻找更好编程方法的研究项目。1957年,FORTRAN语言问世。
FORTRAN的成功具有双重意义。首先,它是一种英语速记和代数的编程语言,将人与计算机的交流提高了一个层次,更接近于人类,同时更加远离机器。FORTRAN被称为第一个高级语言。此外,FORTRAN运行良好,效率同编码员编写的程序一样。
FORTRAN给软件行业带来的巨大进步不可磨灭。其他语言都是在FORTRAN建立的基础上发展起来的。杰出的计算机历史学家、弗吉尼亚理工大学教授J.A.N.李称FORTRAN是编程语言及编程器技术发展过程中的“转折点”。
约翰-巴克斯,不是个听话的孩子,从小喜欢鼓捣一些机械。大学起初学习工程学和医学预科,后来发现对数学感兴趣,就申请了哥伦比亚大学试读生,不仅学习优异拿到数学学士学位,还获得了数学硕士学位。
一次偶然的机会参观SSEC(罗伯特-雷克斯-席伯等发明的选择性顺序电子计算机),被引荐,席伯当场录用了他。
SSEC是IBM的超级计算机。巴克斯是从SSEC编程开始的,编写的程序主要用于大规模科学计算。701问世后,巴克斯写给老板的信中提到了编程项目的建议,并着重强调其在经济方面的重要的作用。卡斯波特-赫德看到后,立即批准了这个项目。项目开启后,前后加入的人员有:欧文-齐勒,布鲁克斯大学研究生;哈兰-赫里克,爱荷华州立大学数学专业研究生。
在当时编程对于智力要求很高,程序员必须精通二进制的机器语言。后来程序员使用二进制的早期简化工具八进制。减少编程难度的进一步措施就是开发“汇编”程序,当时每种计算机都有自己的汇编语言,在通往FORTRAN等更高级语言的道路上汇编程序仍是至关重要的步骤。汇编语言最早出现在英国,剑桥大学的EDSAC是第一台运行的存储程序计算机。最初的目的是让人无需经过专门的训练就能轻松地使用。
FORTRAN团队设定的目标远远超出了汇编语言。每一行汇编语言代码会转化成一条二进制机器代码的指令。
FORTRAN语言为我们留下了宝贵的财富,特别是一个看似平淡无奇的决定:将GO TO声明作为其基本命令之一。FORTRAN这个名字是整个项目组热衷于转换器或编译器的最好证明,它是公式转换系统(FORmula TRANslating)的缩写。
1954年 ,FORTRAN项目组撰写了一份描述FORTRAN语言及其目标的报告-《初步报告:IBM数学公式转换系统规范》,当时最引人注目的是“鉴于FORTRAN几乎会淘汰编码和检错...”。带着这份充满前景的报告,巴克斯,齐勒和赫里克开始周游全国,游说订购了704的客户,但并没有人关注。
1955年巴克斯开始扩充人手,前后加入的人员有:谢尔登-贝斯特,麻省理工学院明星程序员;罗伊-纳特,联邦飞机公司;罗伯特-尼尔森,曾美国国务院密码员;理查德-戈登堡,纽约大学数学博士;洛伊丝-海波特洛萨学院毕业后加入IBM;戴维-赛尔,宾夕法尼亚大学生物物理学研究的晶体学家。
在计算机科学中,一个棘手的问题是如何让机器充分发挥作用帮助人类解决难题。巴克斯选择了拆分编译器问题,这种方法虽然难以理解,却是FORTRAN名副其实的成就之一。编译器首先对高级语言、数学符号和英语缩写进行初步扫描,或叫语法分析。接着,对程序进行复杂的分析,以便编译器把工作重点放在使程序的核心部分自动化上。然后,编译器必须计算出如何用最少的时间分配其编译指令使机器运行。最后,经过编译的程序必须被汇编成机器代码。
1957年FORTRAN首次面世于洛杉矶召开的西部计算机联席会议上,参加会议的主要是那些为数不多的SHARE会员。向人们证明了FORTRAN编写的程序花费的时间和运行的效率上远远高于汇编语言。
第三章 20世纪60年代的惨痛教训:从繁盛到COBOL 和IBM 360计划成为现实
FORTRAN问世之后,IBM看到了客户的反应,认为FORTRAN能帮助IBM卖出更多的机器。同年九月,IBM宣布IBM的新机型-704,将采用FORTRAN来编程。这一强制措施非常有效,使用FORTRAN人们解决了一个又一个计算领域的难题,并开创了一个长达十年的繁荣期。随后,Lisp、Algol、COBEL等新领域的语言层出不穷。两个新的研究分支-人工智能和分时技术,开始建立。
分时系统和人工智能是20世纪60年代最崇高的两个追求。分时技术的出现被认为是计算机应用行业的开始。但是在20世纪70年代初,散布在全国的分时系统的前景开始变得暗淡,大系统,甚至是可以同时为数百名用户提供服务的系统,越来越难以正常工作。
这两项研究起步阶段都起到核心作用的人是约翰-麦卡锡。分时系统第一次表述是在1959年于巴黎召开的一次联合国教科文组织会议上。当时英国计算机科学家克里斯托弗-斯特雷奇发表了一篇“大型,快速计算机的分时技术”的文章。20世纪50年代后期,麻省理工学院是计算机应用方面的领头羊,而麦卡锡当时在此担任助理教授。1959年1月麦卡锡在写给计算中心主任的备忘录中,主要从编程生产力的角度描述了分时技术,将其作为一种“能够大大减少用机器解决问题所需时间”的方法。麦卡锡罗列了分时系统所需的技术,包括“中断”特性和快速内存分配。麦卡锡做过的另一件事是杜撰出了一个新词“人工智能”,1958年成为麻省理工学院助理教授不久,麦卡锡开始设计一种成为Lisp的编程语言,并将其应用到人工智能领域。麦卡锡选用一系列信息列表来构建他的语言,这些信息列表随后将被处理,Lisp代表“列表处理”,各种信息可以显示在列表中,然后用于推论和逻辑推理等操作。当程序运行时通过自动清除和释放计算机内存,这一特性成为“垃圾回收”。
20世纪50年代末,计算机应用范围已经超越了科学和工程领域,逐渐参与到那些正处于转变过程中的大公司和政府组织的核心业务中,这就迫切需要一种业务简化的编程语言。起初COBOL这种面向商务的通用语言,并不被一些厂商和学术界认可,但是它解决了一大难题:如何在编程语言中处理业务数据。美国国防部是当时购买计算机的最大客户,他们监管了COBOL的设计,而且政府在其完成后宣布,除非计算机使用COBOL语言,否则它既不会购买也不会租用。
1959年COBOL面世时,有两家公司已经开始着手建立自己的商用语言:斯派力-蓝德公司的Flow-Matic和IBM的Comtran。采用集体的方式设计商用语言,最早是由宝来公司的编程经理玛丽-霍丝提出的。当她把这个想法告诉宾夕法尼亚大学的索尔-考恩教授时,他们一直认为,为了促进这个年轻行业的发展,应该开发一种商用语言。1959年4月在宾西法尼亚大学召开的会议上,美国国防部数据系统研究主任查尔斯-菲利普斯出任Codasyl(数据系统语言委员会)的主席。随后五月底在五角大楼开启首次会议,六月底宣布于年末交付COBOL语言。
珍-萨美特在COBOL短期委员会主要任务是“针对数字计算机编程,推荐一个短期的通用商务语言的综合办法”。这种综合办法的关键是要综合现有的三种商用语言:Flow-Matic,Comtran和空军主导的Aimaco。九月份定名为COBOL,即Common Business Oriented Language的简单缩写。
葛丽思-霍普是COBOL最大的拥护者,并且是COBOL项目背后最大的推动者。霍普曾领导开发的Flow-matic对COBOL影响很大。COBEL为了说服各地的公司使用COBOL进行全国范围演讲,霍普有"COBEL"之母之称。
20世纪60年代具有标志性的软件项目是IBM的360产品线大型计算机操作系统-OS/360。
1966年1月,瓦次-汉弗雷接任IBM编程主任一职。OS/360的工作计划延误了大约一年时间,看起来一近乎失控。汉弗雷取消了当年所有的交付计划,并让各个小组重新拟定可行的交付计划。计划拿到手后,汉弗雷宣布了一系列时间表,总跨度为两年。公司逐个按期完成,虽然晚了一年,并且支出了4倍的预算。但IBM最终兑现了诺言。IBM360成了第二次世界大战后最经典的商业成功案例,它押上整个公司作为赌注,并且取得了巨大回报。
第四章 打破巨型计算机的控制:UNIX和C
1964年,肯-汤普森是加州大学伯克利分校的一名大学生。1964年四月,IBM发布IBM 360大型机(1964年之前,IBM被视为企业技术独裁的象征)。汤普森评价360给程序员带来的负担令人望而却步,操作系统像个怪物一样难以生产和维护。客观来说,IBM的设计包含了技术的权衡折中。
1969年汤普森和实验室的长期搭档丹尼斯-里奇密切合作,开发出了UNIX操作系统。高效、简洁、精致的Unix和IBM 360形成了鲜明的对比。最初,UNIX仅作为工具供贝尔实验室使用,后来逐渐走出实验室,进入了大学和工程界。1943年,肯-汤普森出生于新奥尔良。汤普森从小对机械痴迷,大学加入伯克利电子工程专业,毕业后由导师雇佣。那时汤普森认识了伯克利分校数学系一流的博弈论专家埃尔文-波利钦普,后来被其推荐入贝尔实验室。丹尼斯-里奇,从小在舒适的郊区长大,其父亲是贝尔实验室的一位科学家。里奇攻读数学博士无果之后,转向感兴趣的计算机,1968年加入贝尔实验室,比汤普森晚一年。很快,他们陷入Multics计划的困境。贝尔实验室一直与通用和麻省理工学院保持合作,当时Multics是最具有野心的分时共享系统的尝试,设计支持1000个连接的终端和300名用户同时作业。但分时共享的理念中一次性添加了 太多新东西,试图维持三个地理上分散、文化背景毫不相同的机构进行合作必然毫无益处。1969年贝尔实验室认定Multics是个高昂的错误,于是退出了该项目。放弃Multics后,汤普森和里奇说服他们上司允许创建自己的分时系统。同年夏天,汤普森开始编写Unix第一个版本,共有4个主要部分:操作系统核心、外壳、编辑器以及编译器。
C语言是为Unix系统开发的。C语言由里奇主导,汤普森帮助下完成。C最早可追溯到麻省理工学院和MAC项目,他的“祖父”是BCPL。BCPL是Multics项目的衍生物开发出来的。UNIX是由汇编语言编写(考虑到运行性能),后来汤普森也认为UNIX应该有它自己的语言,起初他设计出了B语言,BCPL的简化版。1972年,里奇开发出了C语言,和Unix一样,C语言源自相同的理念。C语言很少限制熟练程序员的自由,也很少保护缺乏经验的程序员使其避免陷入麻烦。
1983年汤普森和里奇获得图灵奖--计算机科学领域的诺贝尔奖。
第五章 为大众编程:从达特茅斯的BASIC到Visual BASIC
1957年,托马斯-库尔兹是新罕布什州达特茅斯大学一位年轻的教授,接触到FORTRAN后,他深深地感到高级语言编程能够节省计算机时间,同时也能节省程序员的时间。随后库尔兹和同时兼导师约翰-凯莫尼开发出了一款简单易学的高级编程语言BASIC(Beginner's All-purpose Symbolic Instruction Code,初学者通用符号指令代码)。最初在达特茅斯大学供文科生学习。
BASIC没有标准化组织为其设立官方标准,到20世纪70年代末市面上已经出现了几十种不同版本的BASIC。
斯坦福大学讲师丹尼斯-艾莉森在他的朋友鲍勃-阿尔布赖特的鼓励下编写了早期微型计算机编程语言Tiny BASIC。Tiny BASIC被认为是早期计算机教育和计算机改装必不可少的工具。艾莉森设计的Tiny BASIC不断改善,使之成为一种用途越来越广泛的语言。
而在国家的另一端,马萨诸塞州的剑桥市,两个创业年轻人,保罗-艾伦和比尔-盖茨,选择了和他们截然不同的道路。1975年两个年轻人读过《大众电子》杂志后,随即着手为MITS Altair设计商业版的BASIC。两人为Altair编写的BASIC具有很多功能,他的速度极快,而且作为一种最初运行在仅有4KB的内存板上的编程语言,他有很多令人印象深刻的特性。两人并没有遵循达特茅斯BASIC的规则,而是将多条编程指令合并到一行代码中以节省空间。为了更好地控制计算机,他们把所谓的PEEK和POKE指令也加入其中,这样编程者就可以预览,继而直接操控内存中的数据字节。这与凯莫尼和库尔兹当时的设计原则背道而驰。
1975年夏天,盖茨和艾伦签下了一份合同。艾德-罗伯茨是位于新墨西哥州阿布奎基的MITS公司的总裁。两人称自己为Micro-soft(微型计算机软件)之意。这份合同对于二人至关重要,但是二人仍与MITS保持独立性。
Microsoft BASIC并不是当时市场上唯一的微机版BASIC。1976年加州蒙特利海军研究生院的学生小戈登-尤班克斯编写了CBASIC。CBASIC进售价100美元,在一小部分编写特定商业软件为生的半专业人士中大受欢迎。于此相反,盖茨的着眼点落在利润丰厚的个人计算机制造商身上,他与制造商密切合作,说服他们把软件交给微软。
库博是一名个人计算机方面的业余爱好者,库博针对所谓的“高手”用户推出了一款灵巧的工具-Ruby。这款程序是一种壳结构集,它为用户在屏幕上展现一个长方形的面板,类似于工作台,用户可以在上面修改操作系统的图形外壳。有了Ruby用户就可以用鼠标将几个项目拖拽并安置在面板上,再将其组合起来。库博找到盖茨,并将Ruby卖给了微软。
C语言出现后,取代BASIC成为最常用的个人计算机编程语言,这让微软的处境雪上加霜。无论如何,微软必须想方设法让业界更多的人为Windows编程,盖茨认为让Ruby和BASIC联姻可以实现,随后推出Quick BASIC 4.0。将两者合二为一并非易事,经过一年半的努力,Visual Basic横空出世。Windows成为行业内的垄断性操作系统,Visual Basic功不可没。
第六章 欧洲的影响力:从Algol到Pascal再到C++
编程语言的类型和结构多种多样,从FORTRAN,COBOL到Visual Basic和Java,这些主流编程语言都有一个地理上的共性:诞生在美国。但美国不是编程语言唯一的发源地,欧洲的发展成就也不容小觑,像Algol,Simula和Pascal。相比之下,欧洲人在设计编程语言时更偏重学术理论,美国人更注重经济效应。
C语言是由BCPL语言演变而来,CPL则是由剑桥大学和伦敦大学合作开发的一种编程语言。C代表Christopher,因为正是有了克里斯托弗-斯特雷奇才会有CPL。本贾尼-斯特劳斯特卢普在CPL的基础上设计出了C++。
斯特劳斯特卢普首次接触计算机是在丹麦上大学期间,当时大二他兼职为一些企业编写商用程序。1979年加入贝尔实验室不久,他很快发现想要拆分并分发Unix模块给多个计算机,首先需要借助一种模拟工具来分析网络流量。于是,开始着手模拟工具的开发工作,4年后一种新的语言C++问世了。C++最终成为了一种功能强大的编程工具。
斯特劳斯特卢普的“梦想”是将欧洲的两种计算机语言Algol和Simula合二为一。尤其是Algol,它体现了欧洲对软件的贡献,即优秀的创意,但包装和实施的力度不够。Algol语言(Algorithmic Language,算法语言)出自专业委员会,Algol是多国计算机专家,尤其是欧洲本土科学家共同努力地结果。但是Algol的设计者们很少与机器打交道,在计算机应用方面缺乏实战经验,所以一直发展缓慢。Algol开发小组后来分为了两个阵营:“激进派”希望开拓语言设计的新疆域;“实用派”希望改进Algol,消除现存的缺陷,并加入有用的特性。
实用主义者沃斯开始着手设计一种与Algol十分相似的语言-Pascal。Pascal是一种实用的工作语言,脱离了纯理论,增强了实用性(苹果系统Macintosh由Pascal编写)。Pascal成了大学里讲授结构化编程,尤其是编写严谨的计算机科学程序所用的语言,因此对后世影响颇深。
Simula是一种20世纪60年代起源于挪威的编程语言,开发Simula是为了研究特定网络中的流量,Simula由两位科学家克里斯登-奶家特和奥利-约翰-达尔于1962-1967年在位于奥斯陆的挪威计算机中心共同完成。Simula产生于“运筹学”,利用模拟等统计学方法分析和解决组织性问题。Simula用“类”标识不同类型的数据,另外Simula还有两种相互关联的概念,即继承和对象,这使程序员能够运用明确定义的模块来编写软件,Simula是首个面向对象的编程语言。
C++充分地借鉴了Simula,斯特劳斯特卢普决定将Simula与C结合,以达到C能运行的地方C++就能运行的目的。C++的主要编译器是由斯特劳斯特卢普编写的Cfront,能够把C++编译为C。