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 的特性:
- 快:通过编译 OS X 上几乎包含了所有 C 头文件的 carbon.h 的测试,包括预处理 (Preprocess),语法 (lex),解析 (parse),语义分析 (Semantic Analysis),抽象语法树生成 (Abstract Syntax Tree) 的时间,Clang 是 Apple GCC 4.0 的 2.5x 快。(2007-7-25)
- 内存占用小:Clang 内存占用是源码的 130%,Apple GCC 则超过 10x。
- 诊断信息可读性强:我不会排版,推荐去网站观看。其中错误的语法不但有源码提示,还会在错误的调用和相关上下文的下方有~~~~~和^的提示,相比之下 GCC 的提示很天书。
- GCC 兼容性。
- 设计清晰简单,容易理解,易于扩展增强。与代码基础古老的 GCC 相比,学习曲线平缓。
- 基于库的模块化设计,易于 IDE 集成及其他用途的重用。由于历史原因,GCC 是一个单一的可执行程序编译器,其内部完成了从预处理到最后代码生成的全部过程,中间诸多信息都无法被其他程序重用。Clang 将编译过程分成彼此分离的几个阶段,AST 信息可序列化。通过库的支持,程序能够获取到 AST 级别的信息,将大大增强对于代码的操控能力。对于 IDE 而言,代码补全、重构是重要的功能,然而如果没有底层的支持,只使用 tags 分析或是正则表达式匹配是很难达成的。
当然,GCC 也有其优势:
- 支持 JAVA/ADA/FORTRAN
- 当前的 Clang 的 C++ 支持落后于 GCC,参见 http://clang.llvm.org/cxx_status.html。(近日 Clang 已经可以自编译,见 http://www.phoronix.com/scan.php?page=news_item&px=Nzk2Mw)
- GCC 支持更多平台
- GCC 更流行,广泛使用,支持完备
- GCC 基于 C,不需要 C++ 编译器即可编译
相信介绍到这里大家能够对 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:
正好在 Phoronix 看到几篇关于这个的新闻,有点看不懂呢,学习一下~
呵呵,这年头到处流行 JIT 编译啊,从 JavaScript 到 C 都是~
题外话: GCC 正式开始融合 Go 语言了……
@黑日白月 不知道go有没有gui支持哦 看了些例子 到想试一下~
FreeBSD 好像就准备上了。
其实我一直搞不清khtml和webkit的关系~怎么就变过去了!?
@ihipop: apple想他的mac系统摆脱ms的ie,打算自己写个浏览器,拿现成的khtml引擎,那啥弄分支之类的弄出了webkit,然后就做出了safari... 再后来khtml和konqueror因为实在太废,没落了...
据说apple都是因为实在没路了,才会去开源界找办法。他的mac系统基于unix也是无奈之举... 据说而已.据说而已
编译界的技术“围城”。
两个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/
怎么第二个链接把下划线过滤掉了
测试
两端加引号 "http://www.reddit.com/r/programming/comments/8jr7e/clangllvmreplacinggccinthefreebsdbase_system/"
两端加尖括号
发的 Clang/LLVM replacing GCC in the FreeBSD base system 的链接都是错的
编译的时候ld出最后的那个clang可执行文件时,那个叫慢啊。。。。
如果连C都JIT了那还是C了吗?
@sblieve: 我已为您修正了。
LLVM提供的是一套与编译器相关的框架,可以提供JIT相关的支持,但不是必须JIT。CLANG基于LLVM,但仍然是一个静态编译器
期盼 FreeBSD 早日用上 clang/llvm,把 GPL 的残余踢出去!
什么叫“语法(lex)”? 要么叫“词法分析(lexical analysis)”,要么叫“扫描(scanning)”... - -
C++模板出错信息难读是因为错误产生的逻辑层次太低,本来C++0x的concept是个解决办法,但这个新功能已经被抛弃了,十分可惜......
因此我比较怀疑:把改善模板出错信息的希望寄托在Clang上,恐怕不是很有前途。
@JSK JSK正解
“GCC 是一个单一的可执行程序编译器” 这话十分之不对……
@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的交互是标准输入输出)
嗯,FreeBSD因为GCC是GPL协议,所以将会慢慢地转向LLVM
对于clang的ide功能,我觉得没用。 有很多情况ide还是需要动态分析代码。比如模板。
对clang来说,C/Objective C/Objective C++才是一等公民,C++是二等公民,因为apple更偏好自己的语言
嗯。对比eclipse的java编辑器和xcode的编辑器就会发现eclipse编写java太方便了,xcode每次要build后才能指出代码中的语法错误,而eclipse这个过程是实时的,多半也是ast的功劳。
请问Clang在Windows下如何配置?
@大头龙仔: 其实{Open,Net}BSD已经开始用PCC了。。
clang的IDE支持反到让人有点不快。 因为提示太密集,时常还没等我写完就冒出来,非常烦人。
Clang 风头很劲