首页经典语录

编译原理的目标语言集锦60句

日期:2022年10月31日 分类:经典语录

编译原理知识点总结

编译原理是大学计算机专业的必修科目,也是计算机的基础知识,学好编译原理,有助于更好的进行编程的操作,下面是编译原理知识点总结,一起来看看吧!

编译原理知识点总结

一 编译器

简单讲,编译器就是将“高级语言”翻译为“机器语言(低级语言)”的程序。一个现代编译器的主要工作流程:源代码 (source code) → 预处理器

(preprocessor) → 编译器 (compiler) → 汇编程序 (assembler) → 目标代码 (object code) → 链接器(Linker) → 可执行程序 (executables)

二 工作原理

编译是从源代码(通常为高阶语言)到能直接被计算机或虚拟机执行的目标代码(通常为低阶语言或机器语言)的翻译过程。然而,也存在从低阶语言到高阶语言的编译器,这类编译器中用来从由高阶语言生成的低阶语言代码重新生成高阶语言代码的又被叫做反编译器。

也有从一种高阶语言生成另一种高阶语言的编译器,或者生成一种需要进一步处理的的中间代码的编译器(又叫级联)。

典型的编译器输出是由包含入口点的名字和地址, 以及外部调用(到不在这个目标文件中的函数调用)的机器代码所组成的目标文件。一组目标文件,不必是同一编译器产生,但使用的编译器必需采用同样的输出格式,可以链接在一起并生成可以由用户直接执行的可执行程序

三 编译器的发展史

(1) 20世纪50年代

