第一篇:经典美文呼唤“经典”编译
经典美文呼唤“经典”编译
《在马克思墓前的讲话》,这篇文章是一位世界无产阶级的伟大导师为另一位伟大导师所写的悼词。自入选高中语文课本以来,历经数次课本的变化,许多名家大家的作品相继被置换,这篇文章却稳如泰山,成了高中语文教材的保留课文。笔者多次讲授这篇课文,发现文中误译较多,也查找了多种版本的教材,所选的这篇课文都一样,甚至连标点也丝毫不差。现一一指出,有待方家指正。
一、标点之误
“正像达尔文发现有机界的发展规律一样,马克思发现了人类历史的发展规律,即历来为繁芜丛杂的意识形态所掩盖着的一个简单事实:人们首先必须吃、喝、住、穿,然后才能从事政治、科学、艺术、宗教等等;所以,直接的物质的生活资料的生产,从而一个民族或一个时代的一定的经济发展阶段,便构成基础……”
其中“然后才能从事政治、科学、艺术、宗教等等”后的分号,明显是一处误用,因为分号常用于“表示一句话中间并列分句之间的停顿”。而“人们首先必须吃、喝、住、穿,然后才能从事政治、科学、艺术、宗教等等”是一个完整的句子,与“所以,直接的物质的生活资料的生产,从而一个民族或一个时代的一定的经济发展阶段,便构成基础……”既非同属一个句子,也非并列分句,所以此处应该用句号。
还有第四段,“不仅如此。马克思还发现了现代资本主义生产方式和它所产生的资产阶级社会的特殊的运动规律。”“不仅……还……”,它是一套关联词,是一句话,中间不能用句号隔开,明显应该用逗号。
第七段“最早的《莱茵报》(1842年),巴黎的《前进报》(1844年),《德意志―布鲁塞尔报》(1847年),《新莱茵报》(1848―1849年),《纽约每日论坛报》(1852―1861年)”,各个报纸名称的罗列,相当于各个名词的罗列,各名词间的停顿应用顿号,不能用逗号。
二、连词之误
第三段中“直接的物质的生活资料的生产,从而一个民族或一个时代的一定的经济发展阶段,便构成基础”,其中“从而”一词,解释为“上文是原因、方法等,下文是结果、目的等;因此就。”可见,它是一个表因果关系的关联词,而此处“从而”前是一个短语,其中心语是“生产”,其后的短语中心语是“经济发展阶段”,二者是并列关系,不具备使用“从而”的条件,应换作“以及”等词。还有“人们的国家设施、法的观点、艺术以至宗教观念,就是从这个基础上发展起来的”,其中的“以至”,“表示在时间、数量、程度、范围上的延伸。”而“国家设施、法的观点、艺术”与“宗教观念”明显是并列关系,并不存在“延伸”。
三、语序之误
课文第二段“这个人的逝世,对于欧美战斗的无产阶级,对于历史科学,都是不可估量的损失。这位巨人逝世以后所形成的空白,不久就会使人感觉到。”应改为“这个人的逝世,对于历史科学,对于欧美战斗的无产阶级,都是不可估量的损失。这位巨人逝世以后所形成的空白,不久就会使人感觉到。”这样才能与下文照应,因为,下边第三、四、五、六段写的多是历史科学,七、八两段写的是马克思对于欧美战斗的无产阶级所做的付出。
还有,第六段开头“他作为科学家就是这样。但是这在他身上远不是主要的。”就这句话分析,它是一个过渡句,承上而启下,那么所“启”的就不应该是作为科学家的一面,而应该是别的方面。但译文却译出了:“在马克思看来,科学是一种在历史上起推动作用的、革命的力量。任何一门理论科学中的每一个新发现――它的实际应用也许还根本无法预见――都使马克思感到衷心喜悦,而当他看到那种对工业、对一般历史发展立即产生革命性影响的发现的时候,他的喜悦就非同寻常了。例如,他曾经密切注视电学方面各种发现的进展情况,不久以前,他还密切注视马赛尔•德普勒的发现。” 这还是马克思作为科学家的一面。若把这句话放于第七段开头,是比较恰当的。“他作为科学家就是这样,但是这在他身上远不是主要的,因为马克思首先是一个革命家。他毕生的真正使命,就是以这种或那种方式参加推翻资本主义社会及其所建立的国家设施的事业……”正好可以做到“承上”,即承三、四、五、六段写的历史科学;亦可做到“启下”,即启七、八两段写的马克思对于无产阶级所做的付出。
四、语法之误
“最早的《莱茵报》(1842年),巴黎的《前进报》(1844年),《德意志―布鲁塞尔报》(1847年),《新莱茵报》(1848―1849年),《纽约每日论坛报》(1852―1861年),以及许多富有战斗性的小册子,在巴黎、布鲁塞尔和伦敦各组织中的工作”,这段话没有一个动词,亦无主语,相当于几个名词罗列在一块,不知所云,严重违反语法规范。
恩格斯的原文写得非常流畅而严密,富有感情与文采,堪作议论文与悼词的典范。既然作为一篇保留的课文,就要把它翻译好,译出恩格斯思维的严密,译出恩格斯情感的真挚,把一篇经典译成经典。
本文系教育部人文社会科学研究规划基金项目“中学生经典阅读误读研究”(10YJA880178)的阶段性研究成果之一。
参考文献:
[1]中国社会科学院语言研究所词典编辑室.现代汉语词典(第5版)[Z].北京:商务印书馆,2008.(师修武 河南省淮阳中学 466700)
第二篇:编译原理课程设计
课 程 设 计 报 告
设计题目:一个简单文法的编译器前端的设计与实现
班
级: 计算机1206 组长学号:201239 组长姓名:闫智宣 指导教师:李晓华 设计时间:2014年12月
[在此处键入]
设计分工
组长学号及姓名: 20123974
闫智宣
分工:
语法分析,四元式生成,目标代码优化及生成 组员1学号及姓名:20123977
廖峭 分工:
词法分析,错误处理 组员2学号及姓名:20123959
郭天龙
分工:
符号表生成,语义动作插入,操作界面[在此处键入]
摘要
编译原理课程设计是通过C语言编译器相关子系统的设计,进一步加深对编译器构造的理解;第一部分词法分析,设计各单词的状态转换图,并为不同的单词设计种别码,制作扫描器识别一个个单词,返回值为识别码的序号,返回Token序列。将词法分析器设计成供语法分析器调用的子程序。词法分析器具备预处理功能。将不翻译的注释等符号先滤掉,只保留要翻译的符号串,即要求设计一个供词法分析调用的预处理子程序;第二部分,语法分析,用递归下降法,实现对表达式、各种说明语句、控制语句进行语法分析。若语法正确,则用语法制导翻译法进行语义翻译;生成并打印出语法树;若语法错误,要求指出出错性质和出错位置(行号)。
我们还做了附加功能,即编译后端,有中间代码优化,生成目标代码汇编语言。通过此次课程设计,提高了我们的独立分析问题、解决问题的能力,以及系统软件设计的能力; 提高程序设计能力、程序调试能力,团结协作能力
关键词:词法分析,语法分析,四元式生成,错误处理,符号表生成,语义动作插入,中间代码优化,生成目标代码 [在此处键入]
目录
摘要
1.概述
2.课程设计任务及要求
2.1 设计任务
2.2 设计要求
3.算法及数据结构
3.1算法的总体思想(流程)
3.2 词法分析模块
3.2.1 功能
3.2.2 数据结构
3.2.3 算法
3.3 语法分析模块
3.3.1功能
3.3.2 数据结构
3.3.3算法
3.4 符号表模块
3.4.1功能
3.4.2 数据结构
3.4.3算法
3.5 四元式模块
3.5.1功能
[在此处键入]
3.5.2 数据结构
3.5.3算法
3.6 语义动作分析模块
3.6.1功能 3.6.2 数据结构
3.6.3算法
3.7 错误处理模块
3.7.1功能
3.7.2 数据结构
3.7.3算法
3.8 目标代码模块
3.8.1功能
3.8.2 数据结构
3.8.3算法
4.程序设计与实现
4.1 程序流程图
4.2 程序说明
4.3 实验结果
5.结论 6.参考文献。7.收获、体会和建议。
[在此处键入]
1.概述
编译器是将C语言翻译为汇编语言代码的计算机程序。编译器将源程序(source language)编写的程序作为输入,翻译产生目标语言(target language)机器代码的等价程序。通常地,源程序为高级语言(high-level language),C语言程序,而目标则是 机器语言的目标代码(object code),也就是可以在计算机硬件中运行的机器代码软件程序。这一过程可以表示为:
源程序→编译器 →目标机器代码程序
2.课程设计任务及要求
2.1设计任务
学生在学习《编译原理》课程过程中,结合各章节的构造编译程序的基本理论,要求用C#语言描述及上机调试,实现一个 C编译程序(包括词法分析,语法分析等重要子程序),使学生将理论与实际应用结合起来,受到软件设计等开发过程的全面训练,从而提高学生软件开发的能力。
2.2设计要求 要求:
(1)设计词法分析器
设计各单词的状态转换图,并为不同的单词设计种别码。将词法分析器设计成供语法分析器调用的子程序。功能包括:
a.具备预处理功能。将不翻译的注释等符号先滤掉,只保留要翻译的符号串,即要求设计一个供词法分析调用的预处理子程序;
b.能够拼出语言中的各个单词; [在此处键入]
c.返回(种别码,属性值,行号)。
(2)语法分析
要求用学习过的自底向上或自顶向下的分析方法等,实现对表达式、各种说明语句、控制语句进行语法分析。若语法正确,则用语法制导翻译法进行语义翻译;生成并打印出语法树;若语法错误,要求指出出错性质和出错位置(行号)。
3.算法及数据结构
3.1算法的总体思想(流程)
本节主要分析程序的代码结构和代码工程文件的划分。(程序由几个类组成: Token类和Variable类SymbolTable类ObjectCode类Lexical类Grammar类Four_Yuan类Action类ErrorItem类,分别为词法分析和语法分析类。工程分为几个文件:Form1.cs,Token.cs,Variable.cs,SymbolTable.cs,ObjectCode.cs,Lexical.cs,Grammar.cs,Four_Yuan,cs,Action.cs,ErrorItem.cs分别对应Token类和Variable类SymbolTable类ObjectCode类Lexical类Grammar类Four_Yuan类Action类ErrorItem类的声明和实现文件)。本程序采用C#语言以面向对象的思想编写,程序分为几部分:词法分析(Lexical),语法分析(Grammer),目标代码生成(ObjectCode)。Lexical类主要的工作是词法分析获取Token。Grammer类的主要工作是根据Lexical类词法分析之后的Token进行语法分析,生成语法树,最后并输出语法树。在处理过程中,Token类的对象作为Lexical类的一个成员变量,配合Grammer类进行语法分析。
工程文件总体上是按照九个类的格局分为十个文件,分别是九个类的声明文件和实现文件。十个文件为Form1.cs,Token.cs,Variable.cs,SymbolTable.cs,ObjectCode.cs,Lexical.cs,Grammar.cs,Four_Yuan,cs,Action.cs,ErrorItem.cs,他们分别是Lexical类声明文件、Lexical类实现文件、Grammer类声明文件、Grammer类实现文件。[在此处键入]
程序流程
在程序中,Lexical类的对象(Token)作为Grammer类中的一个成员变量,配合Grammer类进行语法分析。它们的关系是这样的:Grammer类的一个成员变量temp首先对源程序删除注释,然后进行词法分析获取所有Token,并将获取的Token存储在Token对象的tokenList(List类型)中。然后Grammer类的语法分析程序就根据tokenList中的Token进行语法分析,生成语法树,最后打印语法树。同时,这也是程序的流程。[在此处键入]
3.2 词法分析模块 3.2.1功能
Lexical类主要的工作是词法分析获取Token序列。
3.2.2数据结构
词法分析阶段的代码被封装成一个类——Lexical,Token中主要是Lexical类的声明代码,Lexical.cs中主要是Lexical类的实现代码。Lexical类对外提供的函数主要有:
static public int RecogId(string str, int i),static public int RecogDig(string str,int i),static public int RecogOperator(string str, int i),static public int RecogBound(string str, int i),以上几个函数构成了词法分析的骨架,在Lexical类中还有其他成员变量和函数,主要作为这三个函数处理过程的中间步骤,为这三个函数服务。Lexical类的代码结构和主要的成员变量和函数及其含义如下图所示:
3.2.3算法
算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是[在此处键入]
根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。
主程序示意图:
主程序示意图如图3-1所示。
⑴ 关键字表的初值。
关键字作为特殊标识符处理,把它们预先安排在一张表格中(称为关键字表),当扫描程序识别出标识符时,查关键字表。如能查到匹配的单词,则该单词为关键字,否则为一般标识符。
(2)程序中需要用到的主要变量为type和number 扫描子程序的算法思想:
首先设置3个变量: [在此处键入]
①token用来存放构成单词符号的字符串; ②number用来整型单词;
③type用来存放单词符号的种别码。
Token定义
Token定义:
Token类型(TokenType):
3.3 语法分析模块
3.3.1功能
语法分析是编译过程的一个逻辑阶段。语法分析的功能是在词法分析的基础上将单词序列组合成各类语法短语,如“程序”,“语句”,“表达式”等等.语法分析程序判断源程序在结构上是否正确.源程序的结构由上下文无关文法描述.3.3.2 数据结构
下图为实现语法分析的类Grammar,属性与方法的作用都已说明 在此处键入]
3.3.3算法
1.文法
下面终结符与非终结符意义
B程序开始
Z 数据类型,如int,char,float等
V 标识符
S 语句
P 语句块
E 加减算术表达式
D 逗号表达式
T 乘除算术表达式
C 关系表达式
L 逻辑表达式
Q 标识符或圆括号
e 表示空
i 表示标识符 a)函数文法
B----ZV()S
[
[在此处键入]
b)语句块文法
P----SP|e
S----{P} c)语句文法
表达式语句文法
S----V=E
goto语句文法
S----i:S
S----goto i
if语句文法
S----if(E)S[else S]
while语句文法
S----while(E)S
声明语句文法
S----ZVD
D----,VD|=ED|e d)表达式文法
E----T|E+T|E-T
T----F|T*F|T/F
C----C|C
L----Q|L&&Q|L||Q
Q----i|(E)|!Q
2.递归下降程序流程图
对应于每个文法编写如下递归下降子程序
主程序(B)[在此处键入] [在此处键入]
3.4 符号表模块
3.4.1功能
进行符号表的储存,添加,更新,查找,保存标识符活跃信息以及输出。3.4.2 数据结构
在此处键入]
3.4.3算法
3.5 四元式模块
3.5.1功能
四元式为中间代码,编译程序进行完语义分析后,先生成中间代码作为过渡,此时中间代码与目标代码已经比较相似
3.5.2 数据结构
[ 在此处键入]
3.5.3算法
3.6语义动作分析模块
3.6.1功能
在语法分析中嵌入相应的语义动作,生成四元式 3.6.2 数据结构
[
[在此处键入]
3.6.3算法 GEQ(+)(-)(*)(/)
(+,i1,i2,t)PUSH(i)ASSI(=)
(=,t,_,POP)LABER(i)
(lb,_,_,i)GOTO(i)
(gt,_,_,i)IF(if)
(if,a,_,_)EL(el)
(el,_,_,_)IE(ie)
(ie,_,_,_)WH()
(wh,_,_,_)DO()
(do,a,_,_)WE(we)
(we,_,_,_)
3.7 错误处理模块
3.7.1功能 保存运行时发现的错误,储存行号已经详细信息并输出。
3.7.2 数据结构
3.7.3算法 [在此处键入]
public static void AddErrorMessage(int lineno,string content)函数用作在发现错误时保存错误信息以及行号。
public static string PrintErrorList()把所有发现的错误格式化后统一输出。
错误信息在语法分析,语义分析,符号表检错中添加。3.8 目标代码模块
3.8.1功能
目标代码生成把优化后的中间代码变换成目标代码,此处的目标代码为汇编代码,采用单寄存器生成目标代码 3.8.2 数据结构[在此处键入]
3.8.3算法
对于一个基本块有如下流程图
W:操作符,B:第一操作数,C:第二操作数,R:寄存器
5.结论
网上找一段话抄上 [在此处键入]
6.测试
测试打开文件
测试保存文件
如果没打开文件,直接敲代码,点保存时会弹出另存为窗口[在此处键入]
测试错误检测,程序缺少main函数的类型,错误列表中显示第一行函数缺少错误类型。
测试错误检测,程序缺少分号,错误列表中显示该行缺少语句结束标志';' 单击错误列表,会自动选定错误行
编译成功,生成并显示token串、符号表、四元式与目标代码 [在此处键入]
测试if与while语句,而且while嵌套在if当中
测试goto语句,结果正确。[在此处键入]
测试优化,输入课件中的代码,结果与课件一样
6.参考文献。
1、陈火旺.《程序设计语言编译原理》(第3版).北京:国防工业出版社.2000.2、美 Alfred V.Aho Ravi Sethi Jeffrey D.Ullman著.李建中,姜守旭译.《编译原理》.24 [在此处键入]
北京:机械工业出版社.2003.3、美 Kenneth C.Louden著.冯博琴等译.《编译原理及实践》.北京:机械工业出版社.2002.4、金成植著.《编译程序构造原理和实现技术》.北京:高等教育出版社.2002.7.收获、体会和建议。
直接拷贝好歹也检查一下错误
对于编译原理的这次课程设计,自己经历了从刚开始的不懂明白任务的要求和内容理论知识的了解开始着手写代码完成基本功能根据DFA及自顶向下等理论修改完善代码等这些过程。
自己着手写词法分析的时候还不清楚词法分析的任务内容,还不知道词法分析的结果是什么,词法分析出错的情况和类型有哪些,也总是将词法分析和语法分析混在一起,不明白哪些错误在词法分析中报,哪些错误在语法分析中判断,后来经过查书、网上资料、请教同学等途径逐步清晰了词法分析的工作内容是从源代码文件中获取出Token,供语法分析使用。在充分了解了语法分析需要哪些信息时,我才真正了解了词法分析的工作内容和目标,才知道词法分析需要完成哪些任务获取到哪些信息。充分了解了词法分析的任务之后,就开始理论知识的学习。经过揣摩书上的例子,自己理解和掌握了怎么设计过滤注释和分析程序中Token的DFA,于是开始根据设计好的DFA进行编码,最后经过调试已经可以正确地完成词法阶段的任务了。这只是词法分析的原始代码,在之后还进行了两次彻底的改动。虽然之前写的词法分析的代码已经完成了词法分析的需求,也是根据DFA的原理编写的,但是在代码结构上却难以体现,在对书上的根据已知DFA写代码的例子进行了详细的研究之后,发现自己的代码并没有像书上那样完全按照所依据的DFA各状态转移的关系进行编写,所以对代码进行了重写,像书上一样严格按照状态之间转移的方式进行编写,将状态划分成11个状态,状态分别按1~11进行标注,程序也按照DFA来编写,也实现了词法分析的功能。再后来写报告的时候,发现分析出Token的那个DFA并不是最简的,有很多多余的状态,完全可以用一个flag标志来标识,从而简化代码结构,于是又重写了一次词法分析函数scan()的代码,将状态缩减为5个,且不再用1-5来表示,而是像书上那样分别取了名字(START、INNUM、INID、INDBSYM、DONE),同时为了简化代码将输出Token到文件的部分从scan()中剥离开来,而在Lexical类中加了一个printToken()的函数,使scan()函数逻辑更加清晰,使读者能够容易地将代码与DFA进行查看比照。
在写语法分析的时候,已经对编译器的语法分析的内容有了一定的了解,所以直接进行了理论的学习。首先自己对递归向下分析法进行了学习,将书上的几个递归向下分析的伪代码看过之后,自己对递归向下的分析方法的原理有了初步的认识,大概知道了根据文法怎么分析,但是对于如何编写代码却还在此处键入]
是难以下手,于是就对照TINY语言的文法看了几遍书后面的TINY语言的递归向下分析的语法分析程序,这样就基本知道了C-语言的语法分析程序怎么写。由于C-语言给出的文法有左递归存在,于是自己将存在左递归的文法改写成EBNF的形式,并据此进行代码编写。由于在编写代码的过程中需要确定分析是否正确或选择多个文法中的某一个文法进行分析,有时必须探测需要的或下一个Token的类型,在这种情况下需要求First集合,在推导中若存在empty,又需要求Follow集合,所以这样又需要我了解First集合和Follow集合,自己在程序中也根据求出的First集合和Follow集合进行判断,以确定程序的走向。在编写过程中,还有一类问题,就是存在公共左因子,如文法expression→ var = expression | simple-expression,左因子为ID,在分析过程中,由于已经取出了一个ID的Token,且生成了一个IdK的节点,但是在当前状态无法确定是哪一个推导,然而IdK节点已经生成,又无法回退,并且是使用自顶向下的分析方法,已经生成的IdK在程序上方无法使用,自己通过查阅资料等途径的学习确定了在这种情形下的处理方式:将已经生成的IdK节点传到下方的处理程序,所以TreeNode * simple_expression(TreeNode * k)、TreeNode * additive_expression(TreeNode * k)等函数都被设计成有节点类型参数的函数,目的就是将已经生成的节点传到下面的分析函数中去。
通过这次的编译原理课程的学习和实践,自己获益良多。首先最基本的成果是完成了课程设计的任务,实现了编译器的词法分析和语法分析阶段的功能,词法分析主要能过滤注释、分析出语法分析阶段需要的Token并满足语法阶段的所有要求,能够判别词法分析阶段是否出错和出错类型和位置。语法分析主要能根据递归向下的分析思想和C-文法对词法分析获取的Token进行语法分析,能够构造出语法树,能够判别语法分析过程中是否出错以及出错位置和错误类型。
由于在编写程序过程中,涉及到了正则表达式、DFA、提取公共左因子、消除左递归、EBNF、求First集合和Follow集合、递归向下分析方法以及编程语言方面的知识,所以,通过本次的课程设计的实践,使得自己对编译原理这门课的许多知识点有了更加深刻和具体的理解,而不再只限制于做题。此外,对以前那些已掌握的知识有了温习和动手锻炼的机会。如:以前在编译原理课上虽然知道First集合和Follow集合怎么求的,却不知道First集合和Follow集合到底是干什么的,通过编写程序自己明白了他们的实际作用,使得自己不仅知其然还知其所以然,从而使得自己加深了对知识点的理解和掌握。由于以前编写代码都是使用JAVA语言,所以C/C++很多内容都忘记了,通过本次的实践,自己又重新拾起了以前的知识。此外,由于在做报告的时候,需要描绘DFA和程序流程图,使得自己初步掌握了使用visio和word画图的能力。此外,对于文档的编写和美化自己也获得了许多有用的经验。[
第三篇:编译原理 学习心得
国际学院 0802 杨良燕 200819100227
《编译原理》课程学习心得
《编译原理》是计算机专业的一门重要课程,正如教材
第一章的引论所述,“编译程序是现代计算机系统的基本组成部分之一”。“一个编译程序就是一个语言翻译程序,语言翻译程序把一种语言(源语言)书写的程序翻译成另一种语言(目标语言)的等价程序”。
通过这一学期的学习,我觉得编译原理是一门理论性很强的课程,从文法和语言的概念到LL(1)文法和LR(0)文法的分析,几乎都是对具体问题的抽象。因而,我们需要更多的时间来理解、掌握相关的知识,当然在这一过程中也存在很多问题,比如我们后期学习具体文法的分析方法时,对于文法的概念不够清晰,影响了上课的效率,知道老师再次给我们讲解了文法等基础的知识点,我们才慢慢掌握后面所学的LL(1)文法等,也发现了知识点之间的关联。此外,这门课程的课时被安排得很少,一周只有一次,这样很不利于我们对这门重要课程的理解和掌握。但是我觉得我们很幸运,因为老师在有限的课程中尽量将知识点以比较容易接受的方式给我们讲解,教我们用简单的方法理解记忆不同的知识,对于我们提出的问题,无论课上或是课外,老师一直是不厌其烦,甚至利用课余时间为我们讲解重要的难题。
编译原理这门课程不仅仅在于其本身的理论价值,更在于为我们解决问题提供的思维方式和方法。从LL(1)到LR(0),问题不断被解决的同时,又有一个个新的问题提了出来。对计算机语言世界的知识积累,像滚雪球一样越滚越大。这个逐渐递进,逐渐解决问题的过程对我来说是收获很大的。整个过程好像踏着前人研究编译理论的路线,不断感觉他们遇到的问题,更重要的是他们解决问题的思路。编译原理的课程带给我的不只是如何去编译程序这样的理论知识,相信更重要的是一种如何“自动计算”的思路。通过对相关编译问题的具体分析,让我体会最深的是一种“自动计算”的思想,同时完成编译试验后,更是感到了一种“自动计算”的快乐。”然而我明白自己虽然对编译有了一定的了解,我懂得了文法的分析,学会了构造确定和非确定有限自动机,学会了LL(1)文法和LR(0)文法等,但是并没有完全掌握,对于这些知识点的实质性和其他方面,更是认识不深。作为一名学习计算机科学与技术的学生,我明白编译原理是软件工程的基础,课程的结束并不意味着学习的结束,只有通过以后的学习,才能更深入地了解编译原理。
第四篇:编译技术发展综述
编译技术发展综述
计算机科学与软件学院
计算机1302 蔡元昊 1311611517
引言:编译程序构造的原理和技术一直属于最近公布的核心知识领域,已成为计算机科学必备的专业基础知识。而且编译程序的构造是计算机科学中一个非常成功的分支,也是最早获得成功的分支之一,他所建立的理论和技术方法值得人们深入研究和学习。
摘要:编译程序是计算机的核心系统之一,是掌握计算机理论和软件技术的关键知识,编译原理合计数为人们理解计算机语言。创造优秀的软件奠定了理论基础。扩展了视野,开辟了捷径。编译原理和技术可以应用在其他诸如软件建模语言、硬件描述语言。脚本语言等的翻译方面:在集成化软件开发环境以及软件安全一直有着广泛的应用。而且,编译原理的研究有力的推动了计算机科学、计算机工程、软件开发以及人机工程的研究和发展。编译原理是计算机专业的一门重要专业课,旨在介绍编译程序构造的一般原理和基本方法。内容包括语言和文法、词法分析、语法分析、语法制导翻译、中间代码生成、存储管理、代码优化和目标代码生成。
一、早期编译技术的发展
编译器是将一种语言翻译为另一种语言的计算机程序。编译器将源程序(source language)编写的程序作为输入,而产生用目标语言(target language)编写的等价程序。通常地,源程序为高级语言(high-level language),如C或C + +,而目标语言则是目标机器的目标代码(object code,有时也称作机器代码(machine code)),也就是写在计算机机器指令中的用于运行的代码。这一过程可以表示为: 源程序→编译器 →目标程序
在20世纪40年代,由于冯·诺伊曼在存储-程序计算机方面的先锋作用,编写一串代码或程序已成必要,这样计算机就可以执行所需的计算。开始时,这些程序都是用机器语言(machine language)编写的。机器语言就是表示机器实际操作的数字代码,例如: C7 06 0000 0002 表示在IBM PC 上使用的Intel 8x86处理器将数字2移至地址0 0 0 0(16进制)的指令。
但编写这样的代码是十分费时和乏味的,这种代码形式很快就被汇编语言(assembly language)代替了。在汇编语言中,都是以符号形式给出指令和存储地址的。例如,汇编语言指令 MOV X,2 就与前面的机器指令等价(假设符号存储地址X是0 0 0 0)。汇编程序(assembler)将汇编语言的符号代码和存储地址翻译成与机器语言相对应的数字代码。
汇编语言大大提高了编程的速度和准确度,人们至今仍在使用着它,在编码需要极快的速度和极高的简洁程度时尤为如此。但是,汇编语言也有许多缺点:编写起来也不容易,阅读和理解很难;而且汇编语言的编写严格依赖于特定的机器,所以为一台计算机编写的代码在应用于另一台计算机时必须完全重写。发展编程技术的下一个重要步骤就是以一个更类似于数学定义或自然语言的简洁形式来编写程序的操作,它应与任何机器都无关,而且也可由一个程序翻译为可执行的代码。例如,前面的汇编语言代码可以写成一个简洁的与机器无关的形式 x = 2
第一个编译程序的出现是在20世纪50年代早期,多数早期的编译工作是将算术公式翻译成机器代码。用现在的标准来衡量,当时的编译程序能完成的工作十分初步,如只允许简单的单目运算,数据元素的命名方式有很多限制。然而它们奠定了对高级语言编译系统的研究和开发的基础。20世纪50年代中期出现了FORTRAN等一批高级语言,相应的一批编译系统开发成功。随着编译技术的发展和社会对编译程序需求的不断增长,20世纪50年代末有人开始研究编译程序的自动生成工具,提出并研制编译程序的编译程序。它的功能是以任一语言的词法规则、语法规则和语义解释出发,自动产生该语言的编译程序。目前很多自动生成工具已广泛使用,如词法分析程序的生成系统LEX,语法分析程序的生成系统YACC等。20世纪60年代起,不断有人使用自展技术来构造编译程序。自展的主要特征是用被编译的语言来书写该语言自身的编译程序。1971年,PASCAL的编译程序用自展技术生成后,其影响就越来越大。随着并行技术和并行语言的发展,处理并行语言的并行编译技术,将串行程序转换成并行程序的自动并行编译技术也正在深入研究之中。另外嵌入式应用迅速增长的需求,推动了交叉编译技术的发展.还有系统芯片设计方法和关键EDA技术的研究,也带动了专用语言VHDL等及其编译技术的不断深化。在70年代后期和80年代早期,大量的项目都贯注于编译器其它部分的生成自动化,这其中就包括了代码生成。这些尝试并未取得多少成功,这大概是因为操作太复杂而人们又对其不甚了解。编译器设计最近的发展包括:首先,编译器包括了更加复杂算法的应用程序它用于推断或简化程序中的信息。其次,编译器已越来越成为基于窗口的交互开发环境(Interactive Development Environment,IDE)的一部分,它包括了编辑器、连接程序、调试程序以及项目管理程序。
在九十年代,作为GNU项目或其它开放源代码项目标一部分,许多免费编译器和编译器开发工具被开发出来。随着芯片研制,国内还有若干单位也在开展基于GCC生成面向特定芯片的编译器工作。编译器包括了更加复杂算法的应用程序它用于推断或简化程序中的信息;这又与更为复杂的程序设计语言的发展结合在一起。其中典型的有用于函数语言编译的Hindley-Milner类型检查的统一算法。其次,编译器已越来越成为基于窗口的交互开发环境(Interactive Development Environment,IDE)的一部分,它包括了编辑器、连接程序、调试程序以及项目管理程序。这样的IDE标准并没有多少,但是对标准的窗口环境进行开发已成为方向。另一方面,尽管近年来在编译原理领域进行了大量的研究,但是基本的编译器设计原理在近20年中都没有多大的改变。
大约在1999年,SGI公布了他们的一个工业化的并行化优化编译器Pro64的源代码,后被全世界多个编译器研究小组用来做研究平台,并命名为Open64。Open64的设计结构好,分析优化全面,是编译器高级研究的理想平台。3.编译器的种类
编译器可以生成用来在与编译器本身所在的计算机和操作系统(平台)相同的环境下运行的目标代码,这种编译器又叫做“本地”编译器。另外,编译器也可以生成用来在其它平台上运行的目标代码,这种编译器又叫做交叉编译器。交叉编译器在生成新的硬件平台时非常有用。“源码到源码编译器”是指用一种高阶语言作为输入,输出也是高阶语言的编译器。例如: 自动并行化编译器经常采用一种高阶语言作为输入,转换其中的代码,并用并行代码注释对它进行注释(如OpenMP)或者用语言构造进行注释(如FORTRAN的DOALL指令)。二.编译工具
1.C语言对应的编译器——VS2008 C语言对应的编译器可以用VS2003、VS2005、VS2008、TC等,以最新版本的Visual Studio 2008为例
Microsoft® Visual Studio® 2008 使开发人员能够快速创建高质量、用户体验丰富而又紧密联系的应用程序,充分展示了 Microsoft 开发智能客户端应用程序的构想。借助 Visual Studio 2008,采集和分析信息将变得更为简单便捷,业务决策也会因此变得更为有效。任何规模的组织都可以使用 Visual Studio 2008 快速创建能够利用 Windows Vista™ 和 2007 Office system 的更安全、更易于管理并且更可靠的应用程序。
Visual Studio 2008 在三个方面为开发人员提供了关键改进: 1.快速的应用程序开发 2.高效的团队协作 3.突破性的用户体验
Visual Studio 2008 提供了高级开发工具、调试功能、数据库功能和创新功能,帮助在各种平台上快速创建当前最先进的应用程序。2005 年,微软发布了 Visual Studio 2005。.NET 字眼从各种语言的名字中被抹去,但是这个版本的 Visual Studio 仍然还是面向.NET 框架的(版本2.0)。它同时也能开发跨平台的应用程序,如开发使用微软操作系统的手机的程序等。总体来说是一个非常庞大的软件,甚至包含代码测试功能。
Visual Studio 9 目前可以确定的是支持建立于 DHTML 基础上的 AJax 技术,这种微软在
Visual InterDev 时代提出的基于异步的客户端动态网页技术在当年并没有像微软预期中的那么流行起来,反而随着 GMail 等应用而东山再起,渐渐成为主流网络应用之一。同时 Visual Studio 9 会强化对于数据库的支持以及微软新的基于工作流(Workflow)的编程模型。预计为了保持与 Office 系列的统一,Visual Studio 9 的名称为 Visual Studio 2008。
2.C++语言对应的编译器——Microsoft Visual C++ 6.0 Visual C++是一个集成环境的C++编译器,功能很多。还有 Borland C++ Buider C++编译器,比较小巧实用。C++ Buider 也是C++编译器,是另一个公司的产品。
Microsoft Visual C++ 6.0功能特点:
几乎所有世界级的软件,从业界领先的Web浏览器到面向任务的企业应用,都是使用Microsoft Visual C++开发系统来开发的。要用C++来开发Windows和Web上的高性能应用程序,Visual C++是效率最高的首选工具。Visual C++ 6.0在不牺牲灵活性、性能和控制力度的同时,给C++带来更高水平的生产效率。除了IntelliSense Technology(智能感应技术)和Edit and Continue(即编即调)等显著缩短开发时间的新特性外,Visual C++ 6.0还为Web开发和企业开发提供更良好的支持。Microsoft Visual C++ 6.0专业版的健壮的构件开发、强大的数据库工具和完备的Internet支持将使您从中受益,创建出策略性的商务解决方案来。
有了这些显著缩短开发时间的新特性,您可以享受到一种全新水平的工作效率。编码所费的时间减少了,编译所费的时间减少了,调试所费的时间也减少了,一句话,创建应用程序所费的时间减少了,同时还可以享受到更多的构件重用。获得令人目眩的速度。本已是速度的标准的Visual C++如今更上一层楼,Visual C++ 6.0在多处进行了最优的调整,这样的结果是:开发者可以创建出可能范围内的最小最快的构件和应用。3.JAVA语言对应的编译器——eclipse JCreater、JBuilder、eclipse、myeclipse、netbean这几个是主流,eclipse和myeclipse(eclipse的扩展功能更多)是主流中的主流。
JBudler Eclipse 属于IDE,是集成开发环境(IDE)!IDE是集成了编译,检错,自动查找错误,深度反检查功能的辅助开发工具。就是说,只要属于java的IDE,都会把sun的编译器集成到它里面来。而JBudler与Eclipse 等这些开发工具更多的是体现在对不同层面java开发提供了不同的强大功能。比如:MyEclipse强势在web开发的便捷。JBudler对GUI更强大。eclipse是一个非常著名的集成开发工具,其自身功能强大而易用。更为重要的是,软件本
身是一个开放源代码的项目,由一个国际组织进行管理,很多大公司都是这个组织的成员,包括IBM和Borland等著名的软件开发商,事实上,eclipse本来是IBM开发的工具,是由IBM将其贡献给开放源代码社区的。正因为如此,任何人都可以免费获得eclipse开发环境,而不需要支付任何费用。
eclipse的另一个非常重要的特点是其提供了非常灵活的扩展能力,事实上,eclipse可以被称作一个开发平台,它提供了丰富的接口可以扩展其本身。eclipse本身是使用Java开发的,开发人员可以简单的按照其规范开发eclipse的插件,就可以在eclipse平台上增加更多的功能。大量的开发人员基于eclipse开发了插件,比如C++开发、UML设计、J2EE开发等都有相应的插件。事实上,包括IBM在内,很多大的软件公司基于eclipse开发了其自己的软件产品,这无疑得益于eclipse良好的结构。
三、编译原理的近期发展 随着大规模集成电路、网络通讯和其它数字信息技术的迅速发展,目前嵌入式系统己经广泛地渗透到科学研究、工程设计、军事技术、各类产业和商业文化艺术等各方面,在人们日常生活中的方方面面到处是嵌入式系统设备的身影,如手机、PDA、智能家电以及汽车电子等。随着国内外各种嵌入式产品的进一步开发和推广,嵌入式技术和人们的生活结合越来越紧密,人们日常的工作、学习和生活方式终将不可避免地逐步改变,嵌入式产品正在逐步形成时尚,在当今的信息社会中扮演越来越重要的角色。
嵌入式系统一般指的是非PC系统,它包括完全植入嵌入式硬件内部的为特定应用设计的专用计算机系统,以及相应的硬件。嵌入式系统以应用为中心的,它的软硬件可以根据需求进行裁减,以此来适应目标系统对外形尺寸、功能、可靠性、成本、功耗、外部接口等方面的严格要求。简单地说,嵌入式系统集操作系统、应用软件与硬件于一体,具有软件代码小、高度自动化、响应速度快等特点,因此特别适合要求实时和多任务的应用。
由于嵌入式系统资源有限,一般无法提供编译、汇编、链接等工具,同时也很难提供高级调试功能,因此嵌入式系统的应用软件一般不能直接在嵌入式系统平台上进行开发,而需要在交叉编译环境中开发。也就是说通常是在另外的开发平台上开发的,一般这种开发平台由通用的计算机系统和专用的嵌入式系统软件开发工具组成。
编译实现方式的发展主要分一下五类:手工、机器语言、汇编、系统程序设计语言、自动构造工具lex yacc gcc。推动编译技术发展的因素主要包括:语言范型(计算模式)、计算机体系结构语言范型主要包括:命令式(imperative language)、应用式(applicative)、基于规则的(rule-based)、面向对象的(object-oriented)、并行计算(parallel computing)。体系结构主要包括:万诺曼机体系结构、并行体系结构、嵌入系统。编译程序执行环境主要包括:批处理、交互环境、嵌入系统环境、并行编译技术、交叉编译。编译程序在一个机器(宿主机)上运行,产生另一个机器(目标机)的汇编语言。嵌入式系统中的应用程序正是借助这样的编译程序生成。目标处理器MIPSX是MIPS系列芯片的种,属于RISC体系结构,来源于斯坦福大学的MIPS计划。由于该系列CPU不是采用加州大学伯克利分校的RISC窗口技术而是采用消除流水线各级互锁的微处理器MIPS(MicroprocessorWithout Interlocking Pipeline Stage)技术,因此而得名。MIPS是将IBM公司对优化编译程序的研究和加州大学伯克利分校的大规模集成电路的思想结合起来的产品。
由于RISC指令集的简单和整齐,为了达到更好地利用计算机的性能,MIPS系列芯片中很好地应用了流水线策略。流水线是现代各类微处理器都采用的指令执行技巧,即将若干条指令的取指、译码和执行过程部分重叠在流水线中同时执行。以前在CISC计算机中,由于指令多而复杂,处理每条指令的所需时间不固定,当后面指令需要前条指令的结果时,往往造成指令互锁,因此无法实现流水 线。而斯坦福大学的MIPS计划就是在编译的过程中,利用编译程序优化处理器的流水线以求提高处理器流水线的效率。由于采用了硬件连线控制来执行数目不多的简单指令,而且还能重组软件流水线,这样就减少了硬件复杂性。“编译原理”课程分析编译原理课程一般利用常用软件如C,Pascal等来构建编译的各部分程序,编译原理的构成包括词法分析,语法分析、语义分析、中间代码生成、代码优化和目标代码生成等。编译原理课程的学习可以对程序设计语言的设计和实现有深刻的理解,还可以有助于快速理解定位和解决在程序编译、测试与运行中出现的问题。编译程序规模大。由于编译原理是一个极其复杂的系统,程序规模大,将它肢解开来一部分一部分地研究。理论知识抽象。要完整地构造一个编译系统并不是一件容易的事情,它不仅需要具有较完备的软件知识,并需要掌握现有的软件工具的使用,而且更重要的是要有丰富的实践经验,了解硬件系统结构和操作系统的功能。算法的理解和实现。编译原理这门课包含许多理论知识和算法,这些理论的学习和理解都存在着一定的难度。其中理论知识包括:词法分析器的构造,语法中各种分析器(LR,LL,SLR,LALR等)实现与完成。
在编译原理的不断发展和完善过程中,一本本课程教材接踵而至,其中不乏非常优秀的“名书”。编译领域里程碑式的经典著作——龙书,20年后终于出新版!这是一个延绵30年的故事,这是一部关于龙书的传奇!最新版本,增添三章节内容,使龙书地位更权威!1977年,Alfred V.Aho 和Jeffrey D.Ullman 出版《Principles of Compiler Design 》,封面是一名骑士和一只恐龙,因此第一次被人称为龙书,但因为那条龙是绿色的,所以称为绿龙书。过了9年,1986年,原来的两位作者加上Ravi Sethi, 升级了前一本书,书名改为《Compilers: Principles, Techniques and Tools》,封面依然沿用骑士和恐龙,那头龙是红色的,因此被叫做龙书二或者是红龙书。又过了一个9年,又一个9年,编译领域的巨无霸--龙书始终都没有升级。终于在2006年年底,龙书升级了。作者又增加了Monica S.Lam,名字沿用《Compilers: Principles, Techniques and Tools》,封面依然保持恐龙和武士的设计,但这次的龙是紫色,因此叫做紫龙书。
本书全面、深入地探讨了编译器设计方面的重要主题,包括词法分析、语法分析、语法制导定义和语法制导翻译、运行时刻环境、目标代码生成、代码优化技术、并行性检测以及过程间分析技术,并在相关章节中给出大量的实例。与上一版相比,本书进行了全面的修订,涵盖了编译器开发方面的最新进展。每章中都提供了大量的系统及参考文献。本书是编译原理课程方面的经典教材,内容丰富,适合作为高等院校计算机及相关专业本科生及研究生的编译原理课程的教材,也是广大技术人员的极佳参考读物。Alfred V.Aho是哥伦比亚大学的Lawrence Gussman计算机科学教授。Aho教授多次获奖,其中包括哥伦比亚校友会颁发的2003Great Teacher奖和电子与电器工程师协会的Jonh von Neumann奖章。他是美国国家工程院院士,以及ACM和IEEE的会员。Monica S.Lam是斯坦福大学的计算机科学教授。她曾经是Tensilica 的首席科学家,并且是moka5的创建者和首席执行官。她领导了 SUIF项目。该项目开发了最流行的研究性编译器之一,并首创了很多在工业界得到应用的编译技术。Jeffery D.Ullman是Gradiance公司的首席执行官和Standford大学的StanfordcW.Ascherman计算机科学(名誉退休)教授他的研究兴趣包括数据库理论、数据库集成、数据挖掘和利用信息基础软件的教育技术.他是美国国家工程院的院士,ACM的会员,并且是 Karlstrom奖和Knuth奖的获得者。
我对编译技术发展的总结:
编译原理是门实用的科学性的学科,当今世界发展离不开编译的进步,正是考虑到其重要性,中国乃至世界都应该注重这方面人才的培养,发展并不是一帆风顺,尤其是中国的核心技术缺乏,创新能力不足,不像美国,日本,甚至印度都很注重知识产权的重要性,都很注重自主创新的重要性,所以今后作为一个中国人,作为一个开发者应该把国家的利益放在第一位,把自主创新放在第一位,希望中国编译技术的发展越来越好!
第五篇:编译原理论文
编译原理心得体会
编译原理是计算机专业的一门重要专业课,旨在介绍编译程序构造的一般原理和基本方法,在计算机本科教学中占有十分重要的地位。
该课程理论性与实践性都很强,我们在学习是普遍感到内容非常抽象,不易理解,内容多且繁琐,难以完整、全面地掌握编译原理的有关知识,更不用说灵活运用编译原理知识从事相关设计或应用于其他领域。虽然只有少数人从事编译方面的工作,但是这门课在理论、技术、方法上都对我们提供了系统而有效的训练,有利于提高软件人员的素质和能力。
在我们学习编译原理以前,都认为编译原理只能应用在写程序语言的编译器上,觉得用处不大,学习兴趣不高。而在后来的学习中,我们逐渐认识到计算机专业的学生,除了要会编写程序语言之外,还应该了解它是如何被计算机所识别,这才是真正并且透彻地学习软件。另外,编译器中每一个模块的编写,都能对我们的编程能力的提高有很大帮助。在今后若从事软件工程,这门课程也能够对编写程序有所帮助。
为了能够系统掌握这门专业课,我们把编译原理分为以下几个模块:①语言和文法;②词法分析;③语法分析;④语义分析和中间代码生成;⑤代码优化和目标代码生成。
在学习的开始,我们需要掌握什么是编译,编译分为哪些阶段,编译程序和解释程序的区别等等。在做好了这些方面的准备后,开始了系统的学习。
语言和文法部分的知识包括文法基本概念及文法的二义性。基本概念有文法定义、推导、句型、句子等等。二义性文法是通过画语法树的方法来证明。
词法分析中的重点是有穷自动机DFA的生成以及DFA和正规式与正规文法的关系。还要熟练掌握NFA转换为DFA的方法及DFA的化简。
语法分析包括自上而下和自下而上分析。自上而下分析着重掌握LL(1)文法,自下而上分析重点掌握算符优先文法和LR(0)、SLR(1)文法。
语义分析重点是其功能,中间代码生成和语法制导翻译定义与方法。
最后,优化分为局部优化和循环优化,重点理解一些关键词,如基本块、流图等,要学会自己画出程序流图。用DAG图进行局部优化是重点。
在学习文法时,对文法的组成,用法都较为明了,而在真正做题时却感到十分吃力。例如给出了一个语言,要求写出它的上下文无关文法,就感到十分棘手,所以今后在这方面要加大练习量,以熟练掌握。
而在之后的词法分析和语法分析中,我感到在看基本原理时十分困难,通常要长时间钻研才能够有所了解,而一旦掌握了基本原理,做题时就感到十分顺畅了。例如,在刚接触到LR(0)文法时,我用了大量的时间去学习它的原理,掌握之后,在列LR(0)分析表和写分析过程时,只要思路清晰,就会比较顺畅,而且不会犯错。
下面是我认为的比较有效的学习编译原理的步骤:
1.先利用ANTLR之类的编译器生成工具,做一个小程序(如上面提到的HTML文件转化成纯文本文件的程序),所需知识只是正则表达式的基本知识和生成工具本身的使用方法(可以看联机帮助和网上教程(tutorial)来掌握).这样做的好处是:
1)可以体会到编译原理的实用性,提高学习兴趣
2)入门容易,消除编译原理学习的畏难情绪.3)获得词法分析器和语法分析器的感性认识,有利于加深对理论的理解.4)获得编译器自动生成工具(compiler compiler)的使用经验,提高解决实际问题的能力.(实际工作很多都不是手编而是利用工具的)
2.象ANTLR之类的工具是开源(open source)的,可研究其源码,以便必要时自己手编分析程序.3.回过头来看编译原理教材.这时大概会发现,很多理论很容易懂,剩下的只有上面说的几个难点,多看几遍,重点突破.4.结合教材所附源码,进一步加深对教材的理解。以上就是我对这门课的心得体会。