
GCC和LLVM都是编译工具链的一种实现
对于LLVM而言,
- 编译器,前后端分离,即先链接生成中间代码,后LLVM后端,根据中间代码,生成各指令集机器语言
- 如果要实现一种新的编程语言,在不熟悉GCC的情况下,那么采用LLVM最好,因为此时不需要再去考虑各芯片指令集的差异,去查阅各种手册,才能在目标平台上生成执行文件
对于GCC而言,与以上LLVM的特性相反,但是久历风雨、深经考验,有更多具备经验的工程师
- 就编译效率而言,总体二者差别不大
- 就学习而言,非编译器方向,没必要了解
llvm严格来说不是一个c语言编译器,而gcc则完全是一个c语言编译器,llvm要与clang搭配使用才能编译c语言程序。
llvm严格来说不是一个c语言编译器,而gcc则完全是一个c语言编译器,llvm要与clang搭配使用才能编译c语言程序。
难怪UNIX上面编译源代码对于clang卡的那么严。。。
llvm 套件是bsd 授权,gcc套件是GPLV3
llvm使用c++编写, gcc在gcc 11版及之后的版本才转为c++,之前的版本都是使用c编写
llvm严格来说不是一个c语言编译器,而gcc则完全是一个c语言编译器,llvm要与clang搭配使用才能编译c语言程序。
gcc是 GNU Compiler Collection 的简称,并不只是单一的 c编译器
clang只是 llvm的前端,也可以使用gcc作为 llvm的前端
同样也可以使用 clang作为前端 + GNU Binutils来使用
gcc是 GNU Compiler Collection 的简称,并不只是单一的 c编译器
clang只是 llvm的前端,也可以使用gcc作为 llvm的前端
同样也可以使用 clang作为前端 + GNU Binutils来使用
是我不严谨了,不过从使用的角度上来说gcc确实是专门的c语言编译器。
至于使用gcc作为llvm的前端,这个我确实不知道,gcc的开发者他们不是反对llvm的设计理念吗?当然也有可能是我记错了。
前一段时间初学c++时候也疑惑过这个问题,不记得是在哪里看过一句话,如果把gcc比作烤全羊,那么LLVM就是一桌全羊宴,而clang就只是全羊宴中的一道菜。大概就是gcc有的功能LLVM都有,gcc没有的一些功能LLVM也有
再提一句,gcc(指GNU Compiler Collection,不是专门编译c语言的gcc)是不同的前端和不同的后端一一对应,编译不同的语言有不同的前端和后端,而llvm则是不同的前端对应同一个后端。
我觉得这就是llvm和gcc最大的区别。
LLVM原理有点类似java JVM,他先把所有语言都编译成一个统一的中间代码(IR/Intermediate Representation),然后再翻译成各个CPU平台的目标文件。过去他采用gcc作为前端,用gcc把各种语言编译成LLVM IR,再用LLVM的工具生成汇编或目标文件,后来LLVM也推出了自己的前端Clang(支持C、C++、Objective-C)。经过不断的发展现在LLVM项目已经成一个单纯的「代码生成器」演变成一个各种基础设施的集合(只不过还用LLVM做名称而已,严谨地说LLVM核心库只能算是LLVM项目的一部分),有替代GNU工具链的潜力。因为他这种设计比gcc更模块化,想设计或者支持一个新语言只需要开发一个生成LLVM IR的前端,就可以重复使用LLVM的组件,减少了工作量。一个契机是苹果公司对gcc的改进总被否决,苹果想寻求一个另外的编译器,于是就招募了LLVM的作者Chris Lattner并支持LLVM的开发。
LLVM原理有点类似java JVM,他先把所有语言都编译成一个统一的中间代码(IR/Intermediate Representation),然后再翻译成各个CPU平台的目标文件。过去他采用gcc作为前端,用gcc把各种语言编译成LLVM IR,再用LLVM的工具生成汇编或目标文件,后来LLVM也推出了自己的前端Clang(支持C、C++、Objective-C)。经过不断的发展现在LLVM项目已经成一个单纯的「代码生成器」演变成一个各种基础设施的集合(只不过还用LLVM做名称而已,严谨地说LLVM核心库只能算是LLVM项目的一部分),有替代GNU工具链的潜力。因为他这种设计比gcc更模块化,想设计或者支持一个新语言只需要开发一个生成LLVM IR的前端,就可以重复使用LLVM的组件,减少了工作量。一个契机是苹果公司对gcc的改进总被否决,苹果想寻求一个另外的编译器,于是就招募了LLVM的作者Chris Lattner并支持LLVM的开发。
难怪UNIX都是LLVM作为默认编译器。。。
是我不严谨了,不过从使用的角度上来说gcc确实是专门的c语言编译器。
至于使用gcc作为llvm的前端,这个我确实不知道,gcc的开发者他们不是反对llvm的设计理念吗?当然也有可能是我记错了。
gcc可以作为llvm的前端跟他们设计理念合不合完全没关系吧……
gcc可以作为llvm的前端跟他们设计理念合不合完全没关系吧……
好像是吧,不过gnu那帮人不是不愿意将gcc模块化,想要让gcc保持一个独立的整体吗?(非常奇特且固执的“自由思想”)
所以我就觉得gcc应该是不能被拆分出来做llvm的前端的,当然实际情况怎么样我并不知道,如果是我想多了还请见谅。
好像是吧,不过gnu那帮人不是不愿意将gcc模块化,想要让gcc保持一个独立的整体吗?(非常奇特且固执的“自由思想”)
所以我就觉得gcc应该是不能被拆分出来做llvm的前端的,当然实际情况怎么样我并不知道,如果是我想多了还请见谅。
纵使GNU的程序员能力再大,要将GCC这样一个大型项目做成一个完全密不可分的大块头也不可能吧,而且这样也没什么好处。我不太清楚这其中的历史纠葛,但是GCC从一开始就被设计为前后端分离的结构。大多数编译器都是如此。
Popular Events
More

中文 
不太清楚。。。编译出来的都没什么问题。。。
但是想知道有什么区别。。。