Introduction
-
编译器是软件,将源程序编译成目标程序,学习编译原理有助于理解程序内部如何执行,设计出更高效的程序,同时也有助于调试代码,分析错误原因。
-
源代码经过词义分析,语法分析生成语法树,再经过翻译生成中间代码,编译器会优化,然后再生成目标代码。这一步工作就是编译。
-
Compiler vs Interpreter
Compiler 将源程序转为目标程序,并输出错误调试信息,转换过程是对所有的代码进行转换并做优化。编译执行的代码更快。
Interpreter也是将源程序转为目标程序,但不同的是,转换过程是一句一句的转换并且没有做优化。动态执行易于调试,可移植性好。
-
Phases of Compiler
主要分为两个阶段,分别是分析阶段和代码生成阶段。
分析阶段:Source program \(\rightarrow\) Lexical analyzer \(\rightarrow\) Syntax analyzer \(\rightarrow\) Semantic analyzer \(\rightarrow\)
代码生成阶段: Intermediate code generator \(\rightarrow\) Code optimizer \(\rightarrow\) Code generator \(\rightarrow\) Target program
-
编译过程小例子:position := initial + rate * 60;
-
Lexical analysis (词义分析
- keywords:关键词
- Identifier: position, initial, rate(标识符)
- operator::=, +, *
- Constant: 60
- Separators:空格符,tab键,换行符
- Delimiters:(),:;=>;>>
-
Syntax analysis (语法分析
生成语法树,个人感觉有点像中缀表达式对应的树
-
Semantic analysis (语义分析
分析检查程序中的每个操作是否实际可执行,比如运算符的两个操作数的类型是否一致(可做类型转换),if是否有else与其匹配(报错误信息,调试信息)etc...
-
Intermediate code generator
生成三地址码(最多三个地址),可以看出和机器指令很接近。
-
大致过程如下:
-
-
Compiler-Construction Tools:
-
Scanner generator: Lex(生成词法分析器的工具,输入是描述词法分析器的文件,输出经过编译生成词法分析器)
-
Parser generator: Yacc(生成语法分析器的工具,同上)
-
Syntax-directed translation engines
-
Automatic code generators
-
Data-flow engines
-