编译原理:编译过程和编译程序的结构
编译过程概述:
编译程序完成从源程序到⽬标程序的翻译⼯作,是⼀个复杂的整体的过程。从概念上来讲,⼀个编译程序的整个⼯作过程是划分成阶段进⾏的,每个阶段将源程序的⼀种表⽰形式转换成另⼀种表⽰形式,各个阶段进⾏的操作在逻辑上是紧密连接在⼀起的,典型的划分⽅法主要分为6个阶段、如下:
源程序 -> 词法分析 -> 语法分析 -> 语义分析 -> 中间代码⽣成 -> 代码优化 -> ⽬标代码⽣成 -> ⽬标程序
下⾯分别简单介绍⼀下6个阶段的任务
1、词法分析:
词法分析是编译过程的第⼀个阶段,这个阶段的任务是从左到右⼀个字符⼀个字符的读⼊源程序,对构成源程序的字符流进⾏扫描和分解,从⽽识别出⼀个个单词(⼀些场合下也称单词符号或符号)。这⾥所谓的单词是指逻辑上紧密相连的⼀组字符,这些字符具有集体含义。 在这个阶段,会将程序变成由标识符、保留字、算符、界符等组成的单词序列。并且⾃动把空格过滤掉。其中标识符会以id1、id2、
id3……这样的内部形式存在。
2、语法分析:
语法分析是编译过程的第⼆个阶段。语法分析的任务是在词法分析的基础上将单词序列分解成各类语法短语,如“程序”、“语句”、“表达式”等。这种语法短语也称为语法单位,可以表⽰成语法树
语法分析所依据的是语⾔的语法规则,即描述程序结构的规则。通过语法分析确定整个输⼊串是否构成⼀个语法上正确的程序。程序的结构通常是由递归规则表⽰的。
词法分析和语法分析本质上都是对源程序的结构进⾏分析。但词法分析的任务仅对源程序进⾏线性扫描即可完成,⽐如识别标识符,因为标识符的结构是字母打头的字母和数字串,这只要顺序扫描输⼊流,遇到既不是字母⼜不是数字的字符时,将前⾯所发现的所有字母和数字组合在⼀起构成标识符单词即可。但这种线性扫描不能⽤于递归定义的语法成分,⽐如不能⽤此办法去匹配表达式中的括号。
3、语义分析:
语义分析是审查源程序有⽆语义错误,为代码⽣成阶段收集类型信息。例如,语义分析的⼀个⼯作是进⾏类型审查,审查每个算符是否具有语⾔规范允许的运算对象,当不符合语⾔规范时,编译程序应报告错误。源程序是指什么程序
4、中间代码⽣成:
在进⾏了上述的语法分析和语义分析阶段的⼯作后,有的编译程序将源程序变成⼀种内部表⽰形式,这种内部表⽰形式叫做中间语⾔或中间代码。所谓“中间代码”是⼀种结构简单、含义明确的记号系统,这种记号系统可以设计为多种多样的形式,重要的设计原则为两点: (1)容易⽣成
(2)容易将它翻译成⽬标代码
很多编译程序采⽤了⼀种近似“三地址指令”的“四元式”中间代码,这种四元式形式为:
(运算符,运算对象1,运算对象2,结果)
5、代码优化:
这⼀阶段的任务是对前⼀阶段产⽣的中间代码进⾏变换或进⾏改造,⽬的是使⽣成的⽬标代码更为⾼效,即省时间和省空间。⼀系列的优化⼯作诸如公共⼦表达式的删除、强度削弱、循环优化等优化⼯作将会在后⾯的博客⾥详细介绍。
6、⽬标代码⽣成:
这⼀阶段的任务是把中间代码变换成特定机器上的绝对指令代码或可重定位的指令代码或汇编指令代码。这是编译的最后阶段,它的⼯作与硬件系统结构和指令含义有关,这个阶段的⼯作很复杂,涉及硬件系统功能部件的运⽤、机器指令的选择、各种数据类型变量的存储空间分配以及寄存器和后缓寄存器的调度等。
上述就是编译程序的⼏个⼯作阶段。但事实上并⾮所有的编译程序都分成这样⼏个阶段,有些编译程序并不需要⽣成中间代码,有些编译程序不进⾏优化,即优化阶段可省去,有些最简单的编译程序在语法分析的同时产⽣⽬标指令代码,如 PL/0 语⾔编译程序。不过多数实⽤的编译程序都包含上述⼏个阶段的⼯作。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论