Romantics三大浪漫
- 一、编译原理
- 1.1 研究翻译的科学
- 1.2 编译器和解释器
- 1.3 编译的流程(JIT为例)
- 1.4 词法分析器
- 1.5 多有限状态机提取Token- 实现词法分析器lexer
- 1.6 实现流的peek和putBack操作
一、编译原理
本章目标: 提升编程能力
- 区别于面向研究人员、学者的编译原理教学,目标是让大家从更深层次理解程序语言架构、面向对象、算法和数据结构以及编程思想。
- 化繁为简,掌握思想、原理、编程技巧,弱化高等数学、逻辑学等。
- 为了教学用创造了一门语言TinyScript并手把手带大家实现。(多语言Java/Javascript)
1.1 研究翻译的科学
编译的作用:一种语言翻译
成另一种语言。
- 如高级语言->低级语言->机器语言
- 如硬件语言->电路布线
翻译的理解:只作用于形式语言
。
1.2 编译器和解释器
编译器:将源程序
编译成目标程序
。如C
解释器:同时接受源程序
和输入
,执行并返回输出
。如Javascript
混合编译器:如过去的JAVA
中间代码
更容易被翻译成目标程序
,优化空间更大- 中间语言的存在更利于编译器的实现
- 让虚拟机处理复杂的执行环境 (跨平台)
即时编译器JIT(Just-in-time compiler):一种提高效率的方法,中间代码不是直接执行,而是先被编译成机器码再执行。如现在的JAVA
交叉编译:在一个平台编译产生多个平台的可执行代码。
1.3 编译的流程(JIT为例)
分层架构设计:关注度分离
(每层都有意义)、层足够强大
(每层优质的数据结构)
分析一对源程序进行分析形成中间表示(抽象语法树、符号表
)
–词法分析
–语法分析
–语义分析
–翻译
综合一根据中间表示生成目标语言,提供运行环境等
–中间语言
–代码优化
–机器码生成
–运行环境及其他
Step1:词法分析(分词短句+判断词性)
Step2:语法分析(语法规则)
Step3:语义分析
Step4:翻译为中间代码
Step5:生成机器码
Step6:提供运行时环境
- 有的编译器将代码编译成机器码,按照操作系统的约定编译成一个应用,运行成为操作系统的
进程
- 有的编译器将代码编译成中间代码 (字节码、三地址代码等) ,然后在操作系统中启动一个
虚拟容器
(进程)来执行他们 JIT
编译器一边执行中间代码,一边编译他们
1.4 词法分析器
词法分析:将字符流
转成符号流Token
。{输入:源代码 (字符流) 输出: 符号流 }
符号Token : 词法分析的结果,每个字符是一个词法单元,即元组(一个字符串 : 一个词性描述)
。
词性描述 : Keyword(关键字)、Variable(变量)、Operator (操作符)、Bracket (括号)、String(字符串)、Float(浮点数)、Boolean(布尔)
1.5 多有限状态机提取Token- 实现词法分析器lexer
Token.java实现各个有限状态机独立提取Token
Lexer.java实现多个有限状态机的词法分析器
TokenType.java实现词法分析器的接口
1.6 实现流的peek和putBack操作
流 Stream:随着时间推移逐渐产生的可用数据序列。
类比:工厂流水线上需要处理的一个个产品。 每个工人从流中拿起物件进行加工再放回去 (流的处理节点)。
作用: 抽象出像工厂流水线一样处理数据的标准过程。