设为首页 加入收藏

TOP

第3章 生活在现实世界中
2013-10-07 00:09:06 来源: 作者: 【 】 浏览:74
Tags:生活 现实 世界

第3章 生活在现实世界中

在本章的开始,我将讲述两件看上去与C++(www.cppentry.com)毫无关系的轶事。千万不要烦。

波士顿一个成功的企业执行官刚买了一辆非常昂贵的英国豪华轿车,结果在一个不期而至的寒冷天气里,她惊讶地发现车子根本不能发动。她怒气冲冲地向汽车厂的服务部门抱怨出现的问题。“什么?”客服经理非常惊讶:“你没有把它停在有暖气的车库里?”。

这辆车确实豪华,仪表盘采用手工雕刻的木制面板,车内到处是真皮皮革,设计者对舒适性和风格的追求可谓精益求精了。但是波士顿的冬天比英格兰冷得多,汽车设计者可能没有意识到在寒冷的天气里还会有客户把车停在户外。

我于1967年开始学习APL。

APL是一门非常优秀的语言。它只有两种数据类型——字符和数字——而数组是它唯一的数据结构。变量和表达式的类型是动态定义的。APL程序员从不为内存分配操心。执行过程检查所有的操作,所以APL程序员只能看到APL的值和程序。

APL不仅仅是一门语言——它的第一个实现版本还包含了一个完整的操作系统。按照现在的标准来看,这个系统的效率之高出人意料:在当时那种CPU功能和内存只与现在的普通笔记本电脑相当的机器上 ,它可以同时支持30个分时用户。

到我能自如运用APL时,我发现,解决相差不多的问题时,自己的程序大小仅仅是用其他常规语言(如FORTRAN和PL/I)所写的程序的五分之一。这些程序并不因为小就功能简单。内建的APL操作符大多数只是一个字符,而不是标识,这也促使APL程序员总是为他们的变量起很短的名字。我认为把APL看成一门不可读的语言有点言过其实,这只不过是因为APL如此紧凑罢了。

20世纪70年代早期,我还是哥伦比亚大学的一名学生。学校里随处可见图书馆:大多数数学书在数学大楼里,大多数工程类书籍在工程学院,依此类推。每天图书馆都会列出一份书籍流通情况的清单,标明哪些书被借走了、哪些还有库存等情况。清单大概有100 000行,分开打印在与图书馆最大的几个分部对应起来的6个表中。打印机每分钟大约能打印900行,这样每天要花两个小时的打印机时来打印流通清单。

根据墨菲法则 ,每当我想打印自己的东西时,打印机就被那份该死的流通清单所占据,害得我老得等着。因此,我考虑了一段时间,看是否能够把图书馆流通系统转换成APL。我认为只需要在有流通清单副本的地方安装终端就行了;这些终端可以直接和数据库连接起来,从而一步就跨过了每天要耗费的堆积如山的纸堆。仅从纸张节省下来的开支就能很快填补开发项目所需的经费。

但是,这个项目还无法开展,因为存在下面这些问题:

• 如果有人要查询流通列表,而APL系统又down掉了,这时该怎么办?

• 谁负责维护出了故障的终端?

• 我们的程序员不了解APL,也不想学。怎么说服他们?

• 怎么才能使APL访问数据库

• 怎样处理已有的COBOL(PL/I,汇编语言)程序

我确实不知道能否找到所有这些问题的令人满意的答案。但是,我知道这都无关紧要。假设有可能解决这些问题,并且用APL重写了这个系统,那么这个系统也不会是原来所想的那样。

类似于流通系统的事物都不是孤立的。有一整套经年累月才完成的复杂的程序,用于跟踪和处理拥有上百万册图书的图书馆的情况。要想替换掉其中任何一个程序,都必须保证替换后的程序运行起来和原来的一模一样,尤其是提供给系统其他部分的接口要一样。

因此,至于APL好不好或者APL程序员是否很强,那都不是重点:在这种情形下APL不起作用,除非APL程序能毫无痕迹地替换掉系统中的所有COBOL程序。

现在,你应该可以看出这两个故事的共同点了吧。如果轿车不能发动,即使再漂亮又有什么用?同样,如果用一种语言写出的程序不能在系统中运行起来,再优秀又有什么用。

车和编程(www.cppentry.com)语言都是工具。它们可能极具艺术魅力,但是本质上车是交通工具,编程(www.cppentry.com)语言是写程序的工具,归结起来都是解决问题的工具。通常我们不可能为特定的工具挑选合适的问题。在冬天气候寒冷的地方,我们必须选择一款能在冷天发动的车,准备好可以供暖的车库,或者不用车。我们也无法改变气候。同样,如果必须与已经存在的软件系统共存,就不能为了使用自己的工具而重写所有的代码,反之,我们必须选择能被该软件系统兼容的工具。

现在我们一起来考虑编程(www.cppentry.com)环境。

大多数操作系统都支持所谓的传统环境。你把自己的程序交给编译器编译,编译器把相应的机器代码放入一个文件。连接程序读取这个文件,把这些机器指令和相关的库中的机器指令结合起来,放入另一个文件。得到执行这个文件的命令后,操作系统就把文件读入内存,并且跳到文件的第一条指令。

