编译原理心得体会.docx
《编译原理心得体会.docx》由会员分享,可在线阅读,更多相关《编译原理心得体会.docx(10页珍藏版)》请在冰豆网上搜索。
![编译原理心得体会.docx](https://file1.bdocx.com/fileroot1/2023-1/4/75c1b522-27cb-4c31-9754-91330de8fb3d/75c1b522-27cb-4c31-9754-91330de8fb3d1.gif)
编译原理心得体会
编译原理心得体会
篇一:
编译原理课程设计心得体会
编译原理课程设计心得体会
经过一个星期的编译原理课程设计,本人在刘贞老师的指导下,顺利完成该课程设计。
通过该课程设计,收获颇多。
一、对实验原理有更深的理解
通过该课程设计,掌握了什么是编译程序,编译程序工作的基本过程及其各阶段的基本任务,熟悉了编译程序总流程框图,了解了编译程序的生成过程、构造工具及其相关的技术对课本上的知识有了更深的理解,课本上的知识师机械的,表面的。
通过把该算法的内容,算法的执行顺序在计算机上实现,把原来以为很深奥的书本知识变的更为简单,对实验原理有更深的理解。
二、对该理论在实践中的应用有深刻的理解
通过把该算法的内容,算法的执行顺序在计算机上实现,知道和理解了该理论在计算机中是怎样执行的,对该理论在实践中的应用有深刻的理解。
三、激发了学习的积极性
通过该课程设计,全面系统的理解了编译原理程序构造的一般原理和基本实现方法。
把死板的课本知识变得生动有趣,激发了学习的积极性。
把学过的计算机编译原理的知识强化,能够把课堂上学的知识通过自己设计的程序表示出来,加深了对理论知识的理解。
以前对与计算机操
作系统的认识是模糊的,概念上的,现在通过自己动手做实验,从实践上认识了操作系统是如何处理命令的,如何协调计算机内部各个部件运行,对计算机编译原理的认识更加深刻。
课程设计中程序比较复杂,在调试时应该仔细,在程序调试时,注意指针,将不必要的命令去除。
在这次课程设计中,我就是按照实验指导的思想来完成。
加深了理解文件系统的内部功能及内部实现,培养实践动手能力和程序开发能力的目的。
四、理解了该知识点以及学科之间的融合渗透
本次课程设计程序部分是用c语言编写的,把《计算机操作系统》,《编译原理》,《算法分析与设计》《c语言》四门学科联系起来,把各个学科之间的知识融合起来,把各门课程的知识联系起来,对计算机整体的认识更加深刻。
使我加深了对《计算机操作系统》,《编译原理》,《算法分析与设计》《c语言》四门课程的认识。
篇二:
编译原理学习心得
国际学院0802杨良燕XX19100227
《编译原理》课程学习心得
《编译原理》是计算机专业的一门重要课程,正如教材
第一章的引论所述,“编译程序是现代计算机系统的基本组成部分之一”。
“一个编译程序就是一个语言翻译程序,语言翻译程序把一种语言(源语言)书写的程序翻译成另一种语言(目标语言)的等价程序”。
通过这一学期的学习,我觉得编译原理是一门理论性很强的课程,从文法和语言的概念到LL
(1)文法和LR(0)文法的分析,几乎都是对具体问题的抽象。
因而,我们需要更多的时间来理解、掌握相关的知识,当然在这一过程中也存在很多问题,比如我们后期学习具体文法的分析方法时,对于文法的概念不够清晰,影响了上课的效率,知道老师再次给我们讲解了文法等基础的知识点,我们才慢慢掌握后面所学的LL
(1)文法等,也发现了知识点之间的关联。
此外,这门课程的课时被安排得很少,一周只有一次,这样很不利于我们对这门重要课程的理解和掌握。
但是我觉得我们很幸运,因为老师在有限的课程中尽量将知识点以比较容易接受的方式给我们讲解,教我们用简单的方法理解记忆不同的知识,对于我们提出的问题,无论课上或是课外,老师一直是不厌其烦,甚至利用课余时间为我们讲解重要的难题。
编译原理这门课程不仅仅在于其本身的理论价值,更在于为我们解决问题提供的思维方式和方法。
从LL
(1)到LR(0),问题不断被解决的同时,又有一个个新的问题提了出来。
对计算机语言世界的知识积累,像滚雪球一样越滚越大。
这个逐渐递进,逐渐解决问题的过程对我来说是收获很大的。
整个过程好像踏着前人研究编译理论的路线,不断感觉他们遇到的问题,更重要的是他们解决问题的思路。
编译原理的课程带给我的不只是如何去编译程序这样的理论知识,相信更重要的是一种如何“自动计算”的思路。
通过对相关编译问题的具体分析,让我体会最深的是一种“自动计算”的思想,同时完成编译试验后,更是感到了一种“自动计算”的快乐。
”然而我明白自己虽然对编译有了一定的了解,我懂得了文法的分析,学会了构造确定和非确定有限自动机,学会了LL
(1)文法和LR(0)文法等,但是并没有完全掌握,对于这些知识点的实质性和其他方面,更是认识不深。
作为一名学习计算机科学与技术的学生,我明白编译原理是软件工程的基础,课程的结束并不意味着学习的结束,只有通过以后的学习,才能更深入地了解编译原理。
篇三:
编译原理课程设计心得体会
编译原理课程设计心得体会
经过一个星期的编译原理课程设计,本人在刘贞老师的指导下,顺利完成该课程设计。
通过该课程设计,收获颇多。
一、对实验原理有更深的理解通过该课程设计,掌握了什么是编译程序,编译程序工作的基本过程及其各阶段的基本任务,熟悉了编译程序总流程框图,了解了编译程序的生成过程、构造工具及其相关的技术对课本上的知识有了更深的理解,课本上的知识师机械的,表面的。
通过把该算法的内容,算法的执行顺序在计算机上实现,把原来以为很深奥的书本知识变的更为简单,对实验原理有更深的理解。
二、对该理论在实践中的应用有深刻的理解通过把该算法的内容,算法的执行顺序在计算机上实现,知道和理解了该理论在计算机中是怎样执行的,对该理论在实践中的应用有深刻的理解。
三、激发了学习的积极性通过该课程设计,全面系统的理解了编译原理程序构造的一般原理和基本实现方法。
把死板的课本知识变得生动有趣,激发了学习的积极性。
把学过的计算机编译原理的知识强化,能够把课堂上学的知识通过自己设计的程序表示出来,加深了对理论知识的理解。
以前对与计算机操作系统的认识是模糊的,概念上的,现在通过自己动手做实验,从实践上认识了操作系统是如何处理命令的,如何协调计算机内部各个部件运行,对计算机编译原理的认识更加深刻。
课程设计中程序比较复杂,在调试时应该仔细,在程序调试时,注意指针,将不必要的命令去除。
在这次课程设计中,我就是按照实验指导的思想来完成。
加深了理解文件系统的内部功能及内部实现,培养实践动手能力和程序开发能力的目的。
四、理解了该知识点以及学科之间的融合渗透本次课程设计程序部分是用c语言编写的,把《计算机操作系统》,《编译原理》,《算法分析与设计》《c语言》四门学科联系起来,把各个学科之间的知识融合起来,把各门课程的知识联系起来,对计算机整体的认识更加深刻。
使我加深了对《计算机操作系统》,《编译原理》,《算法分析与设计》《c语言》四门课程的认识。
篇四:
编译原理总结
1编译程序:
从高级语言到汇编语言或机器语言的翻译程序
2.源程序:
用汇编语言或高级语言编写的程序
3.目标程序:
用目标语言所表示的程序。
目标语言:
介于源语言和机器语言之间的“中间语言”,也可以是某种机器的机器语言,也可以是某机器的汇编语言。
4翻译程序:
将源程序转换为目标程序的程序称为翻译程序。
5赋值语句的语法规则:
A:
:
=V=EE:
:
=T|E+TT:
:
=F|T*FF:
:
=V|(E)|CV:
:
=标识符C:
:
=常数
6遍:
对源程序(包括源程序中间形式)从头到尾扫描一次,并做有关的加工处理,生成新的源程序中间形式或目标程序,通常称之为一遍。
优点:
节省内存空间,提高目标代码质量,逻辑机构清晰
缺点:
编译时间较长,会增加输入输出所消耗的时间,在内存许可下少用为妙
7前端:
通常将与源程序有关的编译部分称为前端。
包括词法分析,语法分析,语义分析,等分析部分
后端:
与目标机有关的部分称为后端。
包括中间代码生成,代码优化,目标程序生成等综合部分
8编译程序构成部分以及功能:
(1)词法分析(扫描器):
输入源程序,对构成源程序的字符串进行扫描和分解,识别出一个个的单词及其有关属性,并转换成属性字。
(2)语法分析(分析器):
在词法分析的基础上,根据语言的语法规则,逐一分析词法分析时得到的属性字,检查语法错误,若没有错误,则给出正确的语法结构(如短语、子句、句子、程序段、程序等)。
(3)语义分析(语义处理):
语法分析识别出的各类语法范畴,分析其含义,进行和初步翻译,产生介于源代码和目标代码之间的一种代码“中间代码”。
或者直接生成目标代码。
(4)优化:
依据程序的等价变换规则,尽量压缩
目标程序运行时所需的时间和所占的存储空间,以提高目标程序的质量(5)目标代码生成:
把经过优化的中间代码转化成特定机器上的低级语言代码。
9计算机执行用高级语言编写的程序途径有两种:
解释方式和编译方式。
根本区别:
是否生成了目标代码。
解释方式下,翻译程序事先并不对高级语言程序进行彻底翻译以得到机器代码,而是读入一条语句,就解释其含义并执行,然后再读入下一条语句,再解释执行,即按,源程序中语句的动态顺序逐句地进行分析解释,并立即予以执行。
编译方式下,翻译程序先对高级语言程序进行彻底翻译并生成目标代码,然后再对目标代码进行执行,即对源程序的处理是先翻译后执行。
简单来说解释方式不生成目标代码,编译方式生成目标代码
10编译程序采用多遍扫描还是单编扫描需要考虑哪些因素不一定,多遍编译器结构清晰,构造时间短,运行时需要内存少,产生的目标代码质量高,但时间效率低,
应该根据具体情况决
(1)语句的大小与结构,
(2)机器规模(3)设计目的(4)设计人员的素质及数量。
11比较LR(0),SLR
(1),LR
(1)和LALR
(1)
分析表的优缺点
(1)LR(0)分析表局限性大,但其构造方法是其他构造方法的基础
(2)SLR分析表虽然不是对所有文法都存在,但这种分析表状态少,存储空间占用少,较易实现又极有实用价值。
(3)规范LR分析表,即LR
(1)分析表,它的,它的分析能力最强,能适用于一大类文法,但是实现代价过高,主要是体积过大(4)LALR分析表的能力介于SLR分析表和规范LR分析表之间,稍加努力,就可以高效的实现。
12比较LL(K)分析表与LR(K)分析法共同点:
(1)两者多借助于可能句柄左部的全部符号及向右看K个符号来确定所应执
行的唯一动作,识别过程严格地从左到右扫描,无回溯,效率高。
(2)都能及时察觉错误2。
(3)识别程序都能自动生成。
区别:
(1)两者都是严格地从左到右扫描,名称中第一个L隐指这点,但LR分析技术利用的是最右推导(最左归约),由R隐指,LL(K)分析利用的是最左推导,由第二个L隐指。
(2)LL(K)要求文法无左递归,满足无回溯的条件,而LR分析法则无此限制。
(3)LL(K)是自上而下构造推导的,而LR(K)是自下而上构造归约的。
13语法制导翻译过程:
对单词符号串进行语法分析,构造语法分析树,构造属性依赖图,遍历语法树并在语法树各结点处按语义规则计算顺序。
14静态语义检查:
类型检查,控制流检查,一致性检查,相关名字检查,名字的作用域分析。
15引入中间代码的好处:
(1)便于进行与机器无关的代码优化工作
(2)使编译程序更容易改变目标机
(3)使编译程序的结构在逻辑上更为简单明确,以中间语言为界限,编译前端和后端的接口更清晰。
16编译程序分类
(1)诊断编译程序
(2)优化编译程序(3)交叉编译程序(4)可变目标编译程序
17编译程序工作过程5个阶段及其任务:
(1)词法分析:
任务是从左到右逐个字符的读入源程序,对构成源程序的字符流进行扫描和分解,进而识别一个个单词。
(2)语法分析:
任务是根据语法规则,分析并识别出各种语法成分,并经行语法正确性检查。
(3)语义分析与中间代码生成:
任务是对识别出的各种语法成分进行语义分析,并产生相应的中间代码。
(4)目标代码生成:
任务是把中间代码转换成特定机器上的低级语言代码。
18编译程序和解释程序
(1)编译程序需要在运行前将源代码译成目标代码,解释程序接受某个语言的程序并立即运行这个源程序
(2)二者存储组织有着很大不同,编译程序处理时存储区要存储编译用时需要的各种表格;解释程序将分析结果存放在源程序区
(3)编译程序动态性很差,可形成永久性可执行文件,解释程序动态性较好。
19程序性合计语言范型:
(1)强制(命令)式语言:
c,fortron,pasal
(2)函数式语言:
ML,Lisp
(3)基于规则(逻辑)的语言:
prolog(4)面向对象语言:
Ada,c++,java
1.推导:
—自上而下的语法分析过程
—预测分析程序,递归下降分析法(最左推导)
—注:
要求文法是LL
(1)文法
2.归约:
—自下而上的语法分析过程
—简单优先分析法,算符优先分析法、LR分析法3
3.自下而上的语法分析过程思想
—自下而上的语法分析过程是一个最左归约的过程,从输入串开始。
朝着文法的开始符号进行归约,直到到达文法的开始符号为止的过程注意:
输入串在这里是指从词法分析器送来的单词符号组成的二元式的有限序列。
即:
自左至右把输入串的符号一个一个移进栈,在移进过程中不断查看栈顶符号串,一旦形成某个句型的句柄时,就将此句柄用相应的产生式左部替换(归约),若再形成句柄,就继续替换,直到栈顶不再形成句柄为止,然后继续移进符号,重复上面的过程直到栈顶只剩下文法的开始符号,输入串读完为止,这样就认为识别了一个句子。
1)初态时栈内仅有栈底符“#”,读头指在最左边的单词符号上.
2)语法分析程序执行的动作:
a)移进:
读入一个单词并压入栈内,读头后移;
b)归约:
检查栈顶若干个符号能否进行归约,若能,就以产生式左部替代该符号串,同时输出产生式编号.
c)识别成功:
移进—归约的结局是栈内只剩下栈底符号和文法开始符号,读头也指向语句的结束符.
d)识别失败.
令G是一个文法,S是文法的开始符号,假定αβδ是文法G的一个句型,如果有SαAδ且Aβ
则称β是句型αβδ相对于非终结符A的短语。
特别是,如果有Aβ
则称β是句型αβδ相对于规则A→β的直接短语,一个句型的最左直接短语称为该句型的句柄。
注:
一个句型的语法树中任一子树叶节点所组成的符号串就是该句型的短语,当子树中不包含其他更小的子树时,该子树结点所组成的字符串就是该句型的直接(简单)短语。
素短语:
一个递归的定义,至少含有一个终结符,并且除它自身之外不在含有任何更小的素短语,(所谓最左素短语就是处于句型最左边的素短语)。
简单优先分析法:
1.确定相邻文法符号之间的优先关系在句型中,句柄内各相邻符号之间具有相同的优先级,相同优先级用“”
由于句柄要先归约,所以规定句柄两端符号的优先级要比位于句柄之外的相邻符号的优先级高,优先级低于表示为“﹤”,优先级高于表示为“>”
某句型中:
N1…..Ni-1 定义:
一个文法G,如果它不含e产生式,也不含任何右部相
同的不同产生式,并且它的任何符号对(X,Y)
X,Y是终结符或非终结符——或者没有关系,
——或者存在优先级相同或低于、高于等关系之一,
则这是一个简单优先文法。
1LR(0)文法:
该文法的以LR(0)项目集为状态的识别规范句型活前缀的DFA中没有冲突状态。
2SLR
(1)文法:
该文法的以LR(0)项目集为状态的识别规范句型活前缀的DFA中有冲突状态,冲突可用FOLLOW集解决。
该文法不是SLR
(1)文法。
因为FOLLOW(S)={a,b,#},所以无法解决冲突
3算符优先:
(T)()(6章)
1.静态语义检查包括:
(1)类型检查
(2)控制流检查(3)一致性检查(4)相关名字检查(5)名字的作用域分析
2.引入中间代码的好处:
(1)便于进行与机器无关的代码优化工作
(2)使编译程序更容易改变目标机
(3)使编译程序的结构在逻辑上更为简单
明确,以中间语言为界限,编译前端和后端的接口更清晰。
(1章)1.源程序:
用编译语言或高级语言编写的程序
目标程序:
用目标语言表示的程序
翻译程序:
将源程序转换为目标程序的程序。
2.编译程序分类
(1)诊断编译程序
(2)优化编译程序(3)交叉编译程序(4)可变目标编译程序
3.编译程序工作过程5个阶段及其任务:
(1)词法分析:
任务是从左到右逐个字符的读入源程序,对构成源程序的字符流进行扫描和分解,进而识别一个个单词。
(2)语法分析:
任务是根据语法规则,分析并识别出各种语法成分,并经行语法正确性检查。
(3)语义分析与中间代码生成:
任务是对识别出的各种语法成分进行语义分析,并产生相应的中间代码。
(4)目标代码生成:
任务是把中间代码转换成特定机器上的低级语言代码。
4.编译程序和解释程序
(1)编译程序需要在运行前将源代码译成目标代码,解释程序接受某个语言的程序并立即运行这个源程序
(2)二者存储组织有着很大不同,编译程序处理时存储区要存储编译用时需要的各种表格;解释程序将分析结果存放在源程序区
(3)编译程序动态性很差,可形成永久性可执行文件,解释程序动态性较好。
5.程序性合计语言范型:
(1)强制(命令)式语言:
c,fortron,pasal
(2)函数式语言:
ML,Lisp
(3)基于规则(逻辑)的语言:
prolog
(4)面向对象语言:
Ada,c++,java
6.构造编译程序必须掌握的三方面内容:
(1)源程序
(2)目标语言(3)编译方法
7.编译前端和后端
前端:
通常指与源程序有关的编译部分,包括词法分析,语法分析,语义分析,特点是与源程序有关。
后端:
与目标机有关的部分,包括中间代码生成,代码优化,目标程序生成,特点是与目标机有关。
1.推导:
—自上而下的语法分析过程
—预测分析程序,递归下降分析法(最左推导)
—注:
要求文法是LL
(1)文法
2.归约:
—自下而上的语法分析过程
—简单优先分析法,算符优先分析法、LR分析法3
3.自下而上的语法分析过程思想
—自下而上的语法分析过程是一个最左归约的过程,从输入串开始。
朝着文法的开始符号进行归约,直到到达文法的开始符号为止的过程注意:
输入串在这里是指从词法分析器送来的单词符号组成的二元式的有限序列。
即:
自左至右把输入串的符号一个一个移进栈,在移进过程中不断查看栈顶符号串,一旦形成某个句型的句柄时,就将此句柄用相应的产生式左部替换(归约),若再形成句柄,就继续替换,直到栈顶不再形成句柄为止,然后继续移进符号,重复上面的过程直到栈顶只剩下文法的开始符号,输入串读完为止,这样就认为识别了一个句子。
1)初态时栈内仅有栈底符“#”,读头指在最左边的单词符号上.
2)语法分析程序执行的动作:
a)移进:
读入一个单词并压入栈内,读头后移;
b)归约:
检查栈顶若干个符号能否进行归约,若能,就以产生式左部替代该符号串,同时输出产生式编号.
c)识别成功:
移进—归约的结局是栈内只剩下栈底符号和文法开始符号,读头也指向语句的结束符.
d)识别失败.
令G是一个文法,S是文法的开始符号,假定αβδ是文法G的一个句型,如果有SαAδ且Aβ
则称β是句型αβδ相对于非终结符A的短语。
特别是,如果有Aβ
则称β是句型αβδ相对于规则A→β
的直接短语,一个句型的最左直接短语称为该句型的句柄。
注:
一个句型的语法树中任一子树叶节点所组成的符号串就是该句型的短语,当子树中不包含其他更小的子树时,该子树结点所组成的字符串就是该句型的直接(简单)短语。
素短语:
一个递归的定义,至少含有一个终结符,并且除它自身之外不在含有任何更小的素短语,(所谓最左素短语就是处于句型最左边的素短语)。
简单优先分析法:
1.确定相邻文法符号之间的优先关系在句型中,句柄内各相邻符号之间具有相同的优先级,相同优先级用“”
由于句柄要先归约,所以规定句柄两端符号的优先级要比位于句柄之外的相邻符号的优先级高,优先级低于表示为“﹤”,优先级高于表示为“>”
某句型中:
N1..Ni-1 定义:
一个文法G,如果它不含e产生式,也不含任何右部相
同的不同产生式,并且它的任何符号对(X,Y)
X,Y是终结符或非终结符——或者没有关系,
——或者存在优先级相同或低于、高于等关系之一,
则这是一个简单优先文法。
篇五:
编译原理课程设计学习心得体会
一周的课程设计很快过去,总体感觉得做得很不爽。
因为考试的原因,所有想尽快把这个课程设计做完,所以就直接改了老师的程序,以为这样会快一些,事实证明,确实如此,但是做起来很不顺手,程序员更讨厌的是看别人的程序。
不知道变量的含义,函数的作用。
还有就是对vc不是很熟,不仅开发环境不熟,就连c(其实应该说是c)的一些常用函数都忘得一干净,就好比字符转化为整型(atoi)和整型转化为字符型(itoa)这两个函数,根本不认识,还是在google上搜索到的资料。
c确实有很多不完美的地方,我最烦的就是指针,指来指去的很让人头疼。
还有就有字符串的转换等一些操作,没有java来得方便。
如果自己独立编写代码的话,我会首先考虑用java,其次考虑用c#,最后才用c。
至于用什么asp,jsp来做,我也可以做,这些动态页语言都接触过,只可惜自己技不如人,不能在两天的时间内,把程序编出来,只能用最快的方法,用现成的改。
因考虑到编译是一门考研科目,所以自己打算在考试结束以后再完完整整地做一个。
总的来说,课程设计加深了自己对编译这门课的理解,发现自己还有很多的地方要复习,甚至还有知识点的理解偏差。
一定在考试把所有的漏动填平。
篇六:
编译原理实验心得
编译原理实验心得
第一章、引论
经过这一章节的学习我学到了如下知识:
1.自1954年FROTRANⅠ语言问世以来,计算机高级语言的到迅速发展。
高级语言给编程带来了极大的方便,但是计算机只能直接执行用机器语言编写的程序,不能直接执行用高级语言编写的程序。
要执行高级语言程序,必须提供该语言的翻译程序。
翻译有编译和解释两种方式。
编译方式是先将源程序翻译成目标程序,然后再执行目标程序,相应的翻译程序称为编译程序。
解释方式是边翻译边执行,相应的翻译程序称为解释程序。
2、编译理论和技术主要研究和讨论编译程序的构造和设计原理。
3、编译程序一般包括词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、代码优化程序、目标代码生成程序、表格处理程序和出错处理程序等。
4、编译过程可采用分遍形式,及编译过程可由一遍或多遍完成。
5、对于具有自编译性的高级语言,可运行自展技术构造其编译程序,即将源程序分解成核心部分和扩充部分,对核心部分进行多次扩充之后得到源语言。
6、一个具有自编译性的高级语言在宿主机上的编译程序可以移植到目标机上。
7、LEX是一个有代表性的词法分析程序生成器。
YACC是一种基于LALR
(1)分析法的语法分析程序生成器。
凡是有助于减少编写翻译程序工作的软件或工具包,统称为翻译程序的编写系统。
8、传统的串行编译程序只适应于SISD结构计算机,具有并行处理功能的并行编译程序则适于SISD和MISD结构计算机。
第二章、形式语言概论
1、形式语言由Chomsky于1956年提出,其理论的形成和发展推动了计算机考完学技术发展。
形式语言理论是编译原