语言如何实现
两种主要方式:
- Interpreters 解释器
- Compilers 编译器
区别:编译器做了更多预处理,解释器直接解释执行(“run as is”),预处理很少。
什么是编译器
将程序设计语言翻译成另一种的Program。
Source Program -> Compiler -> Target Program
input -> Target Program -> output
用途
除了Compiler,还可以做命令解释器等…
混合编译器
Hybrid Compiler
source program -> Translater -> intermediate program -> Virtual Machine -> output
最大特点:跨平台,针对不同平台设计不同的虚拟机,中间代码不受影响。
语言处理系统的处理过程
源程序 -> 预处理 -> 编译器处理 -> 汇编代码 -> 目标代码 -> 链接装载 -> 执行
编译的七个阶段
- Lexical Analyzer 词法分析
- Syntax Analyzer 语法分析
- Semantic Analyzer语义分析
- Intermediate code generator 中间代码生成
- Machine-independent code optimizer 机器无关代码优化
- Code generator 目标代码生成
- Machine-dependent Code Optimizer 机器相关代码优化
符号表 Symbol table:记录在程序中全部的变量名,函数名,常量等。
字符系统 -> 语法分析 -> 语法树 -> 语义分析 -> 丰富语法数(加上语义信息)-> 中间代码 -> 目标代码
词法分析
scan
将有意义的单元称作 token (词法单元)
e.g.
a[index]=4+2
a [ index ] = 4 + 2
- a identifier
- index identifier
- = assign
- + plus sign
- [ left bracket
- ] right bracket
- 4 number
- 2 number
语法分析
parsing
确定source program 的结构。
结果是语法树 (abstract) syntax tree 或者 分析树 parse tree
分析树
使用符号分析各个结构构成树形结构。
前后端交互——中间代码。
pass
对原程序的语法词法的一套分析(生成code之前),称为pass。
大多数编译器经历数个pass。
- frontend pass and backend pass
- scanning and parsing 生成语法树 & 中间代码 & 生成code