




已阅读5页,还剩5页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
附 1成绩: 毕业设计 (论文)文献综述 院 (系) :信息与控制工程学院 专业班级: 计算机 0801 毕业设计 论文方向 : 综述题目: 基于 Java 的小型编译器前端的设计与开发文献综述 信息与控制工程学院毕业设计(论文)文献综述 基于 Java 的小型编译器前端的设计与开发文献综述 摘要: 21 世纪是电脑发展的时代,从事软件开发的人越来越多,使用的开发软件和 开发环境也不尽相同,但是不论是哪种开发环境,都少不了使用编译器。包括常 用的 C 语言。 编译器(Compiler),是一种电脑程式,它会将用某种编程语言写成的源代 码(原始语言),转换成另一种编程语言(目标语言)。它主要的目的是将便于 人编写,阅读,维护的高级计算机语言所写作的源代码程式,翻译为计算机能解 读、运行的低阶机器语言的程序,也就是执行档。编译器将原始程序( Source program)作为输入,翻译产生使用目标语言(Target language)的等价程序 一个现代编译器的主要工作流程:源代码(source code) 预处理器 (preprocessor) 编译器 (compiler) 汇编程序 (assembler) 目标代 码 (object code) 链接器 (Linker) 可执行程序 (executables)。低阶 机器语言是计算机能直接解读、运行的。编译器将源程序作为输入,翻译 产生使用目标语言的等价程序。源代码一般为高级语言, 如 Pascal 、C、 C+、C#、Java 等,而目标语言则是汇编语言或目标机器的目标代码,有时 也称作机器代码 。 论文首先论述编译器的 发展历程开发背景和研究的目的与意义,然后对本 次编译器前端设计进行简单介绍,同时阐述该编译器所具有的的功能,以及实现 所用的工具和参考的资料 关键词:编译器,源代码,目标代码 1.1. 前言前言 编译程序是现代计算机系统的基本组成部分之一。 编译程序一般由词法分析 程序、语法分析程序、语义分析程序、中间代码生成程序、目标代码生成程序、 代码优化程序、表格管理程序和出错处理程序等成分构成。 在编译原理的教学过程中,语法和语义分析阶段关于算法的讲解都需要对算法进 行详细的分析,包括算法条件的判断,文法分析表的构造过程,文法分析表的具 体生成, 针对文法的句子的分析过程等。 这些过程往往需要占用大量时间来分析、 制表等。 信息与控制工程学院毕业设计(论文)文献综述 2 2C C 语言编译器的发展历程语言编译器的发展历程 C 语言是在 70 年代初问世的。一九七八年由美国电话电报公司(AT”前端语法分析器 看到的是“a, =, b , +, c;”,语意分析器按定义的语法,先把 他们组装成表达式“b + c”,再组装成“a = b + c”的语句。前端 还负责语义( semantic checking )的检查,例如检测参与运算的变量 是否是同一类型的, 简单的错误处理。 最终的结果常常是一个抽象的语 法树( abstract syntax tree ,或 AST) ,最后通过中间代码生成器将 语法分析树,转化为三地址代码,这样后端可以在此基础上进一步优化, 处理。 编译器翻译程序步骤 编译器内部包括了许多步骤或称为阶段(phase),它们执行不同的逻辑操 作。 将这些阶段设想为编译器中一个个单独的片断是很有用的,尽管在应用中它 们是经常组合在一起的,但它们确实是作为单独的代码操作来编写的。图 1 - 1 是编译器中的阶段和与以下阶段(文字表、符号表和错误处理器)或其中的一部 分交互的 3 个辅助部件。 这里只是简要地描述一下每个阶段,今后大家还会更详 细地学到它们(文字表和符号表在 1 . 4 节中,错误处理器在 1 . 5 节)。 (1) 扫描程序(scanner) 在这个阶段编译器实际阅读源程序(通常以字符流的形式表示)。扫描程 序执行词法分析(Lexical analysis):它将字符序列收集到称作记号(token) 的有意义单元中,记号同自然语言,如英语中的字词相似。因此可以认为扫描程 序执行与拼写相似的任务。 例如在下面的代码行 (它可以是 C 程序的一部分) 中: a index = 4 + 2 这个代码包括了 1 2 个非空字符,但只有 8 个记号: a 标识符 左括号 i n d e x 标识符 右括号 = 赋值 4 数字 + 加号 2 数字 每一个记号均由一个或多个字符组成, 在进一步处理之前它已被收集在一个单元 中。扫描程序还可完成与识别记号一起执行的其他操作。例如,它可将标识符输 入到符号表中,将文字(literal)输入到文字表中(文字包括诸如3.14159265 35 的数字常量,以及诸如“ Hello ,world!”的引用字符串)。 (2) 语法分析程序(parser) 语法分析程序从扫描程序中获取记号形式的源代码,并完成定义程序结构的 语法分析(syntax analysis),这与自然语言中句子的语法分析类似。语法分 析定义了程序的结构元素及其关系。通常将语法分析的结果表示为分析树 ( parse tree)或语法树(syntax tree)。例如,还是那行 C 代码,它表示一 个称为表达式的结构元素,该表达式是一个由左边为下标表达式、右边为整型表 达式的赋值表达式组成。这个结构可按下面的形式表示为一个分析树: 信息与控制工程学院毕业设计(论文)文献综述 图 2 请注意,分析树的内部节点均由其表示的结构名标示出,而分析树的叶子则 表示输入中的 记号序列(结构名以不同字体表示以示与记号的区别)。分析树对于显示程序的 语法或程序元素很有帮助,但是对于表示该结构却显得力不从心了。分析程序更 趋向于生成语法树,语法树是分析树中所含信息的浓缩(有时因为语法树表示从 分析树中的进一步抽取, 所以也被称为抽象的语法树 ( abstract syntax tree) ) 。 下面是一个 C 赋值语句的抽象语法树的例子: 图 3 请注意,在语法树中,许多节点(包括记号节点在内)已经消失。例如,如果知 道表达式是一个下标运算,则不再需要用括号“ ”和“”来表示该操作是在 原始输入中。 (3) 语义分析程序(semantic analyzer) 程序的语义就是它的“意思”,它与语法或结构不同。程序的语义确定程序 的运行, 但是大多数的程序设计语言都具有在执行之前被确定而不易由语法表示 和由分析程序分析的特征。这些特征被称作静态语义( static semantic),而 语义分析程序的任务就是分析这样的语义(程序的“动态”语义具有只有在程序 执行时才能确定的特性,由于编译器不能执行程序,所以它不能由编译器来确 信息与控制工程学院毕业设计(论文)文献综述 定)。一般的程序设计语言的典型静态语义包括声明和类型检查。由语义分析程 序计算的额外信息(诸如数据类型)被称为属性(attribute),它们通常是作 为注释或“装饰”增加到树中(还可将属性添加到符号表中)。在正运行的C 表达式 a index = 4 + 2 中,该行分析之前收集的典型类型信息可能是: a 是一个整型值的数组, 它带有来自整型子范围的下标; index 则是一个整型变量。 接着, 语义分析程序将用所有的子表达式类型来标注语法树,并检查赋值是否使 这些类型有意义了,如若没有,则声明一个类型匹配错误。在上例中,所有的类 型均有意义,有关语法树的语义分析结果可用以下注释了的树来表示: 图 4 (4) 源代码优化程序(source code optimizer) 编译器通常包括许多代码改进或优化步骤。 绝大多数最早的优化步骤是在语 义分析之后完成的,而此时代码改进可能只依赖于源代码。这种可能性是通过将 这一操作提供为编译过程中的单独阶段指出的。 每个编译器不论在已完成的优化 种类方面还是在优化阶段的定位中都有很大的差异。在上例中,我们包括了一个 源代码层次的优化机会, 也就是: 表达式 4 + 2 可由编译器计算先得到结果 6 (这 种优化称为常量合并(constant folding)。当然,还会有更复杂的情况。还 是在上例中, 通过将根节点右面的子树合并为它的常量值,这个优化就可以直接 在(注释)语法树上完成: 图 5 尽管许多优化可以直接在树上完成,但是在很多情况下,优化接近于汇编代码线 性 化 形式 的树 更为 简 便 。 这样 节 点 的 变形 有许 多 ,但 是三 元 式代 码 ( three-address code) (之所以这样称呼是因为它在存储器中包含了 3 个 (或 3 个以上)位置的地址)却是标准选择。另一个常见的选择是 P -代码(P - cod e),它常用于Pascal 编译器中。在前面的例子中,原先的C 表达式的三元式代 码应是: 信息与控制工程学院毕业设计(论文)文献综述 t = 4 + 2 a index = t (请注意,这里利用了一个额外的临时变量 t 存放加法的中间值)。这样,优 化程序就将这个代码改进为两步。首先计算加法的结果: t = 6 a index = t 接着,将 t 替换为该值以得到三元语句 a index = 6 图 1 - 1 已经指出源代码优化程序可能通过将其输出称为中间代码 ( intermediate code)来使用三元式代码。中间代码一直是指一种位于源代码 和目标代码(例如三元式代码或类似的线性表示)之间的代码表示形式。但是, 我们可以更概括地认为它是编译器使用的源代码的任何一个内部表示。此时,也 可将语法树称作中间代码, 源代码优化程序则确实能继续在其输出中使用这个表 示。 有时, 这个中间代码也称作中间表示 ( intermediate representation, I R) 。 (5) 代码生成器(code generator) 代码生成器得到中间代码( I R),并生成目标机器的代码。尽管大多数编 译器直接生成目标代码,但是为了便于理解,本书用汇编语言来编写目标代码。 正是在编译的这个阶段中,目标机器的特性成为了主要因素。当它存在于目标机 器时,使用指令不仅是必须的而且数据的形式表示也起着重要的作用。例如,整 型数据类型的变量和浮点数据类型的变量在存储器中所占的字节数或字数也很 重要。在上面的示例中,现在必须决定怎样存储整型数来为数组索引生成代码。 例如,下面是所 给表达式的一个可能的样本代码序列(在假设的汇编语言中): MOV R0, index ; value of index - R0 MUL R0, 2 ; double value in R0 MOV R1, ; address of a - R1 ADD R1, R0 ; add R0 to R1 MOV *R1, 6 ; constant 6 - address in R1 在以上代码中,为编址模式使用了一个类似 C 的协定,因此; value of index - R0 SHL R0 ; double value in R0 MOV ; constant 6 - address a + R0 到这里, 对编译器阶段的简要描述就结束了,但我们还应特别强调这些讲述仅仅 是示意性的, 也无需表示出正在工作中的编译器的实际结构。编译器在其结构细 信息与控制工程学院毕业设计(论文)文献综述 节上确实差别很大,然而, 上面讲到的阶段总会出现在几乎所有的编译器的某个 形式上。我们还谈到了用于维持每一个阶段所需信息的数据结构,例如语法树、 中间代码(假设它们并不相同)、文字表和符号表。下一节是编译器中的主要数 据结构的概览。 编译器中的主要数据结构 当然, 由编译器的阶段使用的算法与支持这些阶段的数据结构之间的交互是非常 强大的。 编译器的编写者尽可能有效实施这些方法且不引起复杂性。理想的情况 是:与程序大小成线性比例的时间内编译器,换言之就是,在 0 ( n)时间内, n 是程序大小的度量(通常是字符数)。本节将讲述一些主要的数据结构,它们是 其操作部分阶段所需要的,并用来在阶段中交流信息。 (1)(1) 记号(记号(t o k e nt o k e n) 当扫描程序将字符收集到一个记号中时,它通常是以符号表示这个记号;这 也就是说, 作为一个枚举数据类型的值来表示源程序的记号集。有时还必须保留 字符串本身或由此派生出的其他信息(例如:与标识符记号相关的名字或数字记 号值)。在大多数语言中,扫描程序一次只需要生成一个记号(这称为单符号先 行( single symbol lookahead)。在这种情况下,可以用全程变量放置记号 信息;而在别的情况(最为明显的是F O RT R A N )下,则可能会需要一个记号 数组。 (2)(2) 语法树(语法树(syntax tre esyntax tre e) 如果分析程序确实生成了语法树, 它的构造通常为基于指针的标准结构,在 进行分析时动态分配该结构,则整棵树可作为一个指向根节点的单个变量保存。 结构中的每一个节点都是一个记录, 它的域表示由分析程序和之后的语义分析程 序收集的信息。 例如, 一个表达式的数据类型可作为表达式的语法树节点中的域。 有时为了节省空间,这些域也是动态分配或存放在诸如符号表的其他数据结构 中,这样就可以有选择地进行分配和释放。实际上,根据它所表示的语言结构的 类型(例如:表达式节点对于语句节点或声明节点都有不同的要求),每一个语 法 树节点本身都可能要求存储不同的属性。在这种情况下,可由不同的记录表示语 法树中的每个节点,每个节点类型只包含与本身相关的信息。 (3)(3) 符号表(符号表(symbol tablesymbol table) 这个数据结构中的信息与标识符有关:函数、变量、常量以及数据类型。 符号表几乎与编译器的所有阶段交互:扫描程序、分析程序或将标识符输入到表 格中的语义分析程序;语义分析程序将增加数据类型和其他信息;优化阶段和代 码生成阶段也将利用由符号表提供的信息选出恰当的代码。 因为对符号表的访问 如此频繁,所以插入、删除和访问操作都必须比常规操作更有效。尽管可以使用 各种树的结构, 但杂凑表却是达到这一要求的标准数据结构。有时在一个列表或 栈中可使用若干个表格。 (4)(4) 常数表(常数表(literal tableliteral table) 常数表的功能是存放在程序中用到的常量和字符串, 因此快速插入和查找在 常数表中也十分重要。但是,在其中却无需删除,这是因为它的数据全程应用于 程序而且常量或字符串在该表中只出现一次。通过允许重复使用常量和字符串, 常数表对于缩小程序在存储器中的大小显得非常重要。 在代码生成器中也需要常 数表来构造用于常数和在目标代码文件中输入数据定义的符号地址。 信息与控制工程学院毕业设计(论文)文献综述 (5)(5) 中间代码(中间代码(intermediate codeintermediate code) 根据中间代码的类型(例如三元式代码和P -代码)和优化的类型,该代码 可以是文本串的数组、临时文本文件或是结构的连接列表。对于进行复杂优化的 编译器,应特别注意选择允许简单重组的表示。 (6)(6) 临时文件(临时文件(t e m p o r a ry filet e m p o r a ry file) 计算机过去一直未能在编译器时将整个程序保留在存储器中。 这一问题已经 通过使用临时文件来保存翻译时中间步骤的结果或通过“匆忙地”编译(也就是 只保留源程序早期部分的足够信息用以处理翻译)解决了。存储器的限制现在也 只是一个小问题了,现在可以将整个编译单元放在存储器之中,特别是在可以分 别编译的语言中时。但是偶尔还是会发现需要在某些运行步骤中生成中间文件。 其中典型的是代码生成时需要反填( b a c k p a t c h )地址。例如,当翻译 如下的条件语句时 if x = 0 then . else .if x = 0 then . else . 在知道e l s e部分代码的位置之前必须由文本跳到e l s e部分: CMP X, 0CMP X, 0 JNE NEX
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 工业智能化与数字化转型策略
- 工业废水处理技术及其应用
- 工业机器人技术的智能化升级与改造
- 工业废水处理的新技术与策略
- 工业自动化中的数据驱动决策支持系统
- 工业物联网的挑战与机遇
- 工业生产线的自动化设备温控管理
- 工业遗址改造为现代建筑的策略
- 工业节能减排的技术创新与效益
- 工业设计与人机交互的融合
- 2025年江西江铜集团招聘笔试参考题库含答案解析
- 阿尔茨海默病源性轻度认知障碍诊疗中国专家共识2024解读
- 2025年免疫规划工作计划
- 2024年-2025年公路养护工理论知识考试题库
- 针刺伤预防与处理-2024中华护理学会团体标准
- 四年级校本课程教材-全册(自编教材)
- 酒店与代理合作协议书范文模板
- 天然气的高压物性课件
- 多模态数据融合方法
- JT∕T 791-2010 公路涵洞通道用波纹钢管(板)
- JB∕T 11864-2014 长期堵转力矩电动机式电缆卷筒
评论
0/150
提交评论