语言处理程序
- 1、汇编程序
- 1.1 汇编语言
- 1.2 汇编程序
- 2、编译程序
- 2.1 编译过程
- 2.2 词法分析
- 2.3 语法分析
- 3、解释程序
语言处理程序是一类系统软件的总称,其主要作用是将高级语言或汇编语言编写的程序翻译成某种机器语言程序,使程序可在计算机上运行。语言处理程序主要有 汇编程序、编译程序和解释程序 3 种基本类型。
1、汇编程序
1.1 汇编语言
汇编语言:为特定计算机设计的面向机器的符号化程序设计语言。用汇编语言编写程序要遵循所用语言的规范和约定。
汇编语言源程序:用汇编语言编写的程序。汇编语言源程序由若干条语句组成,一个程序中可以有三类语句:指令语句、伪指令语句和宏指令语句。
- 指令语句:机器指令语句,将其汇编后能产生相应的机器代码,这些代码能被CPU直接识别并执行相应的操作。指令语句可分为传送指令、算术运算指令(ADD/SUB/AND)、逻辑运算指令、移位指令、转移指令和处理机控制指令等类型,指令书写时必须遵循相应的格式要求。
- 伪指令语句:伪指令语句指示汇编程序在汇编源程序时完成某些工作,例如给变量分配存储单元地址,给某个符号赋一个值等。伪指令语句与指令语句的区别是:伪指令语句经汇编后不产生机器代码,而指令语句经汇编后要产生相应的机器代码。另外,伪指令语句所指示的操作是在源程序被汇编时完成,而指令语句的操作必须是在程序运行时完成。
- 宏指令语句:在汇编语言中,还允许用户将多次重复使用的程序段定义为宏。宏的定义必须按照相应的规定进行,每个宏都有相应的宏名。在程序的任意位置,若需要使用这段程序,只要在相应的位置使用宏名,就相当于使用了这段程序。因此,宏指令语句就是宏的引用。
汇编程序:计算机不能直接识别和运行符号语言程序,要用专门的汇编程序进行翻译。
1.2 汇编程序
汇编程序的功能是将汇编语言所编写的源程序翻译成机器指令程序。
汇编程序的基本工作包括:将每一条可执行汇编语句转换成对应的机器指令;处理源程序中出现的伪指令和宏指令。
由于汇编指令中形成操作数地址的部分可能在后面才能确定,所以汇编程序一般需要扫描两次源程序才能完成翻译过程。
- 第一次扫描的主要工作时定义符号的值并创建一个符号表ST。
ST记录了汇编时所遇到的符号的名和值。MOT固定的机器指令表,其中记录了每条机器指令的记忆码和指令的长度。
LC:位置计数器或单元地址计数器。在汇编过程中,LC的内容就是下一条被汇编的指令的偏移地址。
POT1:伪指令表,伪指令表的每一个元素只有两个域:伪指令助记符和相应的子程序入口。
- 第二次扫描的任务是产生目标程序。
MOT2:机器指令表,该表中有机器指令助记符、机器指令的二进制操作码、格式和长度等。
POT2:伪指令表,供第二次扫描使用。伪指令表的每一个元素仍有两个域:伪指令助记符和相应的子程序入口。
在第二次扫描中,可执行汇编语言应被翻译成对应的二进制代码机器指令。两个方面工作:一是把机器指令助记符转换成二进制机器指令操作码,这可通过在 MOT2 中进行查找操作来实现;二是求出操作数区各操作数的值(用二进制表示)。
2、编译程序
2.1 编译过程
编译程序的功能是将某高级语言书写的源程序翻译成与之等价的目标程序(汇编语言程序或机器语言程序)。
- 词法分析
词法分析阶段是编译过程的第一阶段,这个阶段的任务是对源程序从前到后(从左到右)逐个字符地扫描,从中识别出一个个“单词”符号。源程序可以被看成是一个多行的字符串。“单词”符号是程序设计语言的基本语法单位,如关键字(或称保留字)、标识符、常数、运算符和分隔符(标点符号、左右括号)等。词法分析程序输出的“单词”常以二元组的方式输出,即单词种类和单词自身的值。 - 语法分析
语法分析的任务是在词法分析的基础上,根据语言的语法规则将单词符号序列分解成各类语法单位,如“表达式”“语句”“程序”等。
语法规则就是各类语法单位的构成规则。通过语法分析确定整个输入串是否构成一个语法上正确的程序。如果源程序中没有语法错误,语法分析后就能正确地构造出其语法树:否则就指出语法错误,并给出相应的诊断信息。(形成语法树)
词法分析和语法分析本质上都是对源程序的结构进行分析。 - 语义分析
语义分析阶段主要分析程序中各种语法结构的语义信息,包括检查源程序是否包含静态语义错误,并收集类型信息供后面的代码生成阶段使用。只有语法和语义都正确的源程序才能被翻译成正确的目标代码。
语义分析的一个主要工作是进行类型分析和检查。程序设计语言中的一个数据类型一般包含两个方面的内容:类型的载体及其上的运算。例如,整除取余运算符只能对整型数据进行运算,若其运算对象中有浮点数就认为是类型不匹配的错误。
在确定源程序的语法和语义后,就可对其进行翻译,同时改变源程序的内部表示。(数据类型转换,以及分配数据地址) - 中间代码生成
中间代码生成阶段的工作是根据语义分析的输出生成中间代码。(机器逐步执行代码)
“中间代码”是一种简单且含义明确的记号系统,可以有若干种形式,它们的共同特征是与具体的机器无关。
中间代码的设计原则主要有两点:一是容易生成,二是容易被翻译成目标代码。最常用的一种中间代码是与汇编语言的指令非常相似的三地址码,其实现方式常采用四元式。四元式的形式为:
运算符,运算对象1,运算对象2,运算结果 - 代码优化
由于编译器将源程序翻译成中间代码的工作是机械的、按固定模式进行的,因此,生成的中间代码往往在计算时间上和存储空间上有很大的浪费。当需要生成高效的目标代码时,就必须进行优化。
优化原则:等价交换原则。可以在中间代码生成阶段完成,也可以在目标代码生成阶段完成。将赋值、转换等一些中间代码生成过程简化。 - 目标代码生成
目标代码生成是编译器工作的最后一个阶段。这一阶段的任务是把中间代码变换成特定机器上的绝对指令代码、可重定位的指令代码或汇编指令代码,这个阶段的工作与具体的机器密切相关。 - 符号表管理
符号表的作用是记录源程序中各个符号的必要信息,以辅助语义的正确性检查和代码生成,在编译过程中需要对符号表进行快速有效地查找、插入、修改和删除等操作。符号表的建立可以始于词法分析阶段,也可以放到语法分析和语义分析阶段,但符号表的使用有时会延续到目标代码的运行阶段。 - 出错处理
错误类型:静态错误(编译时发现的程序错误)和动态错误(动态语义错误,发生在程序运行时)。
编译的过程根据中间代码生成为分水岭,分为前端和后端两部分。前端包括从词法分析到中间代码生成各阶段的工作,后端包括中间代码优化和目标代码的生成及优化等阶段。前端与语言有关,后端与机器有关。
2.2 词法分析
词法分析过程的本质是对构成源程序的字符串进行分析,是一种对象为字符串的运算。语言中具有独立含义的最小语法单位是符号(单词),如标识符、无符号常数与界限符等。词法分析的任务是把构成源程序的字符串转换成单词符号序列。
- 字母表、字符串、字符串集合及运算;
- 正规表达式和正规集
- 有限自动机:确定的有限自动机和不确定的有限自动机。是一种识别装置的抽象概念,它能准确地识别正规集。
词法分析器的任务是把构成源程序的字符流翻译成单词符号序列。手工构造词法分析器的方法是先用正规式描述语言规定的单词符号,然后构造相应有限自动机的状态转换图,最后依据状态转换图编写词法分析器(程序)。
2.3 语法分析
词法分析器的任务是把构成源程序的字符流翻译成单词符号序列。手工构造词法分析器的方法是先用正规式描述语言规定的单词符号,然后构造相应有限自动机的状态转换图,最后依据状态转换图编写词法分析器(程序)。
程序设计语言的语法常采用上下文无关文法描述。
3、解释程序
解释程序是另一种语言处理程序,在词法、语法和语义分析方面与编译程序的工作原理基本相同,但是在运行用户程序时,它直接执行源程序或源程序的内部形式。因此,解释程序不产生源程序的目标程序,这是它和编译程序的主要区别。
解释方式实现高级语言的3中方式:
解释程序的基本结构:
- 分析部分:包括与编译过程相同的词法分析、语法分析和语义分析程序,经语义分析后把源程序翻译成中间代码,中间代码常采用逆波兰表示形式。
- 解释部分:用来对第一部分产生的中间代码进行解释执行。
高级语言的编译和解释方式比较:
- 效率。编译比解释方式可能取得更高的效率。
- 灵活性。由于解释程序需要反复检查源程序,这也使得解释方式能够比编译方式更灵活。当解释器直接运行源程序时,“在运行中”修改程序就成为可能,如增加语句或者修改错误等。另外,当解释器直接在源程序上工作时,它可以对错误进行更精确地定位。
- 可移植性。源程序是由解释器控制来运行的,可以提前将解释器安装在不同的机器上,从而使得在新环境下无须修改源程序使之运行。而编译方式下则需要针对新机器重新生成源程序的目标代码才能运行。