文档介绍:第1章引言
从面向机器的语言到面向人类的语言
语言之间的翻译
编译器与解释器
编译器的工作原理与基本组成
编译器的编写
本章小结
从面向机器的语言到面向人类的语言
计算机的硬件只能识别由0、1字符串组成的机器指令序列,即机器指令程序。在计算机刚刚问世的年代,人们只能向计算机输入机器指令程序来指挥它进行简单的数学计算。机器指令程序是最基本的计算机语言。由于机器指令程序不易理解,用它编写程序既困难又容易出错,于是人们就用容易记忆的符号来代替0、1字符串。用符号表示的指令被称为汇编指令,汇编指令的集合被称为汇编语言,由汇编语言编写的指令序列被称为汇编语言程序。虽然汇编指令比机器指令在阅读和理解上有了长足进步,但是二者之间并无本质区别,它们均要求程序设计人员根据指令工作的方式思考、解决问题。因此,人们称这类语言为面向机器的语言或低级语言。
随着计算机应用需求的不断增长,人们希望能有功能更强、抽象级别更高的语言来支持程序设计,于是就产生了面向各类应用的程序设计语言。这些语言的共同特征是便于人类的理解与使用,因此被称为面向人类的语言或高级语言。。
面向机器和面向人类语言举例
分类
语言表现形式举例
面向机器
机器指令
0000 0011 1111 0000
汇编指令
add si, ax
面向人类
通用程序设计语言
x := a + b; sort(list); if c then a else b;
数据查询语言
select id_no, name from student_table;
形式化描述语言
E : E '+'E | E '*'E | id;
通用程序设计语言是继汇编语言之后发展起来的应用最广的一类语言,如人们常用的FORTRAN、Pascal、C/C++、Ada83/Ada95、Java等语言。这类语言的特征是:语言结构符合人类的思维特征,如直接使用表达式进行数学运算;具有很高抽象程度,如引入过程与类等机制;程序设计中强调逻辑过程,即程序员要考虑事情的前因后果,不但要设计做什么,还要考虑怎么做,如条件或循环的判断等。
与通用程序设计语言相比,数据查询语言的抽象程度更高,它只要求程序员具有清晰的逻辑思维能力,设计好做什么,而忽略怎么做这样的实现细节,从而使得对大量复杂数据的处理变得轻松简单。
的语言。这类语言的核心部分是基于数学基础的产生式,设计人员只需利用产生式描述语言结构的文法,就可以构造出识别该语言结构的识别器。
随着计算机应用领域的不断拓展,先后出现了多种面向特定应用领域的高级语言,如面向互联网应用的HTML、XML,面向计算机辅助设计的MATLAB,面向集成电路设计的VHDL、Verilog,面向虚拟现实的VRML等等。这些形形色色、多不胜数的计算机语言推动了计算机应用的飞速发展,使得计算机成为人类生活中不可缺少的重要部分。
语言之间的翻译
尽管人类可以借助高级语言与计算机进行交往,但是计算机硬件真正能够识别的语言只是0、1组成的机器指令序列,这就需要在高级语言和机器语言之间建立若干桥梁,将高级语言逐步过渡到机器语言。换句话说,我们需要若干“翻译”,把人类懂的高级语言翻译成计算机懂的机器语言。由于应用的不同,语言之间的翻译是多种多样的。。,语言分为三个层次:高级语言、汇编语言、机器语言。虽然汇编语言和机器语言同属于低级语言,但是由于从汇编语言到可直接执行的机器指令之间也需要一层翻译,所以把它们分为不同的层次。设分别有两个高级语言L1和L2,两个汇编语言A1和A2,以及两个机器语言M1和M2。
高级语言之间的翻译,一般被称为转换,如FORTRAN到Ada的转换等,或者被称为预处理,如SQL到C/C++的预处理等。高级语言可以直接翻译成机器语言,也可以翻译成汇编语言,这两个翻译过程被称为编译。从汇编语言到机器语言的翻译被称为汇编。高级语言是与具体计算机无关的,而汇编语言和机器语言均是与计算机有关的,因此,若将一个汇编语言汇编为可在另一机器上运行的机器指令,则称为交叉汇编,而建立在交叉汇编基础之上的编译模式,如首先将L2编译成A2,再将A2汇编为M1,有时也被称为交叉编译。上述这些翻译模式一般被认为是正向工程。在一些特定情况下需要逆向工程,如把机器语言翻译成汇编语言,或者把汇编语言翻译成高级语言,分别称它们为反汇编和反编译。值得一提的是,反编译是一件十分困难的事情。承担这些语言之间翻译任务的