程序设计教程:用C++语言编程(第4版)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.2.3 程序设计语言

程序设计必然要涉及具体的编程语言,因为程序设计的结果必须要用能被计算机理解的语言来表示才能在计算机上执行。对于编程语言,我们往往要考虑它们的抽象层次以及语法、语义和语用等方面的内容。

1.低级语言与高级语言

用于编程的语言有很多,根据与计算机指令系统和人们解决问题所采用的描述语言(如数学语言)的接近程度,通常把编程语言分为低级语言和高级语言。

(1)低级语言

低级语言(low-level language)是指特定计算机能够直接理解的语言(或与之直接对应的语言),它包括机器语言和汇编语言。机器语言(machine language)采用二进制编码来表示指令的操作以及操作数,而汇编语言(assembly language)则用符号来表示指令的操作和操作数。机器语言和汇编语言的语言成分一般具有一一对应的关系,只不过汇编语言使得程序编写较为容易,并且提高了程序的易读性。下面是用汇编语言表示的计算r=a+b*c-d的低级语言程序(指令序列),其中省略了数据的输入和输出指令,并假设数据已经放在内存中,abcdr分别表示它们的内存位置,ax为CPU中的一个寄存器:

用机器语言编写的程序可以直接在计算机上执行,而用汇编语言编写的程序必须翻译成机器语言程序才能执行,这个翻译工作可由一个称为汇编程序(assembler)的计算机程序来自动完成。

早期的程序设计大都采用低级语言。低级语言的优点在于:编写的程序效率比较高,包括执行速度快和占用空间少。其缺点是:程序难以设计、理解与维护,难以保证程序的正确性。另外,低级语言程序难以从一种结构的计算机移植到(拿到)另一种结构的计算机上运行,这主要是因为不同结构计算机的指令系统是有差别的。

(2)高级语言

高级语言(high-level language)是指人们容易理解并有利于人们对解题过程进行描述的编程语言,通常称为程序设计语言(programming language)。用高级语言来编写程序时,程序设计者不必考虑很多面向计算机硬件的概念,如寄存器、内存等,而是以更抽象、更自然的方式(如人们熟悉的数学公式)来表达程序设计的结果。例如,前面用汇编语言编写的计算r=a+b*c-d的指令用高级语言则可直接写成:

用高级语言编写的程序必须翻译成机器语言程序才能在计算机上运行,翻译方式有编译与解释两种。编译(compiling)是指首先把高级语言程序(称为源代码程序或源程序)翻译成功能上等价的机器语言程序(称为目标代码程序)或汇编语言程序(再通过汇编程序把它翻译成目标代码程序),然后执行目标代码程序,在目标代码程序的执行过程中就不再需要源程序了。解释(interpreting)则是指对源程序中的语句进行逐句翻译并执行(翻译一句、执行一句),翻译完之后程序也就执行完了,这种翻译方式一般不产生目标代码程序,但每次执行都需要源程序。把高级语言程序翻译成机器语言程序的工作一般由程序来实现,根据翻译方式的不同可把翻译程序分为编译程序(compiler)和解释程序(interpreter)。一般来说,编译执行比解释执行效率要高,不过,高级语言程序的编译执行是平台相关的,某个编译结果只能在相同的平台上运行;而解释执行则是平台无关的,因为它是在翻译的时候执行程序,与平台有关的部分由相应平台上的解释程序来解决。由于以解释方式执行高级语言程序虽然效率比较低,但比较灵活,因此,目前出现了一种混合方案,即先通过编译方式把高级语言程序翻译成功能上等价的相对简单的中间语言程序,然后用解释方式执行这个中间语言程序,这样比单纯使用解释方式的执行效率有所提升。

