高级语言程序的两种处理方式——编译和解释
编译方式
编译程序的功能就是把高级语言书写的源程序翻译成与之等价的目标程序(汇编语言或机器语言)。
编译程序的工作过程
词法分析
在词法分析阶段,源程序可以简单的看做是一个多行的字符串。词法分析阶段是编译过程的第一阶段,主要任务是对源程序从前到后(从左到右)逐个字符进行扫描,从中识别出一个个“单词”符号。词法分析程序输出的”单词“常采用二元组的方式,即单词类别和单词自身的值。词法分析过程依据的语言的此法规则,即描述“单词”结构的规则。
词法分析器一般来说有两种方法构造:手工构造和自动生成。手工构造可使用状态图进行工作,自动生成使用确定的有限自动机来实现。
词法分析器的功能输入源程序,按照构词规则分解成一系列单词符号。单词是语言中具有独立意义的最小单位,包括:
(1)关键字 是由程序语言定义的具有固定意义的标识符。
(2)标识符 用来表示各种名字,如变量名,数组名,过程名等等。
(3)常数 常数的类型一般有整型、实型、布尔型、文字型等。
(4)运算符 如+、-、*、/等等。
(5)界符 如逗号、分号、括号、等等。
语法分析
编译程序的语法分析器以单词符号作为输入,分析单词符号串是否形成符合语法规则的语法单位,如表达式、赋值、循环等,最后看是否构成一个符合各类语法的构成规则,按该语言使用的语法规则分析检查每条语句是否有正确的逻辑结构,程序是最终的一个语法单位。
语法分析的方法分为两种:自上而下分析法和自下而上分析法。自上而下就是从文法的开始符号出发,向下推导,推出句子。而自下而上分析法采用的是移进归约法,基本思想是:用一个寄存符号的先进后
出栈,把输入符号一个一个地移进栈里,当栈顶形成某个产生式的一个候选式时,即把栈顶的这一部分归约成该产生式的左邻符号。
语法分析只考虑构成该句子的语法单位是否符合语法规则。例如在分析除法表达式时在语法分析阶段只分析运算符左右两边是否为变量、常量、表达式等,而不去管除数是否为0。
语义分析
语义分析阶段主要是检查源程序是否存在语义错误,并收集类型信息供后面的代码生成阶段使用,只有语法和语义都正确的源程序才能翻译成正确的目标代码。语义分析的主要工作是进行各类型分析和检查。
比如语义分析的一个工作是进行类型审查,审查每个算符是否具有语言规范允许的运算对象,当不符合语言规范时,编译程序应报告错误。如有的编译程序要对实数用作数组下标的情况报告错误。再如分析除法表达式时在语义分析阶段就要分析该表达式的除数是否为零等。
在高级程序设计语言翻译中,语义分析阶段的工作不与目标机器的体系结构密切相关,而目标代码生成阶段的工作与目标机器的体系结构密切相关。
中间代码生成
中间代码生成阶段的工作是根据语义分析的输出生成中间代码。中间代码是一种简单且含义明确的记号系统,可以有若干种形式,常见的有逆波兰记号、四元式、三元式和树。他们的共同特征是代码的方式与具体的机器无关。中间语言的复杂性介于源程序语言和机器语言之间。中间代码实际上起一个编译器前段与后端分水岭的作用,目的是便于编译器的开发和移植和代码的优化。它既与机器指令的结构相近,又与具体的机器无关。并不是所有的编译程序都生成中间代码,一般快速编译程序直接生成目标代码,没有将中间代码翻译成目标代码的额外开销。
代码优化
代码优化是指对程序进行多种等价变换,使得从变换后的程序出发,能生成更有效的目标代码。所谓等价,是指不改变程序的运行结果。所谓有效,主要指目标代码运行时间较短,以及占用的存储空间较小。这种变换称为优化。
两类优化:一类是对语法分析后的中间代码进行优化,它不依赖于具体的计算机;另一类是在生成目标代码时进行的,它在很大程度上依赖于具体的计算机。对于前一类优化,根据它所涉及的程序范围可分为局部优化、循环优化和全局优化三个不同的级别。
目标代码生成
目标代码生成是编译的最后一个阶段。目标代码生成器把语法分析后或优化后的中间代码变换成目标代码。目标代码生成阶段的工作与目标机器的体系结构密切相关。目标代码有三种形式:
① 可以立即执行的机器语言代码,所有地址都重定位;
② 待装配的机器语言模块,当需要执行时,由连接装入程序把它们和某些运行程序连接起来,转换成能执行的机器语言代码;
③ 汇编语言代码,须经过汇编程序汇编后,成为可执行的机器语言代码。
目标代码生成阶段应考虑直接影响到目标代码速度的三个问题:一是如何生成较短的目标代码;二是如何充分利用计算机中的寄存器,减少目标代码访问存储单元的次数;三是如何充分利用计算机指令系统的特点,以提高目标代码的质量。
出错处理
用户编写的源程序不可避免的会有一些错误,这些错误大致可以分为静态错误和动态错误。动态错误也称动态语义错误,它们发生在程序运行时,例如除数为0、引用数组元素下标错误等。静态错误是之编译阶段发现的程序错误,可分为语法错误和静态语义错误,如单词拼写错误、标点符号错误、表达式缺少操作数、括号不匹配等有关语言结构上的错误称为语法错误,而语义分析时发现的运算符与运算对象不合法等错误属于静态语义错误。语义分析阶段主要检查源程序是否包含静态语义错误,而一般的编译器很难检查出动态语义错误。
解释方式
解释程序是另一种语言处理程序,在词法、语法和语义分析方面与编译程序的工作原理基本相同,但在运行时直接执行源程序或源程序的内部形式,即解释程序不产生源程序的目标程序,这点是它与编译程序的主要区别。
解释程序通常可以分为两部分:
第一部分是分析部分,包括通常的词法分析、语法分析和语义分析程序,经语义分析后把源程序翻译成中间代码,中间代码常用逆波兰式表示。
第二部分是解释部分,用来对第一部分产生的中间代码进行解释执行。
解释程序实现高级语言的三种方式
编译与解释的区别
编译和解释是语言处理的两种基本方式。编译过程包括词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成等阶段,以及符号表管理和出错处理模块。解释过程在词法、语法和语义分析方面与编译程序的工作原理基本相同,但是在运行用户程序时,它直接执行源程序或源程序的内部形式。
这两种语言处理程序的根本区别是:在编译方式下,机器上运行的是与源程序等价的目标程序,源程序和编译程序都不再参与目标程序的执行过程;而在解释方式下,解释程序和源程序(或其某种等价表示)要参与到程序的运行过程中,运行程序的控制权在解释程序。解释器翻译源程序时不产生独立的目标程序,而编译器则需将源程序翻译成独立的目标程序。