美文网首页
LLVM和GCC的区别

LLVM和GCC的区别

作者: IRONYT | 来源:发表于2016-09-04 00:00 被阅读811次

GCC: GNU Compiler Collection
GCC属于传统编译器,传统编译器的工作原理基本上都是三段式的,可以分为前端(Frontend)、优化器(Optimizer)、后端(Backend)。前端负责解析源代码,检查语法错误,并将其翻译为抽象的语法树(Abstract Syntax Tree)。优化器对这一中间代码进行优化,试图使代码更高效。后端则负责将优化器优化后的中间代码转换为目标机器的代码,这一过程后端会最大化的利用目标机器的特殊指令,以提高代码的性能。
事实上,不光静态语言如此,动态语言也符合上面这个模型,例如Java。Java Virtual Machine也利用上面这个模型,将Java代码翻译为Java bytecode。这一模型的好处是,当我们要支持多种语言时,只需要添加多个前端就可以了。当需要支持多种目标机器时,只需要添加多个后端就可以了。对于中间的优化器,我们可以使用通用的中间代码。
这种三段式的结构还有一个好处,开发前端的人只需要知道如何将源代码转换为优化器能够理解的中间代码就可以了,他不需要知道优化器的工作原理,也不需要了解目标机器的知识。这大大降低了编译器的开发难度,使更多的开发人员可以参与进来。
虽然这种三段式的编译器有很多有点,并且被写到了教科书上,但是在实际中这一结构却从来没有被完美实现过。做的比较好的应该属Java和.NET虚拟机。虚拟机可以将目标语言翻译为bytecode,所以理论上讲我们可以将任何语言翻译为bytecode,然后输入虚拟机中运行。但是这一动态语言的模型并不太适合C语言,所以硬将C语言翻译为bytecode并实现垃圾回收机制的效率是非常低的。
GCC也将三段式做的比较好,并且实现了很多前端,支持了很多语言。但是上述这些编译器的致命缺陷是,他们是一个完整的可执行文件,没有给其它语言的开发者提供代码重用的接口。即使GCC是开源的,但是源代码重用的难度也比较大。

LLVM: Low Level Virtual Machine
LLVM最初是[Low Level Virtual Machine]的缩写,定位是一个虚拟机,但是是比较底层的虚拟机。它的出现正是为了解决编译器代码重用的问题,LLVM一上来就站在比较高的角度,制定了LLVM IR这一中间代码表示语言。LLVM IR充分考虑了各种应用场景,例如在IDE中调用LLVM进行实时的代码语法检查,对静态语言、动态语言的编译、优化等。
LLVM与GCC在三段式架构上并没有本质区别。LLVM与其它编译器最大的差别是,它不仅仅是Compiler Collection,也是Libraries Collection。举个例子,假如说我要写一个XYZ语言的优化器,我自己实现了PassXYZ算法,用以处理XYZ语言与其它语言差别最大的地方。而LLVM优化器提供的PassA和PassB算法则提供了XYZ语言与其它语言共性的优化算法。那么我可以选择XYZ优化器在链接的时候把LLVM提供的算法链接进来。LLVM不仅仅是编译器,也是一个SDK。
Clang错误提示比GCC友好得多。

相关文章

  • LLVM和GCC的区别

    GCC: GNU Compiler CollectionGCC属于传统编译器,传统编译器的工作原理基本上都是三段...

  • 深入浅出Category(一)

    @property和Ivar的区别 苹果将默认编译器从GCC转换为LLVM(low level virtual m...

  • clang6.0编译环境安装

    1.clang6.0 需要 llvm 2.llvm需要gcc 4.8+ 3.gcc4.8+需要GMP 4.2+, ...

  • GCC、Clang和LLVM

    GCC GCC(GNU Compiler Collection,GNU编译器套装),是一套由 GNU 开发的编程语...

  • GCC LLVM

    面试遇到过问这个的 很多年来,苹果一直使用GCC作为底层编译器,现在已经全面转换到新的LLVM编译器。LLVM的代...

  • dragonegg基于mips64el适配gcc-4.9.3、l

    drgonegg-3.3http://dragonegg.llvm.org/ 支持gcc-4.8、llvm-3.3...

  • LLVM(1)-编译自己的LLVM和Clang

    1、引言 作为一名iOS开发,很难不从各种渠道听说关于LLVM的消息,如早年编译器从GCC过度到LLVM-GCC,...

  • GCC,LLVM,Clang

    在XCode中,我们经常会看到这些编译选项(如下图),有些人可能会有些茫然,本文将对GCC4.2、LLVM GCC...

  • LLVM和iOS文件编译过程

    编译器背景 GCC LLVM LLVM比gcc的优势是模块化,中间端都是统一的,添加新的语言的话,只需要添加一个新...

  • Compiler-RT 7.0.1 功能简介

    ☞ LLVM 7.0.1 LLVM中的Compiler-RT相当于GCC中的libgcc,为目标平台提供其硬件不支...

网友评论

      本文标题:LLVM和GCC的区别

      本文链接:https://www.haomeiwen.com/subject/vtllettx.html