高级语言的优点在于:程序容易设计、理解与维护,容易保证程序正确性。特别地,用高级语言编写的程序与所采用的具体计算机的指令系统无关,因此,容易把它们移植到其他不同结构的计算机中执行,当然,目标计算机中必须要有相应语言的编译或解释程序。另外,用高级语言进行程序设计也使得设计者能基于不同于计算机硬件所提供的计算模型来给出解决方案的描述,即设计者可以基于某种虚拟机模型来进行程序设计,语言翻译程序实现从虚拟机模型到实际计算机模型之间的语义(概念)转换。基于虚拟机模型来进行程序设计可以降低程序设计的复杂度。

高级语言的缺点是:用其编写的程序相对于用低级语言编写的程序效率要低,翻译得到的目标代码量较大。程序的效率和所占的空间对于早期的计算机是非常重要的,因为早期的计算机硬件速度慢、存储空间小,程序的效率必须通过对程序精雕细琢来提高。但是,由于早期的计算机应用面窄、程序的复杂度低,因此用低级语言编写程序的潜在缺陷未能体现出来。当程序的应用范围和规模扩大、复杂度增加以后,程序设计的难易程度和程序的正确性及易维护性问题逐渐显现出来,对于一个难以设计、经常出错和难以维护的程序,尽管它的效率很高,也是不会被接受的。因此,高级语言具有低级语言不可替代的优势。

目前,典型的高级语言包括FORTRAN、COBOL、BASIC、Pascal、C、Ada、Modula-2、Lisp、Prolog、Simula、Smalltalk、C++、Java、Python等,可以从不同的角度对这些语言进行分类。例如,按照应用类型,可把高级语言分为科学计算语言(如FORTRAN)、商务处理语言(如COBOL)、系统程序语言(如C/C++)以及网络应用语言(如Java、Python)等;按照所支持的程序设计范式,可把高级语言分为过程式语言(如FORTRAN、COBOL、BASIC、Pascal、C)、面向对象语言(如Simula、Smalltalk、Java)、函数式语言(如Lisp)、逻辑式语言(如Prolog)以及混合式语言(如C++、Python)等;按执行方式,可把高级语言分为编译型语言(如FORTRAN、COBOL、Pascal、C、Ada、Modula-2、Simula、C++)和解释型语言(如BASIC、Lisp、Prolog、Simula、Smalltalk、Java、Python);等等。

2.语言的语法、语义及语用

任何一种语言都包含语法、语义和语用三个方面。语法(syntax)是指书写结构正确的语言成分应遵循的规则;语义(semantics)是指语言成分的含义;语用(pragmatics)是指语言成分的使用场合及所产生的实际效果。需要注意的是,计算机语言不同于自然语言(人际交流使用的语言,如汉语、英语等),自然语言中往往存在大量的歧义(多义性),而计算机语言则是非常严谨的,有时少一个标点符号或空格都不行,一些细微的差别(如“<”和“≤”)将会导致完全不同的结果,这一点与数学语言类似。

对语言的使用者来说,编程语言的语法和语义比较容易掌握,只要学习和使用时仔细一点就能做到,而编程语言的语用则需要大量的语言实践(用语言编程解决实际问题)才能掌握,并且,它往往还涉及语言的设计和实现方面的内容。语言的设计是指给出语言的定义,包括语法、语义和语用;语言的实现是指在某种计算机平台上写出语言的翻译程序(编译或解释程序)。语言的实现者不一定是语言的设计者,并且,针对某种语言可以有多种实现。语言的使用者在使用某个语言成分时,往往需要了解语言设计者提供该语言成分的初衷是什么(在什么情况下使用,主要用于解决什么问题)以及该语言成分的实现效率如何等问题。

3.程序语言的发展趋势

程序语言作为表达解题过程的工具,往往也规定了解决问题的方式。虽然高级语言比低级语言更容易描述解题过程,但从本质上讲,目前的高级语言大都只是在抽象级别上比低级语言略微高了一些,而仍然基于冯·诺依曼计算机的计算模型,采用这些语言还必须按照计算机解决问题的方式来描述解题过程,程序设计仍然非常困难。因此,人们还在努力设计出抽象级别更高的语言或让计算机能够理解自然语言,以便能够以更自然的方式来进行程序设计。