1.3 程序设计语言
1.3.1 程序设计语言分类
1. 机器语言
计算机能够直接识别的程序设计语言为机器语言,一条机器指令是由一个或多个字节组成的二进制编码。指令中一般包括操作码和地址码,操作码用于指示该指令的性质,如加法、减法等;地址码用于指示该指令操作的对象,如减法指令需要告诉CPU被减数与减数在内存的位置,这样CPU才能从指定的内存中读取数据并进行相应的计算。
每一种CPU都具有自己特定的机器语言,例如,在8086/8088CPU中机器指令:
10111000 0000000 0001000
表示将十六进制数1000H存入CPU内部的名为AX的寄存器。
00000001 11011000
表示将寄存器AX与寄存器BX中的内容相加,结果存回AX。
用机器指令编写的程序可以直接被机器执行,但用机器语言编写程序很烦琐,程序冗长,而且还特别容易出错。此外,由于它与机器硬件密切相关,所以用机器语言编写的程序不能在异种机型间移植。
2. 汇编语言
“汇编语言”用指令助记符来代替机器指令中的操作码与操作数。例如,前面两条机器指令用汇编语言可以写成:
MOV AX,1000H (表示将十六进制数1000H存入寄存器AX) ADD AX,BX (表示将AX内容与BX内容相加,结果仍存回AX寄存器)
显然,用汇编语言来书写程序比直接用机器语言书写程序具有更高的效率,且较机器语言易懂、易查错。但它仍是一种面向机器的低级语言,不能直接移植到不同类型的机器上。
汇编语言程序需要变换成机器语言程序才能在机器上执行,这项工作可以由一个称为“汇编程序”的专门程序来完成,将汇编语言程序转换成机器语言程序的过程就称为“汇编”。
目前,在涉及机器硬件控制、嵌入式系统开发等领域还常用汇编语言来进行编程。
3. 高级语言
机器语言与汇编语言由于面向机器底层编程,与计算机硬件的距离级别比较低,通常被统称为“低级语言”。人们总是希望程序设计语言尽可能方便使用,便于记忆。为此,许多计算机科技工作者不断努力,设计出了一些区别于“低级语言”的新型程序设计语言,这些程序设计语言具有更精练的表达能力,更接近人们日常生活中使用的语言,这些语言后来被统称为高级语言。历史上出现过的计算机语言有2000多种,其中绝大部分都是高级语言。
例如,C语言和Java语言分别用语句:
printf("%d",1 + 2); System.out.print(1 + 2);
来输出1加2的和,显然,高级语言书写程序比低级语言更易懂、更易学。
高级语言门类繁多,各种语言在不同的历史时期和应用领域发挥了不同的作用,有些昙花一现,有些语言却像一棵长青树,枝繁叶茂。
许多流行的程序设计语言都与C语言有密切联系。C++、C#、Java等都是在C语言的基础上发展起来的。随着计算机应用领域的拓展,标准C语言已在窗体程序设计、面向对象程序设计等方面失去优势,这才有了C++、C#、Java等语言的产生和发展。本书选择C语言作为高级语言程序设计的教学语言,是因其简单、精炼,易于描述与实现结构化程序,特别适合初学者。学习者可在快速掌握C语言基本语法的基础上将更多的学习精力放在程序设计方法的学习上,培养计算思维能力。通过扎实掌握C语言程序设计方法,可以触类旁通,为快速学习其他程序设计语言和今后从事软件开发相关工作奠定良好的基础。
1.3.2 程序的执行方式
高级语言虽然表达简单,但高级语言程序不能被计算机直接执行,必须将它转换成机器语言程序才可以执行,完成这转换工作的程序称为“编译程序”,转换的过程即称为“编译(Compile)”。编译后产生的目标文件还需要与其他辅助的库代码进行链接(Link),生成最后的可执行文件,该文件就可以在机器上运行。编译链接示意图如图1-5所示。由于不同的语言有不同的表达方式,所以每一种程序设计语言都对应相应的编译程序。C语言是典型的编译型程序设计语言。
图1-5 编译链接工作方式示意图
而有些高级语言如Basic、JavaScript等语言采用“解释”方式来执行程序,这种方式由一种称为“解释器”的软件来实现。解释器并不将源程序整体翻译成为目标代码,而是解释一句执行一句。解释器的工作方式如图1-6所示。
图1-6 解释型工作方式示意图
还有一些编程语言采用编译和解释相结合的方式执行,这种方式当前非常流行,又称虚拟机工作方式,如图1-7所示。Java、Python、Perl等编程语言都采用这种方式。以Java为例,程序员编写的源代码(.java文件)首先被编译成字节码(.class文件),字节码是Java虚拟机的指令而非机器指令,所以它是与平台无关的,它由运行于特定操作系统上的Java虚拟机来解释执行。这样,Java只要针对不同的操作系统提供相应的Java虚拟机,就可以做到Java程序一经书写,到处运行。
图1-7 虚拟机工作方式示意图