万字长文+独家思维导图!让你懂透编译原理

导论

翻译程序(编译程序是翻译程序中的一种)和解释程序; 解释型语言:代码每次运行都需要解释器翻译; java:代码先编译成字节码(.class文件),但字节码需要JVM解释执行。因此 Java 兼具编译和解释的特点:编译只发生一次,但运行时仍需解释器。 python:大部分 Python 解释器(如 CPython)也是先将代码编译成字节码(.pyc文件),再由解释器执行字节码。不过这个编译过程对用户透明,且字节码仍需解释执行,所以 Python 仍被视为解释型语言。

通常来说解释型语言不会生成独立的可执行文件,但是现代编译器会通过以下方式“模拟”可执行程序的效果: 开发者会使用工具将解释器和源代码/字节码打包成单个文件: Python:用PyInstaller或cx_Freeze生成.exe,但本质是将 Python 解释器和你的代码打包在一起,体积较大(几十 MB)。 Java:用jlink创建自定义 JRE,或将.jar文件封装为可执行文件(需 JRE 环境)。 这些“可执行文件”本质上是自解压程序+解释器+代码,运行时仍需要解释器,只是对用户透明。

语法分析(正规式和有限自动机)、词法分析(上下文无关文法)、语义分析、中间代码生成(三元式,四元式,逆波兰式、树形结构)、代码优化(程序的等价变换规则)、目标代码生成;

高级语言及其语法描述

高级语言的分类:强制式语言(过程式语言)、应用式语言、基于规则的语言、面向对象的语言; 字母表︰一个有穷字符集,记为∑ 字母表中每个元素称为字符 ∑上的字(也叫字符串、符号串) 是指由∑中的字符所构成的一个有穷序列 不包含任何字符的序列称为空字(空串),记为ε 用∑表示∑上的所有字的全体,包含空字ε 例如: 设 ∑={a, b}, 则 ∑={ε,a,b,aa,ab,ba,bb,aaa,……}

上下文无关文法、句型、句子、语言 最左推导和最右推导 语法树和二义性(如果一个文法存在某个句子对应两颗不同的语法树,则说这个文法是二义的) Chomsky于1956年建立形式语言体系,他把文法分成四种类型:0,1,2,3型

词法分析

视频

编译原理

第一章

命令式语言、申述式语言、面向对象语言
编译、解释 词法分析:输入:源程序,输出:单词
语法分析(“组词成句”):输入:token序列,输出:语法成分 语义分析(semantic analysis)一般和语法分析同时进行,成为语法制导翻译 中间代码生成 代码优化
局部优化:常量合并、公共子表达式的提取
循环优化:强度削减、代码外提
寄存器的利用
体系结构
存储策略
目标代码生成
表格管理
错误处理


第二章(高级语言及其文法)

G=(V,T,P,S)
https://www.bilibili.com/video/BV1P4411e7gm?t=2469.4&p=4 编译原理(Principles and Techniques of Compilers)

词法分析器的作用:
读入字符流,组成词素,输出词法单元序列
过滤空白、换行、制表符、注释等
将词素添加到符号表中

语法分析器的作用:
从词法分析器获得词法单元的序列,确认该序列是否可以由语言的文法生成
对于语法错误的程序,报告错误信息
对于语法正确的程序,生成语法分析树