当前课程知识点:Compilers Techniques > 1 Overview of Compilers Techniques > 1.1 Overview of Compilers Techniques > Chapter 1 Overview of Compilers Techniques
返回《Compilers Techniques》慕课在线视频课程列表
返回《Compilers Techniques》慕课在线视频列表
各位同学
大家好
欢迎大家来学习编译原理这门课
我们首先看一下为什么要学习编译原理呢?
编译原理在整个计算机系统当中
它所占的地位是什么样呢?
我们在学习完程序设计语言之后
需要去学习离散数学、数据结构
在此基础上我们需要去学习
编译原理和操作系统
然后我们才可以来学习更上层的信息系统
电子商务或者系统软件应用软件
我们观察到在学习了基本的
程序设计语言之后
为了进一步来提升我们的编程能力
我们需要去学习操作系统和编译原理
那么学习了编译原理之后
大家的编程能力就可以有一个质的飞跃
我们这门课主要给大家介绍的是
编译原理的一般原理和基本方法
我们涉及到的理论知识
包括形式语言与自动机
语法制导的定义和属性文法
类型论与类型系统
还有程序分析的基本原理
我们强调的是形式化的描述技术
我们强调的是宏观上对编译
原理和技术的理解
不需要把注意力分散到枝节算法当中
我们在这门课当中也没有偏向某一门
特定的源语言或者目标机器
我们再来看一下这门课的学习意义
在学习了编译原理之后
大家会对编程语言的实现和
设计有更深刻的理解
对编程语言的有关理论更加有所了解
同时我们可以从宏观上来把握编程语言
可以起到一个奠基的作用
同时从软件工程的角度来看
编译器是一个很好的实例
它所介绍的概念和技术可以应用
到一般的软件设计当中
也就是编译原理
它包含着很好的模块化的思想
同时编译技术的应用和编译技术
的发展也是非常迅速的
我们看到高级语言的程序设计
是离不开编译系统的
计算机体系结构的优化
程序的翻译
以及我们来提高软件开发效率的工具
也是离不开整个编译器的
编译器从逻辑上可以划分为各个阶段
每个阶段把源程序从一种
形式变换为另一种形式
这一章我们通过编译器的各个
阶段来了解一下编译器
我们来看一下编辑器从大的模块上
可以划分为如下的几个阶段
首先
源程序需要进行词法分析的处理
然后进行语法分析
然后进行语义分析
接下来是中间代码生成
完成了中间代码生成之后
我们得到中间代码
接下来我们要进行代码的优化
首先是独立于机器的代码优化
接下来是第八章的内容,代码生成
最后是依赖于目标的代码优化
最后我们就可以得到目标机器代码
首先是编译的第一个阶段
词法分析阶段
在词法分析阶段
我们将源程序形成的字符流变换为记号流
同时构造我们需要的符号表
接下来是语法分析阶段
在语法分析阶段
首先我们需要将语法表达出来
也就是写为对应的文法
例如表达式的语法特征
然后我们会根据对应的文法去
构造我们所要的分析树
语法分析器将词法记号流
变为语法树
第三个阶段是在进行语义分析
语义分析是将我们之前得到的语法树
来构造我们要的语义分析树
这个语义分析树来检查程序语义上
是否正确
下一个阶段是生成中间代码
也就是中间代码生成器
它将我们得到的语义分析树
变为三地址中间代码
接下来我们对三地址代码来进行优化
我们使用代码优化器将三地址中间代码
优化为更好的形式
再下一个阶段是代码生成的阶段
代码生成器将三地址中间代码
变为汇编代码
我们认为汇编代码是可以在
电脑上直接执行的
也就是我们所要的目标代码
接下来我们来学习一下编译器
和解释器的区别
解释器不生成目标代码
而是直接执行源程序所指定的运算
解释器也需要对源程序进行词法、
语法和语义分析
以及中间代码生成
接下来我们来了解一下basic和
java的解释器
对于basic的解释器
它将高级语言的源程序翻译成
一种中间语言程序
然后对中间语言程序进行解释执行
在那个年代
编译和翻译两个功能是
合在一个程序当中的
这个程序被称为解释器
而到了java的年代
解释器的两个功能分布在两个程序当中
前一个我们把它叫做编译器
它把源程序翻译成一种叫做字节码的
中间语言程序
后一个我们将它称为解释器
它对字节码程序进行解释执行
接下来我们来了解一下前端和后端的划分
编译器将前四个阶段
也就是词法分析
语法分析
语义分析和中间代码生成
这四个阶段称为前端
前端依赖于
源语言
独立于目标机器
后三个阶段我们将它称为后端
后端依赖于目标机器、独立于源语言
我们来看一下将编译器划分为前端
和后端有什么样的好处呢?
好处是我们可以来提高开发编译器的效率
我们把编译器划分为前端和后端之后
每一次我们可以取一个编译器的前端
重写它的后端以产生同一个源语言
在另一台机器上的编译器
同时不同的前端也可以使用
同样的一个后端
从而得到一个机器上的几种编译器
这是一个图示
大家可以看到左边是不区分
前端和后端的编译器
右边是我们在区分了前端和
后端这样的编译器上
针对不同的目标机器我们不需要修改
编译器的前端只需要针对不同的
目标机器修改编辑器的后端
接下来我们来了解一下编译器
当中“遍”的概念
一遍是指读取一个输入
然后写出一个输出
编译器的几个阶段
常常用一遍的扫描来实现
通常词法分析、语法分析
语义分析放在一起
作为一遍来进行处理
在编译器当中一遍实时把源程序或者
源程序的等价物进行处理
然后变成另一个相邻等价物的一个过程
在编译器当中
每一遍的输入都是上一遍的输出
第一遍的输入是源程序
最后一遍的输出是目标代码
那么如果遍数多的话
编译器的结构更加清晰
但是时间效率不高
遍数少的情况下
编译的速度快
但是对机器的内存的要求就更高
如何来确定遍数呢?
我们主要根据我们的编程语言以及
机器的性能来决定
接下来我们来了解一下编译器的应用
编译器可以提高我们软件的开发效率
我们在进行软件开发时
都是离不开编译器的
源于编译器中间代码优化技术的程序分析
一直在改进我们的软件开发效率
同时我们可以利用编译器来进行类型检查
边界检查以及进行内存管理
此外
编译器还可以有其他的应用
比如说我们可以来设计语法制导的
结构化编辑器
可以来设计程序格式化的工具
可以来进行软件的测试
可以来进行程序的理解
以及来设计高级语言的翻译工具等等
这一小节就到这儿
谢谢大家
-1.1 Overview of Compilers Techniques
--Chapter 1 Overview of Compilers Techniques
--Overview of Compilers Techniques
-2.1 Lexical Tokens, Strings and Language
--2.1 Lexical Tokens, Strings and Language
--2.1 Lexical Tokens, Strings and Language
-2.2 Regular form
--2.2 Regular form
-2.3 Finite automata
--2.3 Finite automata
-2.4 DFA construction, Subset construction, Simpleset DFA
--2.4 DFA construction, Subset construction, Simpleset DFA
-2.5 Lex
--2.5 Lex
-3.1 Context-free Grammars
--3.1.1 The Role of the Parser
--3.1.2 The Formal Definition of a Context-free Grammar
-3.2 Writing a Grammar
--3.2.1 Elimination of Left Recursion
--3.2 Top-Down Parsing
-3.3 Languages and Grammars
--3.3 Language and Grammars
-3.4 Top-Down Parsing
--3.4.3 Recursive Descent Analysis
--3.4.4 Nonrecursive Descent Analysis
-3.5 Bottom-up Parsing
--Bottom-up Parsing
-3.6 LR Parsing
--3.6.6 Characteristics of LR Parsing
--3.6.7 Non Ambiguous and Not LR Context-Free Grammars
-4.1 Syntax-Directed Definitions
--4.1.2 Attribute Dependency Graphs and Ordering the Evaluation of Attributes
--Syntax-Directed Definitions
-4.2 Bottom-Up Calculation of S Attribute
--4.2.1 Bottom-Up Calculation of S-Attributed
-4.3 L-Attributed Definitions
--4.3.1 L-Attributed Definitions
--4.3.3 Design of Predictive Translator
--L-Attributed Definitions
-4.4 Bottom-Up Parsing of L-Attributed Translation
--4.4.1 Bottom-Up Parsing of L-Attributed Translation
--4.4.2 Simulate the Parsing of Inherited Properties
--Bottom-Up Parsing of L-Attributed Translation
-5.1 Overview
--Overview
-5.2 Global Stack Storage
-5.3 Calling Sequences
-5.4 Non Local Names
--5.4 Non Local Names and dynamic scope
--Non Local Name
-6.1 Overview of Intermediate Code Generation
--6.1 Overview of Intermediate Code Generation
-6.2 Declaration Statements
-7.1 Issues in the Design of Code Generator
--7.1 Issues in the Design of Code Generator
-7.2 Target Machine
--Target Machine
-7.3 Basic Blocks and Flow Graphs
--7.3 Basic Blocks and Flow Graphs
-7.4 A Simple Code Generator
-8.1 Demonstration of Compiler Framework based on Python
--8.1 Demonstration of Compiler Framework based on Python
-8.2 Basic
--8.2.4 SA
-8.3 SimpleJava