- 3
- 0
- 约5.59千字
- 约 39页
- 2018-07-13 发布于江苏
- 举报
编译原理实践Iplementationofprogramminglanguage窦亮
序言 《编译原理》的课程实践一般有两种可能的安排。其一,为配合编译课程教学,而安排多次小型实践,分别支持编译程序的各个阶段。其二,针对某一规模适中的语言来设计和实现一个相对完整、独立的编译器。 《编译原理实践》作为《编译原理》课程的延伸,目的是让大家动手设计和实现某一规模适中的语言的编译器,该编译器不仅涉及编译程序的各个阶段,而且也强调了编译的总体设计、各个阶段的接口安排等等。 PL/0编译器 给出一个简单的类Pascal语言,其编译程序用高级语言(C和Pascal)实现。通过剖析该高级语言程序以理解各编译成分的功能及手工实现方法。 详细要求和评分规则见《编译原理实践作业要求 》 课程作业检查时间:11月17日至12月29日每周一上午8:00—11:30实验楼3楼机房 为了避免检查冲突,将把大家分成若干组,每组完成对PL/X的不同扩展。按照指定时间检查,无特殊原因不得更换时间。先检查的同学将获得更高的时间分,扩展点的难度也是由简单到复杂。 编译器是一种相当复杂的程序,其代码长度可从10000到1000000行不等。编写甚至读懂这样的一个程序都非易事,大多数的计算机科学家和专业人员从来也没有编写过一个完整的编译器。但是,几乎所有形式的计算均要用到编译器,而且任何一个与计算机打交道的专业人员都应掌握编译器的基本结构和操作。 例:C程序处理过程 # include stdio.h # include stdlib.h # define MAX_LINES 75 Enum booleans (FALSE,TRUE); Main (int argc,char *argv[]*) … 编译和解释 解释程序:在解释程序的执行过程中不产生目标代码。每读一条源程序代码,就将它解释成等价的若干条机器代码,并执行之。一些规模较小的语言,如BASIC,常采用此方式。 通常把编译和解释作某种程度的结合。如Java,先将源程序由java编译器(javac)编译生成字节码文件,然后由java解释器(java)执行。 注:字节码文件是与平台无关的二进制码,执行时由解释器解释生成本地机器码,边解释边执行。 PL/0编译程序也采用了编译和解释相结合的方式 编译程序的自展技术 由于一个编译程序的功能是把某种高级语言的源程序翻译成目标机的机器语言(或汇编语言),目标机只能执行它自己的机器语言,因此最早的第一个高级语言的编译程序必须用目标机的汇编语言或者机器语言书写。而一个结构较复杂庞大的高级语言的编译程序,若完全用汇编语言或者机器语言书写会有种种不便之处,而用自展技术则可以很好地解决这个问题 自展的思想是先用目标机的汇编语言或机器语言书写源语言的一个子集的编译程序,然后再用这个自己作为书写语言,实现源语言的编译程序。如果把这个过程根据情况分为若干步,像滚雪球一样直到生成预计源语言的编译程序为止,我们把这样的实现方式称为自展技术 简要来说就是:用被编译的语言来书写该语言自身的编译程序 2.3 编译程序的结构 在设计和实现编译程序时,要考虑编译程序分“遍”的问题。所谓一“遍”是指在编译时把源程序或者中间形式从头到尾扫描一遍,并作相关处理,生成新的中间形式或目标代码 采用不同的分遍方式,编译程序的结构也有所不同 单遍编译程序 单遍编译程序只对源程序进行一遍扫描,就完成编译的各项任务,产生目标代码。在单遍编译程序中,往往以语法分析程序为中心,词法分析和语义分析作为语法分析的子程序。其工作过程如下: 当语法分析需要读进一个新单词时,就调用词法分析子程序。词法分析子程序则从源程序中依次读入字符,组合成单词符号,并将单词符号返回给语法分析程序。 当语法分析程序识别出一个语法成分时,就调用语义分析子程序进行语义分析,并生成目标程序。 当源程序处理完后,进行善后处理,优化目标程序。 词法分析 源程序 取单词 目标程序 开始 语法分析 语义分析及代码生成 送单词 单遍编译程序结构 多遍编译程序 有的编译程序把编译程序的五项任务分几遍来进行,每遍只完成部分任务, 多遍编译程序的工作过程如下: 调用词法分析程序将高级语言源程序转换成用单词符号表示的程序,即将字符串程序转换成单词符号串源程序。 调用语法分析程序对符号串源程序进行语法归类检查。 调用语义分析程序进行语义检查,并生成中间的代码程序。 调用代码优化程序对中间代码程序进行优化。 调用目标生成程序将优化后的中间代码程序转换成目标代码程序。 源程序 词法分析 语法分析 语义分析 代码优化 目标代码生成 错误处理 符号表 目标程序 多遍编译程序结构 实际上,根据语言的不同,编译器可以是一遍(one pass)——所有的阶段由一遍完成,其结果是编译得很好,但(通常)代码却不太有效。大多数带有优化
原创力文档

文档评论(0)