LLVM编译过程

2023-09-07  本文已影响0人  wu大维

Clang

Clang是一个由Apple主导编写,基于LLVM的C/C++/Objective-C编译器

2013年4月,Clang已经全面支持C++11标准,并开始实现C++1y特性(也就是C++14,这是C++的下一个小更新版本)。Clang将支持其普通lambda表达式、返回类型的简化处理以及更好的处理constexpr关键字。

Clang是一个C++编写、基于LLVM、发布于LLVM BSD许可证下的C/C++/Objective-C/Objective-C++编译器。它与GNU C语言规范几乎完全兼容(当然,也有部分不兼容的内容,包括编译命令选项也会有点差异),并在此基础上增加了额外的语法特性,比如C函数重载(通过attribute((overloadable))来修饰函数),其目标(之一)就是超越GCC

内部设计与实现:

一个不可移植的代码库;一个为C语言Objective-C、C++、Objective-C++设计的非通用(Non general-purpose)的语法解析器;与C/C++/Objective-C及它们的衍生语言具有高度一致性;

GCC(GNU Compiler Collection,GNU编译器套件)是由GNU开发的编程语言编译器。GNU编译器套件包括C、C++、 Objective-CFortranJavaAdaGo语言前端,也包括了这些语言的库(如libstdc++,libgcj等。)

GCC的初衷是为GNU操作系统专门编写的一款编译器。GNU系统是彻底的自由软件。此处,“自由”的含义是它尊重用户的自由。

Clang 的特性:
  1. 快:通过编译 OS X 上几乎包含了所有 C 头文件的 carbon.h 的测试,包括预处理 (Preprocess),语法 (lex),解析 (parse),语义分析 (Semantic Analysis),抽象语法树生成 (Abstract Syntax Tree) 的时间,Clang 是 Apple GCC 4.0 的 2.5x 快。(2007-7-25)

  2. 内存占用小:Clang 内存占用是源码的 130%,Apple GCC 则超过 10x。

  3. 诊断信息可读性强:我不会排版,推荐去网站观看。其中错误的语法不但有源码提示,还会在错误的调用和相关上下文的下方有~~~~~和 ^ 的提示,相比之下 GCC 的提示很天书。

  4. GCC 兼容性。

  5. 设计清晰简单,容易理解,易于扩展增强。与代码基础古老的 GCC 相比,学习曲线平缓。

  6. 基于库的模块化设计,易于 IDE 集成及其他用途的重用。由于历史原因,GCC 是一个单一的可执行程序编译器,其内部完成了从预处理到最后代码生成的全部过程,中间诸多信息都无法被其他程序重用。Clang 将编译过程分成彼此分离的几个阶段,AST 信息可序列化。通过库的支持,程序能够获取到 AST 级别的信息,将大大增强对于代码的操控能力。对于 IDE 而言,代码补全、重构是重要的功能,然而如果没有底层的支持,只使用 tags 分析或是正则表达式匹配是很难达成的。

LLVM

LLVM是一个编译器(确切的说是一套框架+基于框架的一些编译器实现,如clang),是当下很先进的一套编译系统。特别对于C/C++/Objective-C等语言而言,更是如此。

当然它也不止于此,它也支持JIT,以及很多非C家族的语言。

LLVM之所以优秀,在于以下几点:

LLVM编译

上一篇下一篇

猜你喜欢

热点阅读