软设学习记录-编译原理

最近由于要评职称,准备参加软件设计师的考试,为了更好的记忆,也为了方便查阅,把复习的过程记录下来。具体的内容就不按顺序写,按照本人的薄弱环节来展开。

 1,编译程序和解释程序的区别
编译程序:定义(直接执行源程序,或翻译成中间代码后执行),在编译方式下,机器上运行的是与源程序等价的目标程序,源程序和编译程序不参与目标程序的执行。生成独立的目标程序。如.java生成.class.
解释程序:定义(源程序翻译成目标程序,然后执行)在解释方式下,源程序和解释程序参与到程序的运行。程序的控制权在解释程序。如asp.Python
另外汇编程序(三类):指令语句,伪指令,宏。汇编程序工作通常要对源程序进行两次扫描才能完成。第一次扫描主要工作是定义符号的值。第二次扫描的目的则是产生目标程序。
2,几种高级语言
Fortran(科学计算),Algol60(分程序结构),Cobol(事务处理),Pascal(结构化程序设计),Prolog(逻辑型语言),LISP(函数型程序)
3,编译过程

 过程阶段

任务及其特点

词法分析阶段

该阶段的任务是从左到右逐个字符的读入源程序,识别出一个个的单词符号

词法分析所依据的是语言的词法规则,即描述单词结构的规则。词法规则可用3型文法(正规文法)或正规式来描述,有限自动机能识别正规文法所定义的语言和正规式所表示的集合。

语法分析阶段

该阶段任务是在词法分析的基础上将单词符号序列分解成各类语法单元。

语法分析所依据的是语言的语法规则,即描述程序结构的规则。语法分析有自顶向下分析(递归子程序分析法LL1,必须改写文法,采用预测分析法,要消除左递归和提取公共左因)和自底向上分析(LR和算符优先分析,后进先出栈)两大类。

语义分析阶段

审查源程序有无语义错误,为代码生成阶段收集类型信息。

中间代码生成阶段

在进行了上述的语法分析和语义分析阶段的工作之后,有的编译程序将源程序变成一种内部表示形式,这种内部表示形式叫做中间语言或中间代码。所谓“中间代码”是一种简单、含义明确的记号系统。

代码优化阶段

该阶段是对前阶段产生的中间代码进行变换改造,目的是使生成的目标代码更为高级,即省时间和省空间。优化所依据的原则是程序的等价变换规则。

目标代码生成阶段

此阶段使把中间代码变换成特定机器上的绝对指令代码或可重定位的指令代码或汇编指令代码。


4,文法及语言形式描述

文法的定义:描述语言的语法结构的形式规则称为文法。

文法G是一个四元组,可表示为GVN,VT,P, S)。

VT是一个非空有限集,每个元素称为终结符。

VN是一个非空有限集,每个元素称为非终结符。

S是一个非终结符,称为开始符号;它至少要在一条产生式中作为左部出现。

T是一个产生式集合(有限)。

主要涉及几个概念。

I.   直接推导与推导(区别是否直接导出)

II.  直接归约与归约(直接推导和推导的逆过程)

III. 句型和句子(由开始符号推导出的称为句型,仅含终结符的句型称为句子)

IV.  语言(句子的全体)

文法的分类:

 文法类型

文法名称

语言名称

对应的自动机

定义

0型(PSG)

短语文法

递归可枚举语言

图灵机(Turing)

Vn中a至少含有一个非终结符

1型(CSG)

上下文有关文法

上下文有关语言

线性界限自动机

|a|<=|b|

2型(CFG)

上下文无关文法

上下文无关语言

非确定下推自动机

a都为非终结符

3型

右线性文法(正规文法)

有限状态文法

有限状态自动机

满足左线性或右线性规则


5,词法分析

词法分析用3型文法来描述。正规集通过有限自动机来识别。
分为确定的有限自动机(DFA)和不确定的有限自动机(NFA).
DFA定义为(S,Σ,f,s0,z)
S为一个有限集,每个元素为一个状态。
Σ为输入字符。
f 为单值部分映像
S0开始状态。
z 非空的终态集合。
NFA也是一个五元组。不过f的后继状态是不确定的,有向弧的标记可以是的ε。与DFA最根本的区别是,S在DFA只是一个状态,而NFA中为一个开始状态集。

NFA转化在DFA?

上图转化为一个表格

II0I1
{S,1,2,3}{1,3,4,5,z}{2,3}
{1,3,4,5,z}{1,3,4,5,6,z}ε
{2,3}{4,5,z}{2,3}
{1,3,4,5,6,z}{1,3,4,5,6,z}{5,z}
{4,5,z}{6}ε
{6}ε{5,z}
{5,z}{6}ε
把不重复的圈出来,把I作为初始态,0,1作为输入,得到下图

正则式与有限自动机的转换

定义:


6,语法分析

语法分析的任务是识别由词法分析给出的单词符号序列是否为给定文法的正确句子(程序)。语法规则可以采用上下文无关方法进行描述,
上下文无关文法,语法推导树:



语法分析常用的方法有两类:

◆自底向上分析方法(LR分析法和算符优先分析法)

也称为移进-归约分析法。对“可归约串”刻画的不同,形成两种不同的分析方法,即规范归约分析法和算符优先分析法。

◆自顶向下分析方法

也称为面向目标的分析方法。存在两种分析方法,递归子程序法和预测分析法,都使用LL(1)文法来进行语法分析。
算符优先:


文法优先级:

例子:

fristvt,fastvt如下:

结果如下:

最后填表。

参考:
1,软设教程(第三修订版)
2,中国软考联盟
3,希赛视频

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 编译原理是一门技术性很强的课程,要想快速学习,需要以下几点: 1. 认真阅读课本:编译原理的课本通常都很简洁明了,读课本是学习编译原理的基础。 2. 动手实践:编译原理是一门实践性很强的课程,通过动手实践来加深对知识的理解。 3. 思考问题:编译原理有很多的理论和技术,通过思考问题来加深对知识的理解。 4. 与他人交流:与他人交流可以帮助你更好地理解编译原理,并且可以得到他人的见解和建议。 5. 多做题目:通过做题目来巩固所学的知识,并且可以检验自己的理解程度。 ### 回答2: 要快速学习编译原理,以下是一些建议: 1.掌握基础知识:编译原理是计算机科学的基础课程,首先要了解编译器的基本概念、工作原理和主要组成部分,如词法分析、语法分析、语义分析等。阅读相关教材或参考资料,建立起正确的基础知识。 2.理解算法:编译原理中包含许多重要的算法,如DFA、NFA、LL、LR、中间代码生成等。学习并理解这些算法的原理和实现方法,能够帮助更好地理解编译原理的工作流程。 3.动手实践:实践是学习编译原理的重要环节,通过实际编写一个简单的编译器或解释器,可以更好地理解和巩固所学知识。可以使用编程语言或工具如Lex、Yacc等进行实践,编写简单的语言解析程序,从而加深对编译原理的理解。 4.参考资料和实例:除了教材,还可以查找一些编译原理的优秀参考资料和实例,如龙书《编译原理》、《现代编译原理》等。通过学习和分析实际的编译系统或编译器源代码,可以更好地理解编译原理的实际应用。 5.与他人讨论和学习:参加相关的课程或与同学、老师进行讨论学习,可以相互激发思考和解决问题的能力。也可以加入编译原理相关的学习群体或论坛,与更多的编译原理爱好者进行交流和学习经验。 总的来说,要快速学习编译原理,除了掌握基础知识和算法原理外,动手实践和与他人讨论是非常重要的环节。通过理论和实践的结合,可以更好地理解和掌握编译原理

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值