LLVM 与 Clang 介绍

{ 撰文/guest }

LLVM 是 Low Level Virtual Machine 的简称,这个库提供了与编译器相关的支持,能够进行程序语言的编译期优化、链接优化、在线编译优化、代码生成。简而言之,可以作为多种语言编译器的后台来使用。如果这样还比较抽象的话,介绍下 Clang 就知道了:Clang 是一个 C++ 编写、基于 LLVM、发布于 LLVM BSD 许可证下的 C/C++/Objective C/Objective C++ 编译器,其目标(之一)就是超越 GCC。

Clang 开发事出有因,Wiki 介绍如下:

Apple 使用 LLVM 在不支持全部 OpenGL 特性的 GPU (Intel 低端显卡) 上生成代码 (JIT),令程序仍然能够正常运行。之后 LLVM 与 GCC 的集成过程引发了一些不快,GCC 系统庞大而笨重,而 Apple 大量使用的 Objective-C 在 GCC 中优先级很低。此外 GCC 作为一个纯粹的编译系统,与 IDE 配合很差。加之许可证方面的要求,Apple 无法使用修改版的 GCC 而闭源。于是 Apple 决定从零开始写 C family 的前端,也就是基于 LLVM 的 Clang 了。

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 分析或是正则表达式匹配是很难达成的。

当然,GCC 也有其优势:

相信介绍到这里大家能够对 Clang 和 LLVM 有所了解了。除去 Clang 之外,LLVM 还被用在 Gallium3D 中进行 JIT 优化,Xorg 中的 pixman 也有考虑使用 LLVM 来优化执行速度,llvm-lua 使用 LLVM 来编译 Lua 代码,gpuocelot 使用 LLVM 可以令 CUDA 程序无需重新编译即可运行在多核 X86CPU、IBM Cell、支持 OpenCL 的设备之上... 我个人感觉 Apple 在开源界口碑较差(也许是我的错觉?),不过 Apple 也为开源界贡献了不少,Webkit,OpenCL(虽说只是个标准),Clang。我最为佩服的是虽然出身于命令行之上的 Unix 族系统,但有魄力写出自成体系的图形栈,其图形界面优美而人性化,可谓也为开源界贡献了自己的精神与思想。 对于 Clang 这个很有潜力的项目,我希望其 C++ 支持(尤其是 template 支持)能够早日完善。因为 GCC 在 template 出错时的诊断信息如同小说一般...

{ Thanks guest. }

Read More:

  • No related posts

24 Comments

  1. 1 Iven Day Commented @ 2010-02-09 20:57Reply to this comment

    正好在 Phoronix 看到几篇关于这个的新闻,有点看不懂呢,学习一下~

  2. 2 黑日白月 Commented @ 2010-02-09 21:19Reply to this comment

    呵呵,这年头到处流行 JIT 编译啊,从 JavaScript 到 C 都是~

    题外话: GCC 正式开始融合 Go 语言了……

  3. 3 idiot Commented @ 2010-02-09 21:50Reply to this comment

    @黑日白月 不知道go有没有gui支持哦 看了些例子 到想试一下~

  4. 4 自由建客 Commented @ 2010-02-09 22:34Reply to this comment

    FreeBSD 好像就准备上了。

  5. 5 ihipop Commented @ 2010-02-09 23:23Reply to this comment

    其实我一直搞不清khtml和webkit的关系~怎么就变过去了!?

  6. 6 qii Commented @ 2010-02-09 23:33Reply to this comment

    @ihipop: apple想他的mac系统摆脱ms的ie,打算自己写个浏览器,拿现成的khtml引擎,那啥弄分支之类的弄出了webkit,然后就做出了safari... 再后来khtml和konqueror因为实在太废,没落了...

  7. 7 qii Commented @ 2010-02-09 23:37Reply to this comment

    据说apple都是因为实在没路了,才会去开源界找办法。他的mac系统基于unix也是无奈之举... 据说而已.据说而已

  8. 8 crown.hg Commented @ 2010-02-10 8:34Reply to this comment

    编译界的技术“围城”。

  9. 9 sblieve Commented @ 2010-02-10 8:52Reply to this comment

    两个FreeBSD替换gcc的链接

    FreeBSD CLang/LLVM项目终于进svn了

    http://blog.delphij.net/archives/2009/06/freebsd-clangll.html

    Clang/LLVM replacing GCC in the FreeBSD base system

    http://www.reddit.com/r/programming/comments/8jr7e/clangllvm_replacing_gcc_in_the_freebsd_base_system/

  10. 10 sblieve Commented @ 2010-02-10 8:54Reply to this comment

    怎么第二个链接把下划线过滤掉了

    测试

    两端加引号 "http://www.reddit.com/r/programming/comments/8jr7e/clangllvmreplacinggccinthefreebsdbase_system/"

    两端加尖括号

  11. 11 sblieve Commented @ 2010-02-10 8:55Reply to this comment

    发的 Clang/LLVM replacing GCC in the FreeBSD base system 的链接都是错的

  12. 12 Shaowei.Wang Commented @ 2010-02-10 9:02Reply to this comment

    编译的时候ld出最后的那个clang可执行文件时,那个叫慢啊。。。。

  13. 13 huangda1982 Commented @ 2010-02-10 9:20Reply to this comment

    如果连C都JIT了那还是C了吗?

  14. 14 Toy Commented @ 2010-02-10 10:05Reply to this comment

    @sblieve: 我已为您修正了。

  15. 15 guest Commented @ 2010-02-10 10:20Reply to this comment

    LLVM提供的是一套与编译器相关的框架,可以提供JIT相关的支持,但不是必须JIT。CLANG基于LLVM,但仍然是一个静态编译器

  16. 16 ln Commented @ 2010-02-10 10:30Reply to this comment

    期盼 FreeBSD 早日用上 clang/llvm,把 GPL 的残余踢出去!

  17. 17 JSK Commented @ 2010-02-10 11:35Reply to this comment

    什么叫“语法(lex)”? 要么叫“词法分析(lexical analysis)”,要么叫“扫描(scanning)”... - -

  18. 18 danath Commented @ 2010-02-10 12:41Reply to this comment

    C++模板出错信息难读是因为错误产生的逻辑层次太低,本来C++0x的concept是个解决办法,但这个新功能已经被抛弃了,十分可惜......

    因此我比较怀疑:把改善模板出错信息的希望寄托在Clang上,恐怕不是很有前途。

  19. 19 guest Commented @ 2010-02-10 13:57Reply to this comment

    @JSK JSK正解

  20. 20 stlxv Commented @ 2010-02-10 15:17Reply to this comment

    “GCC 是一个单一的可执行程序编译器” 这话十分之不对……

  21. 21 guest Commented @ 2010-02-10 15:40Reply to this comment

    @stlxv 翻译过来之后语义不大合适,原文为 GCC is built as a monolithic static compiler, which makes it extremely difficult to use as an API and integrate into other tools. 大意是说与GCC相比,CLANG的功能可以通过库调用来执行(GCC的交互是标准输入输出)

  22. 22 大头龙仔 Commented @ 2010-02-10 23:40Reply to this comment

    嗯,FreeBSD因为GCC是GPL协议,所以将会慢慢地转向LLVM

  23. 23 Mike Commented @ 2010-02-11 2:14Reply to this comment

    对于clang的ide功能,我觉得没用。 有很多情况ide还是需要动态分析代码。比如模板。

  24. 24 larz Commented @ 2010-02-11 5:18Reply to this comment

    对clang来说,C/Objective C/Objective C++才是一等公民,C++是二等公民,因为apple更偏好自己的语言