IBM的John Backus带领一个研究小组对FORTRAN语言及其编译器进行开发。但由于当时人们对编译理论了解不多,开发工作变得既复杂又艰苦。与此同时,Noam Chomsky开始了他对自然语言结构的研究。他的发现最终使得编译器的结构异常简单,甚至还带有了一些自动化。Chomsky的研究导致了根据语言文法的难易程度以及识别它们所需要的算法来对语言分类。正如现在所称的Chomsky架构(Chomsky Hierarchy),它包括了文法的四个层次:0型文法、1型文法、2型文法和3型文法,且其中的每一个都是其前者的特殊情况。2型文法(或上下文无关文法)被证明是程序设计语言中最有用的,而且今天它已代表着程序设计语言结构的标准方式。分析问题(parsing problem,用于上下文无关文法识别的`有效算法)的研究是在60年代和70年代,它相当完善的解决了这个问题。现在它已是编译原理中的一个标准部分。

有限状态自动机(Finite Automaton)和正则表达式(Regular Expression)同上下文无关文法紧密相关,它们与Chomsky的3型文法相对应。对它们的研究与Chomsky的研究几乎同时开始,并且引出了表示程序设计语言的单词的符号方式。

人们接着又深化了生成有效目标代码的方法,这就是最初的编译器,它们被一直使用至今。人们通常将其称为优化技术(Optimization Technique),但因其从未真正地得到过被优化了的目标代码而仅仅改进了它的有效性,因此实际上应称作代码改进技术(Code Improvement Technique)。

当分析问题变得好懂起来时,人们就在开发程序上花费了很大的功夫来研究这一部分的编译器自动构造。这些程序最初被称为编译器的编译器(Compiler-compiler),但更确切地应称为分析程序生成器(Parser Generator),这是因为它们仅仅能够自动处理编译的一部分。这些程序中最著名的是Yacc(Yet Another Compiler-compiler),它是由Steve Johnson在1975年为Unix系统编写的。类似的,有限状态自动机的研究也发展了一种称为扫描程序生成器(Scanner Generator)的工具,Lex(与Yacc同时,由Mike Lesk为Unix系统开发)是这其中的佼佼者。

在70年代后期和80年代早期,大量的项目都贯注于编译器其它部分的生成自动化,这其中就包括了代码生成。这些尝试并未取得多少成功,这大概是因为操作太复杂而人们又对其不甚了解。

(2) 国内编译器的研发历史

我国编译器研发工作起步并不算晚,早在60年代初期,董韫美院士和杨芙清院士就分别在中科院和北大领导研究组开发编译器,那时面向的高级语言是ALGOL和FORTRAN,目标机是国产机。

在改革开放前,由于国家需要,中科院、国防科大、江南计算所、北大等单位一直在研制国产计算机,包括大型机和高性能计算机(如向量机、并行机),相应的也在研制高级语言编译器。中科院计算所以董韫美院士领导的研究组先后开发了119机、109机的类 ALGOL语言编译器BCY。国防科大开发了向量编译器和向量识别器。

70年代中科院计算所张兆庆教授研究组(以后称ACTGroup)开始在国产机上研制FORTRAN语言编译器,先后参与了众多的院级和国家级科研攻关项目,主持开发了013,757,KJ8920等国产大型机系统中的FORTRAN语言编译器,所研制的编译器支持了数百万行应用软件的运行。

90年代以来ACTGroup承担科学院重大项目,国家攻关项目,863项目,以及国际合作项目,先后开发了共享内存多处理机的并行识别器,分布式内存多处理机的并行识别器, SIMD芯片和VLIW芯片的并行优化C编译器。将编译技术与图形学结合,ACTGroup还推出了集成化、可视化的并行编程环境。ACTGroup在先进编译技术和并行编程环境方面的研究工作获国内外专家高度评价,国际著名学者评价此研究组居编译领域的世界先进行列。

(3) 研究现状

编译器设计最近的发展包括:首先,编译器包括了更加复杂算法的应用程序它用于推断或简化程序中的信息;这又与更为复杂的程序设计语言的发展结合在一起。其中典型的有用于函数语言编译的Hindley-Milner类型检查的统一算法。其次,编译器已越来越成为基于窗口的交互开发环境(Interactive Development Environment,IDE)的一部分,它包括了编辑器、连接程序、调试程序以及项目管理程序。这样的IDE标准并没有多少,但是对标准的窗口环境进行开发已成为方向。另一方面,尽管近年来在编译原理领域进行了大量的研究,但是基本的编译器设计原理在近20年中都没有多大的改变,它现在正迅速地成为计算机科学课程中的中心环节。

在九十年代,作为GNU项目或其它开放源代码项目的一部分,许多免费编译器和编译器开发工具被开发出来。这些工具可用来编译所有的计算机程序语言。它们中的一些项目被认为是高质量的,而且对现代编译理论感性趣的人可以很容易的得到它们的免费源代码。

大约在1999年,SGI公布了他们的一个工业化的并行化优化编译器Pro64的源代码,后被全世界多个编译器研究小组用来做研究平台,并命名为Open64。Open64的设计结构好,分析优化全面,是编译器高级研究的理想平台。

(4)国内编译器开发的现状

90年代以来,国内主要以研制并行机为主,相应的并行编译器研制也在国内开展起来。代表性的成果有:上海复旦大学朱传琪教授研究组研制的面向共享存储并行机的并行优化编译器AFT达到世界领先水平。

清华大学汤志忠教授研究组在软流水优化技术上做了很优秀的研究工作。清华大学郑纬民教授研究组开发了交互式并行化系统 TIPSExplorer,北京大学许卓群教授、李晓明教授研究组在HPF(High Performance Fortran)编译器方面做了多年工作,取得很好的研究成果。此外,国防科大、江南计算所等单位也都有从事并行编译技术研究。随着芯片研制,国内还有若干单位也在开展基于GCC生成面向特定芯片的编译器工作。

编译原理期末总结复习

篇一:

一、简答题

1.什么是编译程序?

答:编译程序是一种将高级语言程序(源程序)翻译成低级语言(目标程序)的程序 。

将高级程序设计语言程序翻译成逻辑上等价的低级语言(汇编语言,机器语言)程序的翻译程序。

2.请写出文法的形式定义?

答:一个文法G抽象地表示为四元组 G=(Vn,Vt,P,S)

– 其中Vn表示非终结符号

– Vt表示终结符号,Vn∪Vt=V(字母表),Vn∩Vt=φ

– S是开始符号,

– P是产生式,形如:α→β(α∈V+且至少含有一个非终结符号,β∈V*)

3.语法分析阶段的功能是什么?

答:在词法分析的基础上,根据语言的语法规则,将单词符号串分解成各类语法短语(例:

程序、语句、表达式)。确定整个输入串是否构成语法上正确的程序。

4.局部优化有哪些常用的技术?

答:优化技术1—删除公共子表达式

优化技术2—复写传播

优化技术3—删除无用代码

优化技术4—对程序进行代数恒等变换(降低运算强度)

优化技术5—代码外提

优化技术6—强度削弱

优化技术7—删除归纳变量

优化技术简介——对程序进行代数恒等变换(代数简化)

优化技术简介——对程序进行代数恒等变换(合并已知量)

5.编译过程分哪几个阶段?

答:逻辑上分五个阶段:词法分析、语法分析、语义分析与中间代码生成、代码优化、目

标代码生成。每个阶段把源程序从一种表示变换成另一种表示。

6. 什么是文法?

答:文法是描述语言的语法结构的形式规则。是一种工具,它可用于严格定义句子的结构;

用有穷的规则刻划无穷的集合;文法是被用来精确而无歧义地描述语言的句子的构成方式;文法描述语言的时候不考虑语言的含义。

7. 语义分析阶段的功能是什么?

答:对语法分析所识别出的各类语法范畴分析其含义,进行初步的翻译(翻译成中间代码);

并对静态语义进行审查。

8.代码优化须遵循哪些原则?

答:等价原则:不改变运行结果

有效原则:优化后时间更短,占用空间更少

合算原则:应用较低的代价取得较好的优化效果

9.词法分析阶段的功能是什么?

答:

逐个读入源程序字符并按照构词规则切分成一系列单词

任务:读入源程序,输出单词符号

— 滤掉空格,跳过注释、换行符

— 追踪换行标志,指出源程序出错的行列位置

— 宏展开,……

10.什么是符号表?

答:符号表在编译程序工作的过程中需要不断收集、记录和使用源程序中一些语法符号

的类型和特征等相关信息。这些信息一般以表格形式存储于系统中。如常数表、变量名表、数组名表、过程名表、标号表等等,统称为符号表。对于符号表组织、构造和管理方法的好坏会直接影响编译系统的运行效率。

11.什么是属性文法?

答:是在上下文无关文法的基础上,为每个文法符号(含终结符和非终结符)配备若干个属

性值,对文法的每个产生式都配备了一组属性计算规则(称为语义规则)。在语法分析过程中,完成语义规则所描述的动作,从而实现语义处理。

12.什么是基本块

答:是指程序中一顺序执行的语句序列,其中只有一个入口语句和一个出口语句,入口

是其第一个语句,出口是其最后一个语句。

13.代码优化阶段的功能是什么?

答:对已产生的中间代码进行加工变换,使生成的目标代码更为高效(时间和空间)。

14.文法分哪几类?

答:文法有四种:设有G=(Vn,Vt,P,S),不同类型的文法只是对产生式的要求不同:

0型文法(短文文法): G的每个产生式αβ满足:α∈V+且α中至少含有一个非终结符,β∈V*

1型文法(上下文有关文法):如果G的每个产生式αβ均满足|β|>=|α|,仅当Sε除外,但S不得出现在任何产生式的右部

2型文法(上下文无关文法):G的每个产生式为Aβ, A是一非终结符,β∈V*

3型文法(正规文法):G的每个产生式的形式都是:AαB或Aα,其中A,B是非终结符,α是终结符串。(右线性文法)。

15.循环优化常用的技术有哪些?

答:代码外提;强度削弱;删除归纳变量。

16.什么是算符优先文法?

答:算符文法G的任何终结符a,b之间要么没有优先关系,若有优先关系,

至多有

中的一种成立,则G为一算符优先文法。

二、计算题

(一)推导、最左推导、最右推导和语法树,复习表达式文法及相关例题。

1. 表达式的推导

例: G = ({E}, {i, +, *, (, ) } , P , E)

P: E E+E | E*E | (E) | i

答:表达式(i)和(i+i)*i的推导:

E (E) (i)

E E*E (E)*E (E + E)*E (i + E)*E (i + i)*E (i + i)*i

E E*E E*i (E)* i (E + E)*i (E+ i)*i (i + i)*i

(i+i)*i的最左推导过程:

E E*E (E)*E (E + E)*E (i + E)*E (i + i)*E (i + i)*i

(i+i)*i的最右推导过程:

E E*E E*i (E + E)*i (E+ i)*i (i + i)*i

2.语法树

例:对文法G = ({E}, {i, +, *, (, ) } , P , E)

P: E E + E | E * E | ( E ) | i

答: 句子(i+i)*i 的语法树:

例: G = ({E}, {i, +, *, (, ) } , P , E)

P: E E + E | E * E | ( E ) | i

答:句子 ( i * i + i)的语法树:

(1) E (E) (E + E) (E * E + E) (i * E + E) (i *i + i)

(二)给定语言求文法

(三)逆波兰式

篇二:

翻译程序:把一种语言程序转换成另一种语言程序,且在功能上是相同的这样的程序。 编译程序:把高级语言转换成低级语言,且在功能上是相同的这样的程序。

解释程序:边解释边执行源程序的程序。区别:编译程序有中间代码,而解释程序没有。 编译过程的五个阶段:

1、 词法分析 任务:对构成源程序的字符串进行扫描和分解,识别出一个个单词。

2、 语法分析 任务:在词法分析的基础上,根据语言规则,把单词符号串分解成各类语法

单位。

3、 语义分析和中间代码产生 任务:对语法分析所识别出的各类语法范畴,分析其含义,

并进行初步翻译。

4、 优化 任务:对前段产生的中间代码进行加工变换,以期在最后阶段能产生出更为高效

的目标代码。

5、 目标代码生成 任务:把中间代码变换成特定机器上的低级语言代码。

编译程序的七个部分词法分析器,语法分析器、语义分析与中间代码产生器、优化器、目标代码生成器、表格管理和出错处理。

编译程序生成的五个办法:机器语言、高级语言、移植、自编译方式和使用工具自动生成。 词法规则:指单词符号的形成规则。(也就是正规式)

语法规则:规定了如何从单词符号形成更大的结构。就是语法单位的形成规则。 空字:不包含任何符号的序列。

闭包:中所有的符号组成的集合。

上下文无关文法是指:所定义的语法范畴是完全独立于这种范畴可能出现的环境的文法。 上下文无关文法的四个组成部分:一组终结符号、一组非终结符号、一个开始符号和一组产生式。

终结符号也就是不可再分的基本符号。

非终结符号是用来代表语法范畴,表示一定符号串的集合。

开始符号是语言中我们最感兴趣的语法范畴。

产生式是定义语法范畴的书写规则。

句子:文法中从开始符号推导的终结符号串。

句型:从开始符号推导的符号串。

语言:文法中所有句子的集合。

程序语言的单词符号分为五种:关键字、标识符、常数、运算符和界符。

二元式表示:(种类,属性)

正规式的运算符有三种:或,连接和闭包。优先顺序是:闭包,连接,或。

DFA怎么识别字:若存在一条从初态结点到某一终态结点的通路,且这条通路上所有弧的标记符连接成的字是a,则称a可为DFA所识别。

DFA怎么识别空字:若DFA的初态结点同时又是终态结点,则空字可为DFA所识别。 NFA怎么识别字:若存在一条从某一初态结点到终态结点的通路,且这条通路上所有弧的标记字依序连接成的字等于a,则称a可为NFA识别。

NFA怎么识别空字:若M的某些结点即是初态又是终态结点,或者存在一条从某个初态结点到某个终态结点的空通路,那么,空字可为M所识别。

语言的语法结构是用上下文无关文法描述的。

语法分析分为两类:自上而下分析法,自下而上分析法。

自上而下分析法面临的问题:1.文法的左递归问题。2.回溯3.成功可能是暂时的,产生虚假匹配。4.难于知道输入串中出错的确切位置。5.效率低,代价高。

为什么消除左递归?因为含有左递归的文法将自上而下分析的过程陷入无限循环。 为什么消除回溯?因为回溯统一做一大堆无效的工作。

自下而上分析法:从输入串开始,逐步进行归约,知道归约到文法的开始符号。 短语:符号串推导过程中某非终结符推导的部分。

直接短语:符号串推导过程中某非终结符一步推导的部分。

句柄:一个句型的最左直接短语。

最左归约是最有推导的逆过程。

中间语言形式:后缀式,三元式,四元式,间接三元式。

中间语言的好处:1.便于进行与机器无关的代码优化工作。2.使编译程序改变目标机更容易。

3.使编译程序的`结构在逻辑上更为简单,以中间语言为界面,编译前端和后端的借口更清晰。

篇三:

(1)程序设计语言

机器语言: 由0、1代码构成,不需翻译就可直接执行其程序。

汇编语言: 机器指令助记符(伪代码)形式,汇编后才可执行其程序。

高级程序设计语言: 类自然语言和数学公式形式

(2) 基本术语

源程序(Source Program):用源语言写的程序。源语言可以是汇编语言,也可以是高级程

序设计语言。

目标程序(Target Program) :也称为“结果程序”,是源程序经翻译程序加工以后所生成

的程序。目标程序可以用机器语言表示,也可以用汇编语言或其它中间语言表示。

翻译程序(Translating Program):是指把一个源程序翻译成逻辑上等价的目标程序的程序。

源程序为其输入,目标程序为其输出。

汇编程序(Assembler):是指把一个汇编语言写的源程序转换成等价的机器语言表示的目

标程序的翻译程序。

编译程序(Compiler):若源程序是用高级程序设计语言所写,经翻译程序加工生成目标程

序,则该翻译程序就称为“编译程序”,也可称为编译器。

解释程序:是高级语言翻译程序的一种,他将源语言书写的源程序作为输入,解释一句

后就提交计算机执行一句,并不形成目标程序,就像外语翻译中的“口译”一样,不产生全文的翻译文本。

运行系统(Running System):目标程序执行时,需要有一些子程序(如一些连接装配程序

及一些连接库等)配合进行工作,由这些子程序组成的一个子程序库称为运行系统。 编译系统(Compiling System):编译程序和运行系统合称编译系统。

(3) 程序的翻译

除机器语言程序外,用其它语言书写的程序都必须经过翻译才能被计算机识别。这一过

程由翻译程序来完成。

编译方式是一种分阶段进行的方式,包括翻译和运行两部分。

前一阶段:翻译

后一阶段:运行,由运行系统配合完成。

(4) 过程

1、词法分析阶段

这个阶段的任务是从左到右一个字符一个字符地读入源程序,对构成源程序的字符流进行扫描和分解,从而识别出一个个单词(也称单词符号或符号TOKEN)。

某源程序片断如下:

begin var sum, first, count: real; sum:=first+count*10 end.

保留字 begin var real end

标识符 sumfirstcountsumfirstcount

界符 .

逗号,逗号,冒号:分号;加号+乘号*赋值号 :=整数10 10

2、语法分析阶段

是编译过程的第二个阶段。语法分析的任务是在词法分析的基础上将单词序列分解成各类语法短语,如“程序”,“语句”,“表达式”等等。一般这种语法短语,也称语法单位,或语法成分,或语法范畴。

语法分析所依据的是语言的语法规则,即描述程序结构的规则。通过语法分析确定整个输入串是否构成一个语法上正确的程序。

3、语义分析阶段

依据语言的语义规则,对语法分析得到的语法结构分析其含义以及应进行的运算,审查源程序中有无语义错误,为代码生成阶段收集类型信息。

4、中间代码生成

在进行了上述的语法分析和语义分析阶段的工作之后,有的编译程序将源程序转变成一种内部表示形式,这种内部表示形式叫做中间代码。

所谓“中间代码”是一种结构简单,含义明确的记号系统,这种记号系统可以设计为多种多样的形式。

重要的设计原则:一是容易生成;二是容易将它翻译成目标代码。

5、代码优化

任务:对前阶段产生的中间代码系列进行变换或改造。目的是使生成的目标代码更高效,即省时间省空间。例如上例四个四元式可优化为下面两个四元式。

6、目标代码生成

任务:将中间代码变换成特定机器上的绝对指令代码或可重定位的指令代码或汇编指令代码。它的工作与硬件系统结构和指令含义有关。

7、表格管理

编译过程中源程序的各种信息被保留在种种不同的表格里,编译各阶段的工作都涉及到构造、查找或更新有关的表格,因此需要有表格管理的工作;

8、出错处理

如果编译过程中发现源程序有错误,编译程度应报告错误的性质和错误发生的地点,并且将错误所造成的影响限制在尽可能小的范围内,使得源程序的其余部分能继续被编译下去,有些编译程序还能自动校正错误,这些工作称之为出错处理。

(5) 前端与后端

参考上面的图,目的是为了在多种源语言和多种目标语言的开发过程中,可以灵活搭配组合,消除重复开发的工作量,提高编译系统的开发效率。

(6) 遍

所谓遍,是对源程序或源程序的中间形式从头到尾扫视并完成规定任务的过程。

每一遍扫视可完成一个阶段或多个阶段的功能。

一遍的编译程序:以语法分析程序为核心 。

多遍扫描的优点:

可以减少内存容量的需求,分遍后,以遍为单位分别调用编译的各个程序,各遍程序可以相互覆盖。

可使各遍的编译程序相互独立,结构清晰。

能够进行充分优化,产生高质量的目标程序。

可将编译程序分为前端和后端,有利于编译程序的移植。

多遍扫描的缺点

每遍都要读符号、送符号,增加了许多重复性的工作,降低编译效率。

(7) 程序设计语言范型(从支持的计算模式)

1. 强制(命令)式语言:是面向动作的,即一个计算过程看做是一系列动作,其动作是命令驱动,以语言形式表示。

也称过程式语言,如C,FORTRAN等;

2. 函数式语言:注重程序表示的功能

也称应用式语言,如ML和LISP等;

3. 基于规则的语言:检查一定的使能条件,满足时执行动作

也称逻辑程序设计语言,如PROLOG。

4. 面向对象语言:提供抽象数据类型,支持封装性、继承性和多态性。

如C++和Java等。

(1) 符号和符号串

1、 字母表:元素的有穷非空集合。

2、 符号串:由字母表中的符号组成的任何有穷序列。

3、 符号串的头尾,固有头和固有尾:如果z=xy是一符号串,那么x是z的头,y是z

的尾,如果x是非空的,那么y是固有尾;同样如果y非空,那么x是固有头。 如:设z=abc,那么z的头是,a, ab, abc, 除abc外,其它都是固有头;z的尾是, c, bc, abc, z的固有尾是, c, bc。

4、 符号串的运算

(1)符号串的连接:设x和y是符号串,x和y的连接xy是把y的符号写在x的符号后得的符号串。

如:x=ST, y=abu, 则xy=STabu显然有x=x=x。

(2)符号串的方幂:设x是符号串,把x自身连接n次得x的几次方幂xn。

如:设x=ab则x0=x1=abx2=ababx3=ababab

(3)符号串集合的乘积:设A和B为符号串集合,则A和B的乘积定义为AB={xy|xA且yB}

如:a={a, b}, B={00, 11} 则AB={a00, a11, b00, b11} 显然:{}A=A{}=A

(4)符号串集合的方幂:设A为符号串集,则A的n次方幂An定义为:An=AA……A=AAn-1=An-1A

(5)符号串集合的正闭包A+:A+=A1 U A2 U … U An U …

(6)符号串集合的闭包A*:A*=A0 U A+ = {} U A+

如:设有正字母表={0,1} 则*=0 U 1 U 2 U … U n U …={, 0, 1, 00,01, 10, 11, 000, 001,……}

(2) 文法

文法G定义为四元组(VN ,VT,P,S)其中:

(1)VN 为非终结符号集

非终结符号表示一个语言短语(或语法成分、语法单位)。 如 程序、语句、表达式等。一般用大写字母或用〈 〉括起表示非终结符号。

(2)VT 为终结符号集

终结符号:组成语言的基本符号。是文法中不属于非终结符号集合的符号。一般用小写字母或不带〈 〉的符号表示。如程序设计语言的单词符号。

设V=VN U VT,称V为文法G的字母表。

(3)P 为产生式(也称规则)的集合。

产生式的形式:→或∷=,其中∈V+,∈V*

(4)S 称作识别符号或开始符号,是一个非终结符号。

一般表示此文法定义的最大语法短语,至少要在一条产生式 中作为左部出现。 句型、句子的定义

设G[S]是一文法,如果符号串x是从识别符号推导出来的,即有S*x, 则称x是文法G[S]的句型。

若x仅由终结符号组成,即S*x, xV T ,则称x为G[S]的句子。

句型:在一棵树生长过程的任何时刻,所有那些端末结点自左至右的排列,就是一个句型。

语言的定义:文法G产生的语言记为L(G),它是文法G产生的全部句子的集合。 文法等价定义:若L(G1)=L(G2)则称文法G1和G2是等价的。

(3) 文法的类型 N.Chomsky

0型文法:定义0型语言,对应Turing机;

1型文法:定义1型语言,对应线性限界自动机;箭头后面的要比前面的长或相等 2型文法:定义2型语言,对应非确定下推自动机;箭头前面的是非终结符,后面是串 3型文法:定义3型语言,对应有限自动机。非终结符可以推出一个终结符或一个终结符和一个非终结符

最右推导也称为规范推导,所得句型称为规范句型。

如果一个文法存在某个句型对应两棵不同的语法树,则说这个文法是二义的。或者说,若一个文法中存在某个句型,它有两个不同的最左(最右)推导,则这个文法是二义的。

上下文无关文法是否具有二义性是不可判定的。

但有些特殊的2型文法[例如LL(1)、LR(0)、LR(1)等文法]是无二义性的。 一个文法兼有左递归和右递归是导致二义性的常见原因。

排除文法二义性通常有两种方法:

(1)在语义上加些限制

(2)重新构造一个无二义性的文法

(4) 句型的分析

句型的分析:就是识别一个符号串是否为某文法的句型。是某个推导的构造过程。 分析方法分两大类:自上而下分析法和自下而上分析法推导与归约,最右推导是规范推导,逆过程为规范规约

若S*A+(由A+得)则称是句型相对于非终结符A的短语。

若S*A(由A→得)则称是句型相对于A→的直接短语(也称简单短语)。 一个句型的最左直接短语称为该句型的句柄。

一棵子树(至少要有父子两代)的所有端末结点自左至右排列起来形成相对于子树根的短语。若子树只有父子两代,则得到直接短语。

(5) 有关文法

(1)有害规则 文法中含形如U→U的产生式。

它对描述语言没有必要,且会引起文法的二义性。

(2)多余规则 文法中任何一个句子的推导都用不到的规则。

(3)无用规则 文法中含形如U→V的产生式,即单产生式。

为保证文法G的任一非终结符A在句子推导中出现,必须满足如下两个条件:

(1)A必须在某句型中出现,A。

(2) 必须能够从A推导出终结符号串t。

有关文法的化简和改造,包括以下几项工作:

(1)无用符号和无用产生式的删除。

(2) -产生式的消除。

(3)单产生式的消除。

(4)左递归的消除。

(1) 词法分析输出

单词符号(TOKEN) 是一个程序设计语言的基本语法符号。程序设计语言的单词符号一般可分成下列5种:

1.基本字,也称关键字,如PASCAL语言中的begin,end,if,while和var等。

2.标识符,用来表示各种名字,如常量名、变量名和过程名等。

3.常数,各种类型的常数,如25,3.1415,TRUE和"ABC"等。

4.运算符,如+,*,<= 等。

5.界符,如逗点,分号,括号等。

词法分析程序所输出的单词符号常常采用下二元式表示:(单词种别,单词自身的值) 可用整数码或助记符等表示。

(2) 单词的描述工具

程序设计语言中的单词(TOKEN)是基本语法符号。单词符号的语法可以用有效的工具加以描述。

正规式和它所表示的正规集的递归定义如下。设字母表为∑,辅助字母表∑ ={ |, ·, *, (, ) }

定义(正规式和它所表示的正规集):

设字母表为Σ,辅助字母表Σ`={Φ,ε,|,·,*,(, }。

② ε和Φ都是Σ上的正规式,它们所表示的正规集分别为{ε}和{ };

② 任何a∈Σ,a是Σ上的一个正规式,它所表示的正规集为{a};

③ 假定e1和e2都是Σ上的正规式,它们所表示的正规集分别为L(e1)和L(e2),那么,(e1), e1|e2, e1·e2, e1*也都是正规式,它们所表示的正规集分别为L(e1), L(e1)∪L(e2), L(e1)L(e2)和(L(e1))*。

④ 仅由有限次使用上述三步骤而定义的表达式才是Σ上的正规式,仅由这些正规式所表示的字集才是Σ上的正规集。

(3) 有穷自动机

有穷自动机(也称有限自动机)作为一种识别装置,它能准确地识别正规集,即识别正规文法所定义的语言和正规式所表示的集合,引入有穷自动机这个理论,正是为词法分析程

编译原理小论文

编译原理是计算机专业的一门重要专业课,旨在介绍编译程序构造的一般原理和基本方法。那么编译原理小论文要怎么写呢?不妨来参考一下小编带来的编译原理小论文样本。希望大家喜欢哦!

编译原理小论文

摘要:本文探讨了在计算机软件技术快速发展的情况下,高校计算机类专业编译原理课程的改革问题。提出了编译原理课程教学模型从过程式向对象式的转变、编译程序的面向对象构造(包括编译算法的描述)等问题,以及由此带来的教学内容的调整和课程实验的设计问题。

关键词:编译程序;教学改革;对象式程序设计;Java

1 引言

编译原理课程是高校计算机类专业的重要基础和骨干课程。编译原理对计算机专业的学生的重要性与高等数学对理科学生的重要性几乎可以相提并论。同时,由于这门课程涉及其他多门课程的知识,使得它成为大学阶段中最难学的课程之一。

从表面上看,编译程序是将高级语言源程序翻译成低级语言程序,但编译程序构造的基本原理和技术也广泛应用于一般软件的设计和实现,其中的设计思想、算法、思维方式和技术都可能会对学生今后的职业发展产生比较大的影响。

当今,程序设计已经基本上从传统的过程式转向对象式,并且正在从对象式转向组件型。这其实是程序设计范型的变迁,是在计算机技术背景下认识世界的观点的变化:过程式将完成事务看成是一系列的步骤,而对象式却将世界看成是由一系列对象组成的,这些对象之间交互合作完成特定的事务。从过程式到对象式,有着质的变化,而非一般的修改和完善,由此带来了语言(算法描述工具)的变化。编程语言影响思维,面向对象的思维方法又促进了编程语言的发展。

目前,程序设计的一些后继课程,如数据结构等都进行了同步跟进,出现了诸如用C++或Java描述的数据结构教材。但编译原理课程却没有及时跟进,上述改变基本上没有反映到编译原理课程中。这门课程近20年来基本上没有大的变化,教学内容仍然是基于过程式语言展开的,编译算法和模型描述是用PASCAL语言或者C语言。虽然个别教材加入了少量关于对象式语言编译技术的内容,那也是稍加点缀而已,作用不大。这就造成了一种奇怪的现象:对象式语言已经成了高校计算机教学的主流语言,社会上大量使用的也是对象式语言,而我们的编译原理教学仍然沿袭旧的一套。这种“状态”严重地脱离了计算机技术的发展和社会的实际需要,因此需要进行“调态”,其根本做法是“转型”,即将本课程的讨论对象从过程式语言转到对象式语言。

国外近年关于编译原理方面的新教材已经有了重要改变,不再连篇累牍地讨论那些已经过时的内容,增加了许多新的内容。其中一个重大改变是出现了用对象式语言描述编译算法和教学模型的编译原理教材,如:用Java语言描述的编译原理教材,且其教学模型为MiniJava。

这种改变也涉及到课程上机实践。众所周知,编译原理课程的学术性和实践性都很强:学术性是这门课程的生命所在,实践性是这门课程的活力所在。因而本课程的上机实践也要作同步调整。

2 课程内容围绕对象式语言展开

研究程序设计语言的语法描述需要有文法理论的支持,老教材中文法、词法分析和语法分析部分内容基本上不需要作什么变动。词法分析主要依赖有穷状态自动机理论,语法分析主要讲述LL方法和LR方法,其他方法略做介绍即可,无需展开讨论。LL方法和LR方法含盖了许多分析技术,理论性和应用性都很强,完全可以代表主流技术。

重要的就是研究对象和教学模型的改变。首先,研究对象将从过程式程序设计语言转到对象式程序设计语言(当然还可以兼顾过程式),例如Java、C++等,围绕实现这类语言的编译实现技术展开讨论。对象式程序设计语言的要素是封装、继承、多态性,在编译实现时都必须仔细考虑。其次,涉及到对象式程序设计语言编译程序教学的模型选择问题。目前传统的教材选择的教学模型有PL/0、Tini C等。实践证明,围绕某个模型展开编译设计技术的讨论,效果是比较好的。课程研究对象和教学模型的改变涉及到调整的章节主要有语法分析、语义分析、代码生成、符号表管理、存贮分配等方面。

一旦我们讨论的模型发生变化,这些章节的内容就要作很大调整。如对象式语言的作用域规则、语言动态特性、模块化封装(类)、类的继承、多态性的实现等,都需要具体的技术来实现,这些都要反映在教材和教学中。

就课程中关于代码生成内容来看,目前Java编译程序生成Java虚拟机(JVM)代码,C#生成MSIL虚拟机代码。这两个虚拟机作为教学模型来说可能比较复杂了一些,在教学中可以选定一个简单的子集;或者在PL/0虚拟机上适当增加一些指令代码,以便于代码生成、存贮分配等部分的讲解。

实践证明,作为教学模型,在教材上提供一个小型语言的编译程序供学生分析和研究,非常有利于加深对基本原理的理解和掌握。这个小型编译程序可以比较小但应该能够说明一些基本问题,例如传统的编译原理课程中选择PL/0编译程序作为教学模型,就收到了比较好的教学效果。在对象式程序设计语言编译原理课程中选择Object—pl/0或者MiniJava作为教学模型是比较恰当的。前者是在传统的PL/0语言上增加类,补充封装、继承、多态性之语言成分得到的;后者是对Java语言进行适当简化得到的,其主要语法描述 。

编译原理课程可以围绕此模型展开讨论。国外已经有这类教材出现,并且不少大学已经开始使用。

3 用对象式语言描述编译算法和教学模型

本课程中各类编译算法都应该伴随着教学模型的变化,改用对象式语言来描述,如用Java语言描述或者用C++语言描述。其中一个重大的变化是教学模型如MiniJava或Object—pl/0要用对象式语言实现,也就是提出了教学模型的面向对象构造问题,这就比较好地将讨论对象和描述讨论对象的语言统一起来了。国外有的教材就选择了用Java描述MiniJava编译程序。

编译程序是一个重要的中大型软件,传统的编译程序大都是用PASCAL、C等语言描述的(参见图2)。像编译程序这样的中大型程序如何用类这个工具来进行分解,其实是对学生的对象式程序设计能力的一个重要检验。学习用对象式语言来描述编译程序,学生可能会受到一次严格的对象式语言程序设计训练,编译程序如何用类这个工具进行分解,这些类(对象)如何合作完成编译任务,都需要较好的对象式程序设计基础。图3是一个程序设计语言文法的面向对象表示。

传统的编译程序构造主要存在如下一些问题:

(1)传统编译程序试图通过将编译程序根据功能模块分解,而使整个编译程序的复杂性降低。这种方法虽然在一定程度上简化了编译过程。但为了处理大型、复杂且多变的编译程序,仅仅将它按照功能分解成词法分析、语法分析、语义处理和代码生成几个阶段是远远不够的。

(2)传统的编译程序构造中,编译的每个阶段依然是大型、复杂的,且每个阶段内部依然存在复杂的联系,这对编译程序的可维护性没有实际上的改变,反而造成维护困难。

(3)虽然传统的编译程序构造有着丰富的理论基础,也有一些工具诸如Lex、Yacc等,但对一个具体的编译程序的构造仍然要从最基本的描述开始。传统的编译程序构造的功能分解方法缺乏支持复用的良好机制。

总之,过程式程序设计范式存在的问题在编译程序设计中广泛存在。而用对象式程序设计语言来描述编译程序,则对象式程序设计范式带来的好处基本上都能够得到。具体主要表现在:

(1)编译程序效率高。由于面向对象的编译程序构造采用的是语法树构造法,可以得到上下文相关信息,并根据上下文进行语法树的优化,所以生成的代码效率高。

(2)复用方便。由于语法类和具体的语法结构一一对应,所以在复用语法结构时,可以直接得到能被复用的语法类,不需要经过查找过程。

(3)修改方便。由于面向对象方法中的封装和多态等技术的实现,语义处理方法中所用到的数据都是局部数据,因此要做语义修改时,只要继承相应的语法类,并且重载相应的语义处理方法即可,需修改的内容较之传统方法要少。

(4)有利于构造编译程序类库,使得编译程序的构造能够大量复用已有的类,这是更高层次上的复用。

4 课程实验的设计

计算机学科是一门技术学科,它虽然有一定的科学的成分,但工程技术的成分更多一些,因此需要加强动手能力的培养。编译原理课程除了注重它的原理性,还必须注重其实践性。学习这门课程时,学生对编译的理解往往只停留在书本的概念上,而不知道怎样把编译理论应用到实际的编译程序设计的实践中。另外,有些学校只将教学内容锁定在文法、词法分析(有穷状态自动机)、语法分析(LL、LR文法)上,以应付学生考研的需要。这些做法使得学生很难掌握这门课程的精髓。

编译系统可能是所有软件系统中最复杂的'系统之一,通过本课程实践环节的教学,还可以帮助学生掌握一些大、中型软件设计的技术和技巧,提高学生面向对象软件开发的综合能力。

传统的编译原理课程往往要求学生自己实现一个词法分析程序;实现一个基于递归子程序递归下降分析程序或基于预测分析表的语法分析程序;为某虚拟机(例如PL/0虚拟机)生成代码;对教学模型(例如PL/0)进行扩充,写出完整的编译程序等。且在此过程中学生可以借助词法分析自动生成程序Lex和语法分析自动生成程序Yacc进行有关实验。我们要求学生通过对教学模型的分析,能够在机器上动手实现一个小的编译系统,以加深对编译整个过程的一致性、连贯性、整体性的理解。

一旦我们的讨论对象改变为对象式语言,则其编译程序语法和词法分析的自动生成不能再采用Lex、Yacc这类工具了,需要改用JavaCC(Java Compiler Compiler)或SableCC等,它们都能生成Java语言代码;或者使用Jikespg(Jikes paser gernerator),它生成C++代码。

我们初步制定了本课程的实践环节,它主要分四个层次:

(1)借助JavaCC或SableCC等工具让学生自动生成小语言的词法分析和语法分析程序。这个实验的目的是教会学生关于词法分析和语法分析的自动生成,同时弄清这些工具生成出来的代码的程序结构,特别是面向对象的类结构。

(2)为上面生成的语法树添加语义动作,完成生成代码的工作。这个实验的目的是让学生理解如何在抽象语法树上添加语义动作,理解为虚拟机生成代码的知识。

(3)扩展教学模型,如MiniJava,为其增加一些语言成分,如有关语句等,然后为其构造完整的编译程序。这一实验让学生把握编译的总体,弄清各部分之间的关系。

(4)逐步构造面向对象的编译程序类库,使得“编写”编译程序逐步走向“组装”编译程序。

5 结束语

对计算机人才的层次结构、知识、能力与素质等方面的要求在很大程度上取决于计算机市场。我们需要与时俱进,适时考虑相应教学体系和内容的改变。依赖过程范性的编译原理课程势必要被依赖对象范性的编译原理课程所取代,这是软件技术发展和社会实际应用的需要。但建立本课程新的课程信念、课程价值、课程技术等尚需时日,需要不断探索和创新。

编译原理课程的改革不仅需要教师付出大量辛勤劳动,及时跟进技术的发展,还需要好的教材、好的课程实验设计。《对象式程序设计语言编译原理》便是我们按照上述思路来编写的教材。

参考文献

[1] 中国计算机本科专业发展战略研究报告[J]。中国大学教学,2022,5:7—10。

[2]Andrew W。Apple。现代编译器的Java实现[M]。北京:电子工业出版社,2022。

[3]Dick Grune etc。Modern Compiler Design[M]。JOHN WILEY&SONS,LTD,2022。

[4] 胡学联。开设软件新技术课程的实践探索[J]。黄河科技大学学报,2022 ,2。

[5] 胡学联等。对象式程序设计语言编译原理[M]。

电路原理知识点总结

通过对知识与方法的归纳总结,使知识整体化、有序化、条理化、系统化、结构化、网络化、形象化。使之便于理解,便于记忆,便于应用。下面就是小编整理的电路原理知识点总结,一起来看一下吧。

1.定义:把电源、用电器、开关、导线连接起来组成的电流的路径,电路知识点总结。

2.各部分元件的作用:(1)电源:提供电能的装置;(2)用电器:工作的设备;(3)开关:控制用电器或用来接通或断开电路;(4)导线:连接作用,形成让电荷移动的通路

二、电路的状态:通路、开路、短路

1.定义:(1)通路:处处接通的电路;(2)开路:断开的电路;(3)短路:将导线直接连接在用电器或电源两端的电路。

2.正确理解通路、开路和短路

三、电路的`基本连接方式:串联电路、并联电路

四、电路图(统一符号、横平竖直、简洁美观)

五、电工材料:导体、绝缘体

1. 导体

(1) 定义:容易导电的物体;(2)导体导电的原因:导体中有自由移动的电荷;

2. 绝缘体

(1)定义:不容易导电的物体;(2)原因:缺少自由移动的电荷

六、电流的形成

1.电流是电荷定向移动形成的;

2.形成电流的电荷有:正电荷、负电荷。酸碱盐的水溶液中是正负离子,金属导体中是自由电子。

七.电流的方向

1.规定:正电荷定向移动的方向为电流的方向;

2.电流的方向跟负电荷定向移动的方向相反;

3.在电源外部,电流的方向是从电源的正极流向负极。

八、电流的效应:热效应、化学效应、磁效应

九、电流的大小:i=q/t

十、电流的测量

1.单位及其换算:主单位安(a),常用单位毫安(ma)、微安(μa)

2.测量工具及其使用方法:(1)电流表;(2)量程;(3)读数方法(4)电流表的使

用规则,工作总结《电路知识点总结》。

十一、电流的规律:

(1)串联电路:i=i1+i2;

(2)并联电路:i=i1+i2

【方法提示】

1.电流表的使用可总结为(一查两确认,两要两不要)

(1)一查:检查指针是否指在零刻度线上;

(2)两确认:①确认所选量程。②确认每个大格和每个小格表示的电流值。两要:一

要让电流表串联在被测电路中;二要让电流从“+”接线柱流入,从“-”接线柱流出;③两不要:一不要让电流超过所选量程,二不要不经过用电器直接接在电源上。

在事先不知道电流的大小时,可以用试触法选择合适的量程。

2.根据串并联电路的特点求解有关问题的电路

(1)分析电路结构,识别各电路元件间的串联或并联;

(2)判断电流表测量的是哪段电路中的电流;

(3)根据串并联电路中的电流特点,按照题目给定的条件,求出待求的电流。

返回顶部