有些操作系统先给程序裹上一层保护层,这样程序就不会破坏系统了。还有的操作系统允许同时执行几个程序。其他的环境存在细节上的差别。但是这种传统编程(www.cppentry.com)环境可以和几乎所有的操作系统共存。

有的语言通常都要有它们自己相应的编程(www.cppentry.com)环境。APL就是这样的语言;Lisp、Basic和Smalltalk也是。有一些这样的语言尤其难与其环境分离开来;在Smalltalk中,很难分清哪里是程序,哪里是系统环境。

Basic程序则相反,其文件和连接程序的标识经过很好的组织。尽管大多数Basic实现都是交互式的,我们还是很容易了解Basic是如何在传统环境中运行的,同时可以很轻易地将Basic看成文件,编译和执行之间也有很清楚的界限。

Lisp作为另一个反例,普遍采用一种标识叫做S-expressions,即程序和数据都是内部结构S-experession的实例。你可以往文件中写任何S-expression,按照同样的方式,你也可以往文件中写入人们可以读懂的关于程序的表述,但是能作为程序的是S-expression,而不是这些表述。因此,当处理那些不能很好地符合S-expression模式的数据时,Lisp程序员就陷入困境。很难针对存储在磁带中的户口普查资料、或者类似于局域网或风洞这样奇怪的I/O设备编写Lisp程序。

我曾遇到过一些Lisp程序员,他们对这些缺点的反应令人吃惊,他们居然认为解决这些问题的唯一办法就是让全世界都只使用Lisp这一种语言!也许他们确实能够!但是没有用:任何时候Lisp都不可能一统天下,接口问题也不会彻底解决。

明智的程序员对待Lisp以及任何其他编程(www.cppentry.com)语言的态度应当是:把它们当成工具,这一种合适时就采用这一种,如果另一种更管用,则选用另一种。
于是C++(www.cppentry.com)终于向我们走来了。

我做关于C++(www.cppentry.com)的演讲时,听到的最常见的问题之一就是:为什么C++(www.cppentry.com)没有(提问者最爱使用的编程(www.cppentry.com)环境的某种功能)?例如,Lisp、Basic和其他语言都努力实现交互性:计算机迅速对每个表达式进行求值,并打印出结果。为什么C++(www.cppentry.com)不这样?

我的答案总结起来就是:“这种功能不是编程(www.cppentry.com)语言本身的一部分,所以你系统中的C++(www.cppentry.com)是否具备这种功能,得看系统有没有为它提供这样的环境。”C++(www.cppentry.com)是一门编程(www.cppentry.com)语言,其本身并不是一种编程(www.cppentry.com)环境。如果你试图在一个只实现了最简单的传统环境的操作系统中运行C++(www.cppentry.com)程序,无疑是不会很舒服的。但是,这也给了C++(www.cppentry.com)两个非常重要的特性:可移植性和可并存性。

一台机器如果支持C,那么要支持C++(www.cppentry.com)就不会有很大困难,也就是说C++(www.cppentry.com)几乎可以在任何地方运行。C++(www.cppentry.com)没有对复杂操作系统的依赖性,譬如不需要对垃圾收集机制或者交互执行等功能的支持。

另外,由于C++(www.cppentry.com)可以使用存在于它所处的主机系统中的任何一种环境,所以它允许人们开发出能和正在运行的任何程序交互的程序。这种对环境极小的依赖性也使C++(www.cppentry.com)程序可以在几乎没有支持环境的系统中运行。垃圾收集器的系统开销非常大,对于某些程序——比如说垃圾压缩机的控制程序——并不适合 。

C++(www.cppentry.com)能在任何已经存在的环境中运行。这使得人们可以在不重写(甚至不用重编译)C程序的情况下就能直接使用大量已有的C软件,也使得人们能用C++(www.cppentry.com)写出完整的操作系统。

这就是为什么C++(www.cppentry.com)程序能在类似于照相机这样的电子设备中运行良好。

这就是为什么只拥有最简单环境的可编程(www.cppentry.com)终端也能下载和运行C++(www.cppentry.com)程序。

这就是为什么原本使用C的大型编程(www.cppentry.com)项目正在逐渐地转而使用C++(www.cppentry.com),而且无需重写所有代码。

这就是为什么粒子物理科学家可以在他们的桌面工作站上调试算法,再把相同的程序放到具有可以充分发挥并行优势的数组库的超型计算机上运行。
随着C++(www.cppentry.com)越来越流行,越来越多的人开始从事支持C++(www.cppentry.com)开发工具的工作,有朝一日会出现一个标准的C++(www.cppentry.com)环境,就像今天的标准APL环境一样。同时,C++(www.cppentry.com)具有与多种现存系统协同工作的能力,使得C++(www.cppentry.com)在许多环境中越来越广泛地获得认可。

C++(www.cppentry.com)是在混合环境中发展壮大起来的,是生存在现实世界中的。


回书目      

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇2.2.2 抽象和规范 下一篇2.1.2 质疑软件工厂

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: