第一章 总结及作业【编译原理】

简介: 第一章 总结及作业【编译原理】

前言

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

祝大家逢考必过

点赞收藏关注哦


相关文章
|
程序员 编译器 Linux
程序员进阶之路:程序环境和预处理(二)
程序员进阶之路:程序环境和预处理(二)
38 0
|
6月前
|
编译器 C++
c++primer Plus 6 的课后题(第二章2.6)
c++primer Plus 6 的课后题(第二章2.6)
|
6月前
|
C++
c++primer Plus 6 的课后题(第三章3.6)
c++primer Plus 6 的课后题(第三章3.6)
|
7月前
|
C语言
第一章 C语言知识点(程序)
第一章 C语言知识点(程序)
61 0
|
6月前
|
存储 编译器 C++
c++primer plus 6 读书笔记 第三章 处理数据
c++primer plus 6 读书笔记 第三章 处理数据
|
存储 人工智能 算法
数据结构 第一章作业 绪论 西安石油大学
数据结构 第一章作业 绪论 西安石油大学
95 0
|
7月前
|
存储 开发工具 文件存储
Python的核心知识点整理大全66(已完结撒花)
Python的核心知识点整理大全66(已完结撒花)
126 4
|
存储 自然语言处理 程序员
程序员进阶之路:程序环境和预处理(一)
程序员进阶之路:程序环境和预处理(一)
74 0
|
自然语言处理 算法
第二章 总结及作业(6789B)【编译原理】
第二章 总结及作业(6789B)【编译原理】
170 0
|
数据库
第二章作业【数据库原理】
第二章作业【数据库原理】
71 0

相关实验场景

更多