
1.4 程序设计语言的发展
1.4.1 程序设计语言的演变
众所周知,人与人之间的交往是通过语言进行的。同样,人与计算机之间交换信息也必须有一种语言作为媒介,这种语言称为计算机语言。如果需要计算机来解决某个实际问题,就必须采用计算机语言来编制相应的程序,然后由计算机执行编制好的程序,最终达到解决问题的目的。
编制程序的过程称为程序设计,因而计算机语言又称为程序设计语言。按照程序设计语言对计算机的依赖程度可分为3大类,即机器语言、汇编语言和高级语言。
1.机器语言
机器语言即是机器指令系统,也就是计算机所有能执行的基本操作的命令。机器语言是用二进制代码表示的程序设计语言,是最低级的语言。用机器语言编写的程序称为机器语言程序,能直接被计算机识别和执行,因此执行速度较快。
但是由于机种不同,其指令系统是不一样的。所以,同一道题目在不同的计算机上计算时,必须编写不同的机器语言程序,也就是说机器语言程序的可移植性差;另外,由于机器语言中每条指令都是一串二进制代码,因此可读性差、不易记忆;编写程序既难又繁,容易出错;程序的调试和修改难度也很大,因此很少用机器语言编程。
例如,用8088微处理器的机器语言编写7+5的程序,要用到下面的机器指令:

2.汇编语言
为了解决机器语言的上述缺点,20世纪50年代初,出现了汇编语言。汇编语言是一种符号化的机器语言,它不再使用难以记忆的二进制代码,而是使用比较容易识别、记忆的助记符号代替操作码,用符号代替操作数或地址码。例如,上面的例子若写成汇编语言,则形式如下:
MOV AL,5 //把5送到AL中
ADD AL,7 //7+5的结果仍存在AL中
可以看出,程序的可读性大大增强了。与机器语言相比较,汇编语言在编写、修改和阅读程序等方面都有了相当的改进。但这种语言还是从属于特定机型的,除了用符号代替二进制码外,汇编语言的指令格式与机器语言相差无几。用汇编语言编写的程序称为汇编语言程序,计算机不能直接识别、执行它,要经过汇编程序翻译成机器语言程序(称目标程序)后才能执行,这个翻译过程称为汇编。汇编语言程序的可移植性也较差。
由于从执行速度和占用内存空间角度上讲,汇编语言较好,通常情况下用汇编语言来编写效率较高的实时控制程序和某些系统软件。
3.高级语言
高级语言是与人类自然语言相近似的,而不依赖于任何机器指令系统的程序设计语言,其语言格式更接近于自然语言,或接近于数学函数形式。描述问题与计算公式基本一致,可读性较好,它们是面向过程的语言。由高级语言编写7+5的程序如下:
A=7+5 //7+5的结果存放在变量A中
高级语言的通用性较好,易于掌握,大大提高了编写程序的效率,改善了程序的可读性,用高级语言编写的程序称为高级语言源程序。与汇编语言相同,计算机是不能直接识别和执行高级语言源程序的,也要用翻译的方法把高级语言源程序翻译成等价的机器语言程序(称为目标程序)才能执行。通常高级语言程序的翻译有两种方式:解释方式和编译方式。
1.4.2 程序设计语言处理系统
计算机只能直接识别和执行机器语言,那么要在计算机中运行高级语言程序就必须配备程序语言翻译程序,简称翻译程序。翻译程序本身是一组程序,不同的高级语言都有相应的翻译程序。对于高级语言来说,翻译的方法有解释和编译两种。
1.解释方式
将源程序逐句解释执行,即解释一句就执行一句,其过程如图1.7所示,在解释方式中不产生目标文件。早期的BASIC语言采用“解释”方法,它是用解释一条BASIC语句执行一条语句的方法,效率比较低。

