编译器设计

编译器:一种计算机程序,负责将一种语言编写的程序转换为另一种编写的程序,将内容从源语言映射到目标语言

编译器前端:处理源语言

编译器后端:处理目标语言,目标语言通常是某种处理器的指令集

指令集:处理器支持的操作的集合,指令集的总体设计称为指令集系统结构(Instruction Set Architecture ISA)

形式化结构:链接前端和后端,用一种中间形式来表现程序,中间形式的语言大程度独立于源语言和目标语言(IR,编译器使用一些数据结构表示它处理的代码)

优化器:用于改进转换,分析并重写中间形式

解释器:将一种可执行规格作为输入,产生的输出是执行该规格的结果

虚拟机:是针对某种处理器的模拟器,是针对该机器指令集的解释器

编译器的基本原则

  • 编译器必须保持被编译程序的语义

  • 编译器必须以某种可察觉的方式改进输入程序

编译器三段式

前端

  • 词法分析器 编译器中的一趟,将字符构成的串转换为单词构成的流

  • 语法分析器 编译器中的一趟,判断输入流是否是源语言的一个句子

  • 类型检查 编译器中的一趟,检查输入程序中对名字的使用在类型方面是否一致

优化器

  • 分析
    • 数据流分析 在编译时推断运行时值的流动, 通常需要解一个联立方程组,该方程组是根据被转换代码的结构得出的
    • 相关性分析 使用数论中的测试方法来推断下标表达式的可能值,他用于消除引用数组元素时的歧义
  • 转换
    • 将代码重写为更高效的形式

后端

ILOC(Intermediate language for an optimizing Compiler优化编译器的中间语言)

  • 指令选择

代码生成的第一阶段会将IR操作重写为目标机操作,这个过程称为指令选择(instruction selection),会将IR操作在各自的上下文洪映射为一个或多个目标机操作

r$$arp$$ 表示指定寄存器位置 @a,@b,@c表示偏移量a,b,c

虚拟寄存器 一个符号寄存器名,编译器用其表示某个值可以保存在寄存器中

  • 寄存器分配

在指令选择期间,编译器有意的选择忽略了目标机寄存器数目有限的事实.加订有足够的寄存器存在,并且使用了所谓的虚拟寄存器

  • 指令调度

为产生执行快速的代码,代码生成器可能需要重排操作,以照顾目标机在特定方面的性能约束,不同的操作,执行时间可能是不同的

编译器多轮

results matching ""

    No results matching ""