LLVM 笔记(三)—— 了解传统编译器设计

ilocker:关注 Android 安全(新手) QQ: 2597294287

传统的静态编译器 (如大多数的 C 语言编译器) 通常将编译工作分为三个阶段,分别由三个组件来完成:前端、优化器和后端。

 

前端负责解析源代码、检查错误,最后建立一个特定语言的抽象语法树 (AST) 来表示输入的代码。通常 AST 要转换为一种中间代码,优化器针对中间代码进行一系列优化,后端再根据中间代码生成最后的目标指令。

关于 AST,可以参考:Kaleidoscope: Implementing a Parser and AST

优化器负责做各种各样的变换来努力改善代码的运行时间,比如消除冗余计算。后端 (也叫代码生成器) 负责生成最终的目标指令。对于后端来说,除了要保证生成正确的代码之外,还要负责根据不同目标平台的特点生成性能尽可能好的代码。后端通常由指令选择 (instruction selection)、寄存器分配 (register allocation) 和指令调度 (instruction scheduling) 等几个部分组成。

上述编译器模式同样适用于解释器和 JIT 编译器。JAVA 虚拟机 (JVM) 也是这种模式的实现,它是利用 Java 字节码作为前端和优化器之间的接口。

参考:《The Architecture of Open Source Applications

原文地址:https://www.cnblogs.com/ilocker/p/4897899.html