1.1程序设计语言和编译程序
-
由于机器硬件只能识别机器语言,所以高级语言的执行需要通过编译、解释或者转换来实现。
-
编译程序(高级语言的翻译程序)输入源程序,输出目标程序(汇编语言程序、机器语言程序或是某种用户自定义的中间语言程序),分为两个阶段:编译阶段和执行阶段。
-
编译阶段:对整个源程序进行分析并翻译成等价的目标程序,同时做语法检查和语义检查,指出源程序的错误。
-
执行阶段:在运行子程序的支持下执行目标程序。运行子程序是为了支持目标程序的运行而开发的程序。
-
解释程序:一个一个语句地读入源程序,边翻译边执行,翻译过程不产生目标程序而是执行结果。
-
转换程序(不常用):假如已有L'语言的编译程序,若要实现L语言,则可以先将L语言编写的程序转换成等价L'语言的程序,再利用L'语言的编译程序实现L语言。
-
编译程序和解释程序的比较
-
不同点
-
编译程序是一个翻译系统,将源程序转换成目标程序;解释系统是一个执行系统,一边解释一遍执行,当翻译完成后也产生了执行结果。
-
编译程序得到的目标程序可以执行多次;而解释程序无法重复地使用先前的结果,需要重新解释执行。
-
解释程序相对于编译程序而言更易于人机交互。
-
解释程序相对于编译程序需要保存更多的信息、占用的空间内存更多。
-
相同点
-
实现技术相似。更多地使用编译方式,特定情况使用解释方式。
1.2编译程序的组成
-
编译程序一般要完成这些工作:词法分析、语法分析、语义分析、中间代码生成、中间代码优化、目标代码生产、表格管理和出错管理。
-
词法分析:扫描源程序的ASCII码序列,识别出单词(具有独立意义的最小语法单位,如关键字、标识符等),把每个单词的ASCII码序列替换为"TOKEN"形式(单词的内部表示,没有统一规定,依赖于具体语言和具体编译器及词法分析器的具体功能,一般包括单词属性标识和单词内码两部分)。除此之外还要检查括号类配对等词法错误并去除源程序的注释。词法分析不依赖于语言的语法定义。
-
语法分析:根据程序设计语言的语法规则,把词法分析的结果分解成各种语法单位,同时检查程序中的语法错误。
-
一种情况,将词法分析程序作为独立的一遍运行,扫描整个源程序的ASCII码序列并转换为TOKEN序列,输出到一个中间文件,该文件作为语法分析程序的扫描对象继续编译的过程。
-
更一般的情况,将词法分析程序设计成一个子程序,当语法程序需要读取单词时则调用该子程序。词法分析程序与语法分析程序处于同一遍,可省去中间文件。
-
语义分析:对语法分析所识别出的各类语法范畴分析其含义,并进行静态语义检查(如变量是否定义、类型是否匹配等)。依赖语言的语义规则,通常使用属性文法描述语义规则。
-
中间代码生成:中间代码即源程序在编译程序中的一种内部表现形式。便于移植、修改、优化。
-
常见的形式有后缀式(栈式)中间代码(最早但现在很少使用,多用后两种)、三地址中间代码(三元式和四元式)、图结构中间代码(树,DAG)。
-
中间代码优化:对前阶段产生的中间代码在不改变其语义的前提下进行加工变换,使生成的代码更为高效,缩短运行时间或节省存储空间。
-
主要的方式有常量表达式优化、公共子表达式优化、不变表达式的循环外提和削弱运算强度等。
-
目标代码生成:把中间代码变换成特定机器上的机器指令代码或汇编指令代码。因为目标语言的关系而特别依赖于硬件系统。
-
生成的如果是汇编指令代码,需经由汇编程序处理后才能执行;
-
如果是绝对指令代码,则可直接投入运行;
-
如果是可重定位的指令代码,那么目标代码只是一个代码模块,必须由连接装配程序将输入/输出模块、标准函数等系统模块与目标代码模块连接在一起才能形成一个绝对指令代码程序以供执行。(现在多用这种)
-
表格管理:编译程序在对源程序的分析过程中需要创建和管理一系列的表格,以登记源程序的各类信息和编译各阶段的进展情况。随着编译过程的进行,需要不断地建表、查表和填表,或修改表中的某些数据,或从表中查找相关信息,这些活动贯穿整个编译过程的始终。不少编译程序设立一些专门子程序(表格管理程序),以专门负责管理表格。
-
错误处理:错误包括词法错误、语法错误、静态语义错误、动态语义错误(只能在运行目标程序时才能发现)。编译程序的各个阶段都要有错误处理部分,词法及语法错误集中一次完成检查,语义检查分散在以后的各个阶段在完成别的工作时顺便完成。
-
一个好的编译程序应能最大限度地发现源程序中的各种错误,准确地指出错误的性质和发生错误的位置,并且能将错误所造成的影响在尽可能小的范围内,使得源程序的其余部分能继续被编译下去,以便进一步发现其他可能的错误。
-
遍:对源程序或源程序的中间表现形式从头到尾扫描一次,并做加工处理,生成新的中间结果或目标程序。
发表评论