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