前言
2023-3-13 20:56:25
以下内容源自《编译原理》
仅供学习交流使用
推荐
无
第一章 总结
2023-5-10 13:00:01
1.1 什么叫编译程序
翻译程序:将某一种语言(源语言)程序转换为与其逻辑上等价的另一种语言(目标语言)程序。
编译程序:源语言为高级语言,目标语言为汇编语言或机器语言的翻译程序。
汇编程序:源语言为汇编语言,目标语言为机器语言的翻译程序。
解释程序:源语言程序作为输入,但不产生目标程序,而是边解释边执行源程序本身。
补充
来源于编译和解释的区别
编译和解释的过程上的区别:编译是将源程序翻译成可执行的目标代码,翻译与执行是分开的;而解释是对源程序的翻译与执行一次性完成,不生成可存储的目标代码。
编译和解释结果上的区别:编译的话会把输入的源程序翻译生成为目标代码,并存下来(无论是存在内存中还是磁盘上),后续执行可以复用;解释的话则是把源程序中的指令逐条解释,不生成也不存下目标代码,后续执行没有多少可复用的信息。
根据其主流实现方式来把语言分为“编译型语言”和“解释型语言”。
C/C++/C#等都是编译型语言。以C语言为例,源代码被编译之后生成中间文件(.o和.obj),然后用链接器和汇编器生成机器码,也就是一系列基本操作的序列,机器码最后被执行生成最终动作。
Lisp/R/Python等都是解释型语言。
其实许多编程语言同时采用编译器与解释器来实现,这就包括Python,Java等,先将代码编译为字节码,在运行时再进行解释。所谓“解释型语言”并不是不用编译,而只是不需要用户显式去使用编译器得到可执行代码而已 。
查阅资料,分别列举几种编译器、解释器。
编译器:
GCC (GNU Compiler Collection):一种广泛使用的编译器集合,支持多种编程语言。
Clang:一种开源的编译器,用于C、C++、Objective-C和Objective-C++等语言。
Visual C++:微软公司的C++编译器,用于Windows操作系统。
Java编译器:Java语言的编译器,将Java代码编译为字节码以在Java虚拟机上运行。
解释器:
Python解释器:用于解释执行Python代码。
Ruby解释器:用于解释执行Ruby代码。
JavaScript解释器:用于解释执行JavaScript代码,例如Node.js。
Bash解释器:用于解释执行Bash脚本,用于Unix和Linux系统。
请谈一谈编译技术都有哪些应用
- 最直接的使用就是开发编译器,是机器能更好地识别高级语言;
- 基于编译技术的可信赖计算方法,基于编译技术的协议解析方法;
- 移动领域利用交叉编译技术去跨平台,将具备更强的竞争优势
1.2 编译过程概述
编译程序的工作过程:
词法分析、语法分析、语义分析与中间代码生成、优化、目标代码生成
具体说明
第一阶段,词法分析。词法分析的任务是:输入源程序,对构成源程序的字符串进行扫描和分解,识别出–个个的单词(亦称单词符号或简称符号),如基本字(begin 、end、 if、for 、 while 等),标识符、常数.算符和界符(标点符号.左右括号等等)。
第二阶段,语法分析。语法分析的任务是:在词法分析的基础上,根据语言的语法规则,把单词符号串分解成各类语法单位(语法范畴),如“短语”,“子句"、“句子"(“语句")、“程序段"和"程序”等。通过语法分析,确定整个输入串是否构成语法上正确的“程序”。
第三阶段,语义分析与中间代码产生。这一阶段的任务是:对语法分析所识别出的各类语法范畴,分析其含义,并进行初步翻译(产生中间代码)。
第四阶段,优化。优化的任务在于对前段产生的中间代码进行加工变换,以期在最后阶段能产生出更为高效(省时间和空间)的目标代码。
第五阶段,目标代码生成。这一阶段的任务是:把中间代码(或经优化处理之后)变换成特定机器上的低级语言代码。
1.3 编译程序的结构
1.3.1编译程序总框
图1.1 编译程序总框
1.3.2表格与表格管理
符号表:它用来登记源程序中出现的每个名字以及名字的各种属性。
1.3.3出错处理
一个编译程序不仅应能对书写正确的程序进行翻译,而且应能对出现在源程序中的错误进行处理。
1.3.4遍
所谓“遍”就是对源程序或源程序的中间结果从头到尾扫描一次,并作有关的加工处理,生成新的中间结果或目标程序。
一个编译程序究竟应分成几遍,如何划分,是与源语言、设计要求,硬件设备等诸因素有关的,因此难于统一划定。遍数多一点有个好处,即整个编译程序的逻辑结构可能清晰一点。但遍数多势必增加输人/输出所消耗的时间。因此,在主存可能的前提下,一般还是遍数尽可能少一点为好。应当注意的是,并不是每种语言都可以用单遍编译程序实现。
1.3.5编译前端与后端
概念上,我们有时把编译程序划分为编译前端和编译后端。前端主要由与源语言有关但与目标机无关的那些部分组成。这些部分通常包括词法分析语法分析、语义分析与中间代码产生,有的代码优化工作也可包括在前端。后端包括编译程序中与目标机有关的那些部分,如与目标机有关的代码优化和目标代码生成等。通常,后端不依赖于源语言而仅仅依赖于中间语言。
1.4编译程序与程序设计环境
1.5编译程序的生成
2023-5-10 13:07:01
第一章 作业
无
课堂测试
课前测03-01
1(多选题) 编译原理各阶段的工作都涉及到()
A. 表格管理
B. 语法分析
C. 出错处理
D. 代码优化
正确答案: AC
2(多选题) 程序语言一般分为()和()
A. 高级语言
B. 专用程序语言
C. 低级语言
D. 通用程序语言
正确答案: AC
3(多选题) 高级语言的翻译方式有()和()
A. 汇编方式
B. 模拟方式
C. 解释方式
D. 编译方式
正确答案: CD
课后练习03-01
1(简答题) 请根据课本30页例题,给出下列串的最右推导
2.1) baaa
2.2) aabbb
2.3) aaabbb
以下是P30的例题
文法G1: S→bA A→aA|a 1)baaa S=>bA=>baA=>baaA=>baaa 文法G2: S->AB A->aA|a B->bB|b 2) aabbb S=>AB=>AbB=>AbbB=>Abbb=>aAbbb=>aabbbb 文法G3: S->aSb|ab 3) aaabbb S=>aSb=>aaSbb=>aaabbb
拓展:
S->aSb|b
L(G)={anbn+1|n≥0}
S->aSbb|ε
L(G)={anb2n|n≥0}
S->aSbb|abb
L(G)={anb2n|n≥1}
S->Xb|b
X->aXbb|ε
L(G)={anb2n+1|n≥0}
S->Xb
X->aXbb|abb
L(G)={anb2n+1|n≥1}
已知文法G[S]为:S-> aSbb | a 该文法描述的语言是:( )
A.L={anb2n |n≥1}
B.L={an+1b2n |n≥0}
C.L={ambn |m、n≥0}
D.L={anbn+1 |n≥0}
B
课后复习03-08
1(多选题) 给定语法A–>bAcc|ε,下面的符号串中为该文法的句子是()
A. bcc
B. bcbc
C. bcbcc
D. bccbcc
E. bbcccc
正确答案: AE 我的答案: AE
L(G)={b nc 2n|n≥0}
2(单选题) V={A,B,0,1}, x、y∈V*是什么意思?
A. x、y是V上的某个符号
B. x、y是V上的符号形成的某符号串
C. x、y绝对不是空串
D. x、y都是符号串集
正确答案: B 我的答案: B
3(单选题) Σ={a,b}, x=aaa, y=bbbb, |xy|=
A. aaabbbb
B. abababb
C. 7
D. 3
正确答案: C 我的答案: C
4(单选题) x是串,xε等于?
A. ε
B. x
C. φ
D. ?
正确答案: B 我的答案: B
课前热身03-13
1(单选题) 文法G[S]:
S->bABa
A->aA|a
B->b
则句型baaAba的句柄是?
A. a
B. aA
C. b
D. ba
正确答案: B 我的答案: B
语法树如图
2(多选题) 有文法G[S]:
S->aA|b
A->bB|c
B->cS|abc
此文法中的递归产生式有:
A. S->aA
B. A->bB
C. B->cS
D. S->b
正确答案: ABC 我的答案: ABC
3(单选题) 有文法G[S]: S->aSbb|ε则L(G)是?
A. {ε,a,bb,abb}
B. {anbn|n≥0}
C. {anb2n|n≥1}
D. {anb2n|n≥0}
正确答案: D 我的答案: D
4(单选题) 下列哪个文法是线性文法。
A.
G1[S]:S →aS|aB
B →bB|bC
C →cC|c
B.
G2[S]:S →aS|aB
B →Bb|Cb
C →Cc|c
C.
G3[S]:S →aSBC
B →bBC
C →cC|c
D.
G4[S]:S →aSb|ab
正确答案: A 我的答案: A 线性文法(三型文法)分为左线性文法和右线性文法
最后
2023-3-13 20:56:29
祝大家逢考必过
点赞收藏关注哦