1.1.3 程序设计语言
利用计算机解决实际问题,一般要编制程序。程序设计语言就是程序员用来编写程序的语言,它是人与计算机之间交流的工具。程序设计语言可以分为机器语言、汇编语言和高级语言。
1.机器语言
计算机能够直接识别的是由二进制数0和1组成的代码。机器指令(Instruction)就是用二进制编码的指令,指令是控制计算机操作的命令,是处理器不需要翻译就能识别(直接执行)的“母语”,通常一条机器指令控制计算机完成一个操作。每种处理器都有各自的机器指令,某处理器支持的所有指令的集合就是该处理器的指令集(Instruction Set)或指令系统。指令集及使用它们编写程序的规则被称作机器语言(Machine Language)。
用机器语言形成的程序是计算机唯一能够直接识别、并执行的程序,而用其他语言编写的程序必须经过翻译、变换成机器语言程序;所以,机器语言程序常称为目标程序(或目的程序)。
例如,完成两个数据100和256相加的功能,在8086处理器的二进制代码序列如下:
10111000 01100100 00000000 00000101 00000000 00000001
几乎没有人能够直接读懂该程序段的功能,因为机器语言就是看起来毫无意义的一串代码。用机器语言编写程序的最大缺点是难以理解,因而极易出错,也难以发现错误。所以,只是在计算机发展的早期或不得已的情况下,才采用机器语言编写程序。现在,除了有时在程序某处需要直接采用机器指令填充外,几乎没有人采用机器语言编写程序了。
二进制虽然只有0和1两个数码,但表达信息时会很长。为了简化表达,常用到十六进制。因为一个十六进制位就可以表达4位二进制数,并且易于相互转换,即二进制数0000、0001、0010、……、1001、1010、1011、1100、1110、1111用十六进制表达依次是0、1、2、……、9、A、B、C、D、E、F,其中 A~F 依次表示十进制 10~15。这样,上述二进制代码序列用十六进制代码表示为:
B8 64 00 05 00 01
汇编语言中,习惯使用后缀字母区别不同进制的数据。例如,使用字母B(或小写字母形式b,来自二进制的英文单词Binary)表示二进制数,使用字母H(或小写字母形式h,来自十六进制的英文单词Hexadecimal)表示十六进制数,而十进制数通常不需要特别说明(或者用后缀字母D或d,以示强调)。另外,涉及计算机硬件原理的技术文献中,所谓的“位”常指二进制位,也会表示十六进制位、或者十进制位,根据上下文予以分辨,否则可能产生误解。
2.汇编语言
为了克服机器语言的缺点,人们采用便于记忆并能描述指令功能的符号来表示机器指令。表示指令功能的符号称为指令助记符,或简称助记符(Mnemonic);助记符一般采用表明指令功能的英语单词或其缩写。指令操作数同样也可以用易于记忆的符号表示。用助记符表示的指令就是汇编格式指令。汇编格式指令以及使用它们编写程序的规则形成汇编语言(Assembly Language)。用汇编语言书写的程序就是汇编语言程序,或称汇编语言源程序。
例如,实现100与256相加的MASM汇编语言程序片段如下:
mov ax,100 add ax,256
第一条指令的功能将数据100传送给名为AX的寄存器,MOV是传送指令的助记符,实现赋值功能。该指令对应的机器代码就是机器语言举例的第一个二进制串。
第二条指令实现加法操作,ADD是加法指令的助记符,对应机器语言举例的第二个二进制串。
如果熟悉有关助记符及对应指令的功能,就可以读懂上述程序片段了。
汇编语言是一种符号语言,它用助记符表示操作码,比机器语言容易理解和掌握、也容易调试和维护。但是,汇编语言源程序要翻译成机器语言程序才可以由处理器执行。这个翻译的过程称为“汇编”,完成汇编工作的程序就是汇编程序(Assembler)。
3.高级语言
汇编语言虽然较机器语言直观一些,但仍然烦琐难记。于是在20世纪50年代,人们研制出了高级程序设计语言(High Level Language)。高级语言比较接近于人类自然语言的语法习惯及数学表达形式,它与具体的计算机硬件无关,更容易被广大计算机工作者掌握和使用。利用高级语言,即使一般的计算机用户也可以编写程序,而不必懂得计算机的结构和工作原理。
目前,计算机高级语言已有上百种之多,得到广泛应用的有十几种,每种高级语言都有其最适用的领域。用任何一种高级语言编写的程序都要通过编译程序(Compiler)翻译成机器语言程序(称为目标程序)后计算机才能执行,或者通过解释程序边解释边执行。
例如,用高级语言表达100与256相加,就是通常的数学表达形式:100 + 256。
4.学习汇编语言的意义
高级语言简单、易用,而汇编语言复杂、难懂,是否就没有必要再采用汇编语言了呢?
让我们首先列表1-1简单比较一下汇编语言和高级语言的特点。
表1-1 汇编语言和高级语言的对比
通过对比,高级语言的优势明显。很自然地人们称机器语言和汇编语言为低级语言。但事实上,汇编语言被称为低层语言(Low Level Language)更合适。因为,程序设计语言是按照计算机系统的层次结构区分的,本没有“高低贵贱”之分,只是某种语言更适合某种应用层面(或说场合)而已。我们看到,汇编语言便于直接控制计算机硬件电路,可以编写在“时间”和“空间”两方面最有效,即执行速度快和目标代码小的程序。这些优点使得汇编语言在程序设计中占有重要的位置,是不可被取代的。下面罗列了汇编语言的主要应用场合:
⊙ 程序要具有较快的执行时间,或者只能占用较小的存储容量。例如,操作系统的核心程序段,实时控制系统的软件,智能仪器仪表的控制程序等。
⊙ 程序与计算机硬件密切相关,程序要直接、有效地控制硬件。例如,I/O接口电路的初始化程序段,外部设备的低层驱动程序等。
⊙ 大型软件需要提高性能、优化处理的部分。例如,计算机系统频繁调用的子程序、动态连接库等。
⊙ 没有合适的高级语言、或只能采用汇编语言的时候。例如,开发最新的处理器程序时,暂时没有支持新指令的编译程序。
⊙ 许多实际应用的情况,例如分析具体系统尤其是该系统的低层软件、加密解密软件、分析和防治计算机病毒等。
当然,无须回避的事实是,随着各种编程技术的发展,单独使用汇编语言开发程序、尤其是应用程序的情况越来越少。所以,在实际的程序开发过程中,可以采用高级语言和汇编语言混合编程的方法,互相取长补短,更好地解决实际问题。
另外,编写汇编语言程序,需要使用处理器指令解决应用问题,而指令只是完成诸如将一个数据从存储器传送到寄存器、对两个寄存器值求和、指针增量指向下一个地址等简单的功能。所以,从教学角度来说,汇编语言程序员在将复杂的应用问题翻译成简单指令的过程中,就是从处理器角度解决问题,自然就容易理解计算机的工作原理了。