【1】源程序的编译运行过程呢如下图所示:
【2】细细划分的话,大概要分为以下八个部分:
-
扫描器工作任务:
A:识别出源程序的各个基本语法
B:删除无用的空白字符,回车字符,以及其他与输入介质相关的非实质性字符
C删除注释
D:进行词法检查,报告所发现的错误
-
词法分析程序:
扫描器对源程序进行处理之后程序里面的各个单词已经被一一识别出来了,并用一个特定的标志符号“#”将相邻的两个单词加以分隔,程序里非实质性符号已经被全部删除
eg:#integer#;#a#:#
-
语法分析程序:
输入:词法分析程序所输出的用内部编码格式标识的单词序列做输入
任务:分析源程序的结构,判断它是否为相应程序设计语言中的一个合法程序
一般途径:由语法分析程序试着为其构造一颗完整的语法树(构造成功则说明该输入串在程序上合乎语法,否则源程序必然存在语法错误)语法树实质上是一个有标记的树形结构(叶子标记程序中各个单词,内部节点(根节点)是程序设计语言的有关语法构造名(语法范畴))
-
语义分析程序:
规定各语法成分的含义和功能(规定它们的属性和执行时应进行的运算或操作)
中间代码的生成:为了处理上方便,特别是为了代码的优化处理,通常语义分析后不直接产生机器代码语言或汇编形式的目标代码,而是生成一种介于源语言和目标语言之间的中间语言代码(常见的有:逆波兰表示,三元式,四元式,树形结构等)
eg:a:=x+(y-2)DIV4;用逆波兰表示:‘a’'x''y''2''-''4''div''+'':='
-
代码优化程序:
(目标程序质量,衡量指标:空间指标,时间指标)
分类:计算机关系:机器无关的优化 机器有关的优化
与源程序的关系:局部优化和全局优化
弊端:增加编译程序本身的时空复杂度和可靠性为代价
-
目标代码生成程序:
以语义分析(或者优化处理)所产生的中间代码为输入
功能:根据前面各阶段对源程序进行分析和加工所得到的有关信息,将中间代码翻译成机器语言或者汇编语言形式的目标程序
包括:确定各种语法结构的目标代码结构(框架和其他形式和相关参数)
要求:所生成的目标代码有较高的效率(使所生成的代码尽可能短,充分发挥计算机可用资源的效率(如:用执行速度块的指令,节省访问内存的时间,充分利用计算机的寄存器))
特点:对计算机的依赖性很强
目标代码的形式:
(1)具有绝对地址的机器指令代码
(2)汇编语言形式的目标程序(必须经过汇编程序进行汇编,以产生相应的机器代码)
(3)模块结构的机器指令(浮动地址,须经连接程序将其和另外一些运行子程序连接装配之后才能运行)
-
错误检查和处理程序:
要求:具有广泛的程序查错能力,并能准确的报告源程序的错误种类和所出现的位置,同时编译程序也应该有一定的校错能力(生成另外的注释信息)
-
信息表管理程序:
收集,记录或查询源程序中所出现的各种量的有关属性信息,编译程序需要建立或持有一批不同用途的表格(符号表),信息表的工作就是在编译程序的有关部分完成造表和查表工作