经典编译器组成(前端+优化器+后端)以及LLVM和Clang简介

目录

1,典型的编译器结构:前端+优化器+后端

2,LLVM 简介

3,Clang简介


1,典型的编译器结构:前端+优化器+后端

一个传统的静态编译器(比如C 编译器)最普遍的设计是分为三个部分,如下图所示:

  • 前端, front end:解析源码,检查错误(词法分析(lexical analysis), 语法分析(syntax analysis), 语义分析(semantic analysis)),所以前端又称为分析阶段。并且构建一个特定于语言的抽象语法树(Abstract Syntax Tree,AST)来代表输入的代码。
  • 优化器,optimizer :负责进行各种转换尝试,改善代码的执行时间,比如消除冗余计算。通常或多或少与语言及目标无关。
  • 后端,back end:代码产生器,将代码映射到目标指令集,除了编写正确的代码外,它还负责生成利用所支持体系结构的不寻常特性的良好代码。一个编译器后端的通用部分包含指令选择,寄存器分配,及指令调度(instruction selection, register allocation, and instruction scheduling)。

Three Major Components of a Three-Phase Compiler

 这种传统的前端+优化器+后端的设计带来的好处是,支持多种多种编程语言(比如C, Fortan, Ada)作为source code,以及支持多种目标架构(X86, PowerPC , ARM)。除了使用公共的优化器外,可以灵活地选择源码类型以及目标架构。比如可以使用C语言作为源码输入,选择ARM架构的代码生成器作为后端,如果想使用一种新的编程语言,无需改变优化器和ARM 的代码生成器,只需编写该语言的前端部分即可。极大地提高了编译器的灵活性和复用性。

该设计的另一个优点(直接来自于可重定向性)是,与只支持一种源语言和一个目标语言相比,编译器可以为更广泛的程序员提供服务。对于开源项目来说,这意味着有更大的潜在贡献者社区可以利用,这自然会对编译器进行更多的增强和改进。这就是为什么服务于许多社区的开源编译器(如GCC)倾向于生成更好优化的机器代码,而不是更窄的编译器(如FreePASCAL)。对于专有编译器则不是这样,其质量与项目预算直接相关。例如,Intel ICC Compiler因其生成的代码质量而广为人知,尽管它服务的受众范围很窄。

最后一个优势是实现前端所需的技术不同于优化器和后端所需的技术。将它们分开使“前端开发人员”更容易增强和维护他们的编译器部分。虽然这是一个分工问题,而不是技术问题,但它在实践中非常重要,特别是对于那些希望尽可能减少贡献障碍的开源项目。

经典编译器组成(前端+优化器+后端)以及LLVM和Clang简介_第1张图片

 总结来说,前端+优化器+后端的结构有三大好处:灵活程度高,组件复用率高,维护成本低

2,LLVM 简介

LLVM简介原文,有兴趣的同学可以直接读原文:

LLVMicon-default.png?t=N2N8http://www.aosabook.org/en/llvm.html

LLVM是开源的编译器(compiler)架构,以C++编写而成,用于优化以随意程序语言编写的程序的编译时间(compile-time)、链接时间(link-time)、执行时间(run-time)以及空暇时间(idle-time),对开发人员保持开放,并兼容已有脚本。LLVM的设计就采用了上述前端+优化器+后端的设计。如下图所示:

经典编译器组成(前端+优化器+后端)以及LLVM和Clang简介_第2张图片

基于这个认知,我们可以认为 LLVM 包括了两个概念:一个广义的 LLVM 和一个狭义的 LLVM 。广义的 LLVM 指的是一个完整的 LLVM 编译器框架系统,包括了前端、优化器、后端、众多的库函数以及很多的模块;而狭义的 LLVM 则是聚焦于编译器后端功能的一系列模块和库,包括代码优化、代码生成、JIT 等。

整体的编译器架构就是 LLVM 架构:

  • Clang 大致可以对应到编译器的前端,主要处理一些和具体机器无关的针对语言的分析操作;
  • 编译器的优化器和后端部分就是之前提到的 LLVM 后端,即狭义的 LLVM。

此外,由于 LLVM 的命名最早源自于底层虚拟机(Low Level Virtual Machine) 的首字母缩写,但这个项目的范围并不局限于创建一个虚拟机,这个缩写导致了大量的疑惑。LLVM 成长之后已成为众多编译工具及低级工具技术的统称,使得这个名字变得更不贴切,所以开发者决定放弃这个缩写的涵义,现在 LLVM 已独立成为一个品牌,适用于 LLVM 下的所有项目,包括 LLVM 中介码、LLVM 除错工具、LLVM C++ 标准库等。

(参考:简述 LLVM 与 Clang 及其关系_艾蔓草的博客-CSDN博客)

经典编译器组成(前端+优化器+后端)以及LLVM和Clang简介_第3张图片

3,Clang简介

参考文章:Clang C Language Family Frontend for LLVMicon-default.png?t=N2N8https://clang.llvm.org/

Clang 是一个 C、C++、Objective-C 和 Objective-C++ 编程语言的编译器前端,采用底层虚拟机(LLVM)作为后端。

(1)Clang 采用的是 BSD 协议的许可证,而 GCC 采用的是 GPL 协议,显然前者更为宽松;(2)Clang 是一个高度模块化开发的轻量级编译器,编译速度快、占用内存小、有着友好的出错提示。
 

参考文章:

Clang C Language Family Frontend for LLVM

 Front and Back End in Compiler easy understanding example 5

简述 LLVM 与 Clang 及其关系_艾蔓草的博客-CSDN博客 

https://www.cnblogs.com/yutingliuyl/p/7080832.html 

The Architecture of Open Source Applications: LLVM 

你可能感兴趣的:(前端)