图1.7 高级语言源程序的解释过程
2.编译方式
将整个源程序翻译成机器语言程序,然后让机器直接执行此机器语言程序。目前,流行的高级语言C、C++、Visual Basic等都采用编译的方法。它是用相应语言的编译程序先把源程序编译成机器语言的目标程序(扩展名为.obj),然后再用连接程序,把目标程序和各种标准库函数连接装配成一个完整的可执行的机器语言程序才能执行。简单地说,一个高级语言源程序必须经过编译和连接两步后才能成为可执行的机器语言程序。尽管编译的过程复杂一些,但它形成可执行文件(扩展名为.exe),且可以反复执行,速度较快。图1.8所示为高级语言的编译过程。运行程序时只要执行可执行程序即可。

图1.8 高级语言源程序的编译过程
对源程序进行解释和编译任务的程序,分别称为解释程序和编译程序。例如,C++等高级语言,使用时需有相应的编译程序;而BASIC等高级语言,使用时需用相应的解释程序。
1.4.3 C语言和面向对象的C++语言
1960年出现的ALGOL60是一种面向问题的高级语言,它离硬件比较远,不宜编写系统程序。1963年英国剑桥大学推出了CPL(Combined Programming Language)语言,它在ALGOL 60的基础上接近硬件一些,但规模比较大,使用困难。1967年英国剑桥大学的Martin Richards对CPL进行了简化,推出了BCPL(Basic Combined Programming Language)语言。
1970年,美国贝尔实验室的Ken Thompson以BCPL语言为基础,设计出了很简单又很接近硬件的B语言(BCPL第一个字母),并用B语言对用汇编语言编写的UNIX操作系统进行了部分改写,此时的B语言过于简单,功能有限。1972年至1973年间,贝尔实验室的D.M.Ritchie在B语言的基础上设计出了C语言(BCPL第二个字母)。C语言既保持了BCPL和B语言精练和接近硬件的优点,又克服了它们过于简单和无数据类型等缺点。1973年,贝尔实验室的Ken Thompson和D.M.Ritchie将UNIX操作系统的90%用C语言改写。
后来人们又对C语言进行了多次改进,但主要还是在贝尔实验室内部使用。直到1975年UNIX 6.0的发布,C语言的优点才引起人们的广泛注意。1978年以后,C语言先后移植到大、中、小、微型计算机上,很快风靡全世界,成为应用最广泛的计算机语言之一。
C语言是结构化、模块化的程序设计语言,是面向过程的,在处理小规模程序时较为得心应手。当问题非常复杂、程序规模很大时,面向过程的程序设计方法就显示出它的不足。于是,为适应面向对象的程序设计方法,人们在C语言基础上加以发展。20世纪80年代AT&T公司的贝尔实验室的Bjarne Stroustrup博士在C语言基础上开发出支持面向对象的C语言,被他称为“带类的C”。后来为了强调它是C的增强版,1983年Rick Masenirti提出改称为C++。
C++是一门高效实用的混合型程序设计语言,它最初的设计目标是:支持面向对象编程技术;支持抽象形态的类;更好的C语言。C++语言包括两部分:一是C++基础部分,它是以C语言为核心的;另一部分是C++面向对象部分,是C++对C语言的扩充部分。这样它既支持面向对象程序设计方法,又支持结构化程序设计方法,同时由于它广泛的应用基础和丰富的开发环境的支持,也使面向对象程序设计得到很快普及。
C++的基础部分与C语言相比除了一些细微的差别外,可以说是超级C语言,它保留了C语言功能强、效率高、风格简洁、适合于大多数的系统程序设计任务等优点,使得C++与C之间取得了兼容性,因此,在过去的软件开发中积累的大量的C的库函数和实用程序都可在C++中应用。
另外,C++语言通过对C的扩充,克服了原有C语言的缺点,完全支持面向对象程序设计方法,支持类的概念。类是一种封装数据和对这些数据进行操作的函数的用户定义的类型,提供了数据隐蔽功能,可确保程序的稳定性、可靠性和可维护性。C++还支持继承、派生和多态性等层次结构,使得其代码具有高度的可重用性。