一套好的的符号系统能把大脑从所有非必要的工作中解脱出来,集中精力去对付更高级的问题,从功效上看,能够有效地提高人类的智力。在引入阿拉伯数字之前计算乘法是困难的,除法(即便只是整数除法)更需要发挥全部的数学才能。在当代社会中,最让一位希腊数学家感到吃惊的或许是下面的事实:绝大部分西欧人都能完成大整数的除法。在他看来这几乎是完全不可能的……我们现在具有轻易进行小数计算的能力,这完全是逐步发现了完美的表示法的令人惊叹的结果。
—怀德海1
用来实现系统的编程语言与你的切身利益密切相关,因为从“构建”的开始到结束你都要“沉浸”在这种语言中。
研究表明,编程语言的选择从多个方面影响生产率和代码质量。
程序员使用熟悉的语言时,生产率比使用不熟悉的语言时要高。Cocomo估计模型的数据表明,当程序员用“使用了三年以上的语言”编写代码时,生产率比“同等经验但使用新语言的程序员”高30% (Boehm et al. 2000)。更早在IBM进行的一项研究发现,对编程语言有相当丰富经验的程序员的生产率比几乎没有经验的程序员高3倍(Walston and Felix 1977)。(Cocomo II更加仔细地分离了各个作用因素的独立效果,这就解释了这两项研究结果的不同。)
使用高级语言的程序员能比使用较低级的语言的程序员达到更好的生产率和质量。人们相信,高级语言(high-level language)如C++、Java、Smalltalk、Visual Basic等比低级语言(low-level language,如汇编和C语言)在生产率、可靠性、简洁性、易理解性等方面高5至15倍(Brooks 1987, Jones 1998, Boehm 2000)。你没必要每当“一条C语句实现了它应有的功能”就举行颁奖典礼,因此能节约不少时间。另外,高级语言比低级语言的表达力更强。每行代码能表达更多的含义。表4-1列出了几种高级语言的每一行源代码与等效的C语言代码行数之比(的典型值)。更高比率表示该语言的一行代码比一行C语言代码能完成更多的工作。
表4-1 高级语言的语句与等效的C代码语句行数之比
语言 相对于C语言的等级
C 1
C++ 2.5
Fortran 95 2
Java 2.5
Perl 6
Python 6
Smalltalk 6
Microsoft Visual Basic 4.5
来源:改编自《Estimating Software Costs》(Jones 1998)、《Software Cost Estimation with Cocomo II》(Boehm 2000)、“An Empirical Comparison of Seven Programming Languages(对7种编程语言的实验比较)”(Prechelt 2000).
某些语言更能表达编程中的各种概念。你可以将自然语言(如英语)和编程语言(如Java和C++)做一个类比。对于自然语言,语言学家Sapir和Whorf对“语言的表达能力”和“思考的能力”之间的关系提出了一个假说。Sapir-Whorf假说是,你思考的能力取决于你是否知道能够表达该思想的词汇。如果你不知道这些词汇,就无法表达出这种思想,甚至可能不能形成这种思想(Whorf 1956)。
程序员同样受到所用编程语言的影响。在一种编程语言中可用来表达编程思想的词汇,毫无疑问地决定了你将如何表达你的思想,甚至可能决定了你能表达什么样的思想。
编程语言影响程序员的思维的证据随处可见。典型的故事类似下面的样子:“我们用C++编写一个新系统,但是大多数程序员没有太多C++经验。他们具有Fortran语言背景。他们编写出能用C++编译的代码,但实际上编写的是伪装成C++的Fortran代码。他们扭曲C++来模拟Fortran的不良特性(例如goto语句和全局数据)并且忽略了C++丰富的面向对象能力。”这种现象多年来在整个行业当中随处可见(Hanson 1984, Yourdon 1986a)。
Language Descriptions
语言描述
某些语言的发展历史(和它的总体能力)很有意思。以下描述了现今最常见的若干种语言。
Ada是一种通用的高级编程语言,基于Pascal。它的开发受到美国国防部的资助,尤其适合实时及嵌入式系统。Ada强调数据抽象与信息隐藏,强制要求程序员区分每个类(class)和包(package)的公用(public)部分和私用(private)部分。选择“Ada”作为语言的名称,是为了纪念Ada Lovelace——一位数学家,大家将她尊为世界上首位程序员。2目前Ada主要用在军事、航天及航空电子系统中。
Assembly Language
汇编语言
汇编语言——又称“汇编”——是一类低级语言,它的每条语句对应一条机器指令。因为其语句对应于特定机器的指令,所以一种汇编语言是针对一种特定处理器的——例如,针对Intel CPU或者针对Motorola CPU。汇编被认为是第二代语言。大多数程序员避免使用汇编,除非为了冲破“执行速度”或“代码大小”的限制。
C是一种通用(general purpose)的中级语言(mid-level language),它最初与UNIX操作系统紧密关联。C具有某些高级语言的特征,例如结构化的数据、结构化的控制流程、机器无关性以及一套丰富的运算符。它也被称为“可移植的汇编语言(protable assembly language)”,因为其中大量使用指针和地址,具有某些低级的构件(如位操作),而且是弱类型的(weakly typed)。
C语言是20世纪70年代在Bell Labs开发的。其最初设计为在DEC PDP-11小型机上使用,这种机器的操作系统、C编译器和UNIX应用程序全都用C编写。1988年,C语言的ANSI标准发布,该标准1999年又做了修订。在20世纪80年代和90年代,C语言是微型计算机和工作站程序设计的事实标准。
C++是一种面向对象(object-oriented)的语言,基于C语言,它是20世纪80年代在Bell Laboratories开发的。除了与C兼容之外,C++还提供了类、多态、异常处理、模板,而且提供比C语言更健壮的类型检查功能。它还提供了一套内容广泛而强大的标准库。
C#是一种通用的面向对象语言和编程环境,由Microsoft开发,语法类似C、C++和Java,它提供了大量的工具,帮助在Microsoft平台上进行开发。
Cobol是一种像英语的编程语言,原本是为了美国国防部的使用在1959-1961年间开发的。Cobol主要适于商业应用,而且今天仍然是用得最广泛的语言之一,其流行程度仅次于Visual Basic(Feiman and Driver 2002)。这些年来Cobol一直在更新,已经包含了数学函数和面向对象的能力。“Cobol”是“COmmon Business-Oriented Language”(面向商业的通用语言)的首字母缩写。
Fortran
Fortran是第一个高级计算机语言,引入了“变量”和“高级循环”的概念。“Fortran”代表“FORmula TRANslation”(公式翻译),最早开发于20世纪50年代,而且有若干重要的修订版,包括1977年的Fortran 77,加入了块结构的if-then-else语句和字符及字符串处理功能。Fortran 90加入了用户定义的数据类型、指针、类,以及一套丰富的数组运算。Fortran主要用在科学和工程应用中。
Java
Java是一种面向对象的语言,语法类似C和C++,由Sun Microsystems, Inc.开发。Java设计为能在任何平台上运行,办法是将Java源代码转变为字节码(byte code),然后让后者在各个平台上的虚拟机环境中运行。Java广泛用于Web应用的编程。
JavaScript
JavaScript是一种解释执行的脚本语言,最初与Java略有关系。它主要用于做客户端编程,例如为Web页面增加简单的功能及在线应用程序。
Perl
Perl是一种处理字符串的语言,基于C和若干UNIX工具程序。Perl常用于系统管理任务,诸如创建生成脚本(build scripts),也用于生成及处理报表。它也可用来创建Web应用程序,例如Slashdot。“Perl”是“Practical Extraction and Report Language(实用摘要及报告语言)”的首字母缩写。
PHP
PHP是一种开源的脚本语言,具有与Perl、Bourne Shell、JavaScript、C类似的语法。PHP能在所有主要的操作系统上运行,用来执行服务器端的交互功能。它也能嵌入Web页面中,用来访问及呈现数据库信息。“PHP”原来代表“Personal Home Page(个人主页)”,现在代表“PHP: Hypertext Processor (PHP:超文本处理器)”。
Python
Python是一种解释性的、交互式的面向对象语言,能在多种环境中运行。它最常见的用处是编写脚本和小型Web应用程序,也支持创建更大型的程序。
SQL
SQL语言是查询、更新、管理关系数据库的事实标准。“SQL”代表“Structured Query Language(结构化查询语言)”。与本节列出的其他语言不同,SQL是“声明式”语言,意思是说,它不是定义一系列操作,而是定义某些操作的结果
Visual Basic
最初的Basic是20世纪60年代在Dartmouth学院开发的一种高级语言。BASIC是“Beginner’s All-purpose Symbolic Instruction Code(初学者通用符号指令码)”
的首字母缩写。Visual Basic是一种高级的面向对象的可视化Basic语言,由Microsoft开发,最初设计是为了创建Microsoft Windows应用程序,它经过扩展,可以定制桌面应用程序(如Microsoft Office)、创建Web程序,以及其他应用。专家们报告说,在21世纪初期,使用Visual Basic的专业开发人员比用其他任何语言的都多(Feiman and Driver 2002)。







