摘自:<<编译器设计 第二版>>, 支持正版。
1.1、简介
-
1、编译器:用于转换其他计算机程序的计算机程序。
-
2、指令集:处理器支持的操作的集合,指令集的总体设计通常称为指令集系统结构(Instruction Set Architecture, ISA)。
-
3、虚拟机:虚拟机是针对某种处理器的模拟器,它是针对 该机器指令集的解释器。
-
4、编译的基本原则
- a、编译器必须保持被编译程序的语义。
- b、编译器必须以某种可觉察的方式改进输入程序。
1.2 编译器结构
-
1、编译器基本分解是以下两个主要部分的设计:前端和后端。
前端和后端- a、前端专注于理解源语言的程序
- b、后端专注于将程序映射到目标机。
-
2、IR:编译器使用一些数据结构来表示它处理的代码,这种形式称为中间表示( Intermediate Representation, IR)。
-
3、重定目标:改变编译器使之针对 新处理器生成代码的任务,通常称为将该编译器重定目标。
-
4、优化器:编译器的中间部分称为优化器,负责分析并转换IR,以改进IR。
三阶段编译器 -
5、三阶段结构表示了经典 的优化编译器。实际上,每个阶段都划分为若干趟。编译器的三个阶段和其中的各趟处理共享了同一个基础设施。
典型编译器的结构
1.3 转述概述
1.3.1、前端
在编译器将源代码转换目标程序之前,它必须理解源代码的语法和语义。它会根据语法和语义,判断输入的代码是否是良构的。如果前端发现代码是有效的,它会以编译器的IR格式来建立代码的一种表示,否则,它向用户回报诊断错误信息,以标识该代码的问题。
步骤
检测语法
数学上,源语言是一个字符串的集合,通常是无限集,由某种规则的有限集定义(语法)。前端中有趟独立的处理,分别称为词法分析器和语法分析器,来判断输入代码实际是否属于语法定义的有效程序集合。
词法分析器
- 1、例如在英语中,许多句子有下述形式。其中verb和endmark是词类,而Sentence、Subject是语法变量。符号
->
读作"导出",意味着右侧的一个实例可以抽象为左侧的语法变量。
Sentence (句子) -> Subject (主语) verb(动词) Object(宾语) endmark(结束标点符号)
- 2、理解以上案例句子语法时,第一步是标识输入程序中的各个单词,并将每个单词归入对应的词类,是词法分析器的执行该操作。
中间表示
扩展
- 词法分析器:将字符构成的串转换为单词构成的流
- 语法分析器:判断输入流是否是源语言的一个句子
- 类型检查:检查输入程序中对名字的使用在类型方面是否一致
网友评论