[Topic DIscussion] gcc和LLVM编译程序有什么区别吗?
Tofloor
poster avatar
Lwh2008-Equinox
deepin
2023-05-06 16:38
Author

不太清楚。。。编译出来的都没什么问题。。。

但是想知道有什么区别。。。

Reply Favorite View the author
All Replies
阿尼樱奈奈
deepin
2023-05-06 16:48
#1

IMG_20230506_084753.jpg

Reply View the author
black_white_bear
deepin
2023-05-06 16:58
#2

GCC和LLVM都是编译工具链的一种实现

对于LLVM而言,

  • 编译器,前后端分离,即先链接生成中间代码,后LLVM后端,根据中间代码,生成各指令集机器语言
  • 如果要实现一种新的编程语言,在不熟悉GCC的情况下,那么采用LLVM最好,因为此时不需要再去考虑各芯片指令集的差异,去查阅各种手册,才能在目标平台上生成执行文件

对于GCC而言,与以上LLVM的特性相反,但是久历风雨、深经考验,有更多具备经验的工程师

  • 就编译效率而言,总体二者差别不大
  • 就学习而言,非编译器方向,没必要了解
Reply View the author
Comments
wlly-lzh
2023-05-06 17:06
讲的好,点赞!
wlly-lzh
deepin
2023-05-06 17:02
#3

llvm严格来说不是一个c语言编译器,而gcc则完全是一个c语言编译器,llvm要与clang搭配使用才能编译c语言程序。

Reply View the author
Lwh2008-Equinox
deepin
2023-05-06 17:19
#4
wlly-lzh

llvm严格来说不是一个c语言编译器,而gcc则完全是一个c语言编译器,llvm要与clang搭配使用才能编译c语言程序。

难怪UNIX上面编译源代码对于clang卡的那么严。。。

Reply View the author
root
deepin
2023-05-06 17:19
#5

llvm 套件是bsd 授权,gcc套件是GPLV3

llvm使用c++编写, gcc在gcc 11版及之后的版本才转为c++,之前的版本都是使用c编写

Reply View the author
root
deepin
2023-05-06 17:21
#6
wlly-lzh

llvm严格来说不是一个c语言编译器,而gcc则完全是一个c语言编译器,llvm要与clang搭配使用才能编译c语言程序。

gcc是 GNU Compiler Collection 的简称,并不只是单一的 c编译器

clang只是 llvm的前端,也可以使用gcc作为 llvm的前端

同样也可以使用 clang作为前端 + GNU Binutils来使用

Reply View the author
wlly-lzh
deepin
2023-05-06 17:31
#7
root

gcc是 GNU Compiler Collection 的简称,并不只是单一的 c编译器

clang只是 llvm的前端,也可以使用gcc作为 llvm的前端

同样也可以使用 clang作为前端 + GNU Binutils来使用

是我不严谨了,不过从使用的角度上来说gcc确实是专门的c语言编译器。

至于使用gcc作为llvm的前端,这个我确实不知道,gcc的开发者他们不是反对llvm的设计理念吗?当然也有可能是我记错了。

Reply View the author
翻过山峰看见云
deepin
2023-05-06 18:40
#8

前一段时间初学c++时候也疑惑过这个问题,不记得是在哪里看过一句话,如果把gcc比作烤全羊,那么LLVM就是一桌全羊宴,而clang就只是全羊宴中的一道菜。大概就是gcc有的功能LLVM都有,gcc没有的一些功能LLVM也有

Reply View the author
wlly-lzh
deepin
2023-05-06 19:01
#9

再提一句,gcc(指GNU Compiler Collection,不是专门编译c语言的gcc)是不同的前端和不同的后端一一对应,编译不同的语言有不同的前端和后端,而llvm则是不同的前端对应同一个后端。

我觉得这就是llvm和gcc最大的区别。

Reply View the author
enforcee
deepin
2023-05-06 20:38
#10

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的开发。

Reply View the author
Lwh2008-Equinox
deepin
2023-05-06 21:06
#11
enforcee

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作为默认编译器。。。

Reply View the author
安洛
deepin
2023-05-06 21:07
#12
wlly-lzh

是我不严谨了,不过从使用的角度上来说gcc确实是专门的c语言编译器。

至于使用gcc作为llvm的前端,这个我确实不知道,gcc的开发者他们不是反对llvm的设计理念吗?当然也有可能是我记错了。

gcc可以作为llvm的前端跟他们设计理念合不合完全没关系吧……

Reply View the author
wlly-lzh
deepin
2023-05-06 21:40
#13
安洛

gcc可以作为llvm的前端跟他们设计理念合不合完全没关系吧……

好像是吧,不过gnu那帮人不是不愿意将gcc模块化,想要让gcc保持一个独立的整体吗?(非常奇特且固执的“自由思想”)

所以我就觉得gcc应该是不能被拆分出来做llvm的前端的,当然实际情况怎么样我并不知道,如果是我想多了还请见谅。sweat

Reply View the author
安洛
deepin
2023-05-07 02:13
#14
wlly-lzh

好像是吧,不过gnu那帮人不是不愿意将gcc模块化,想要让gcc保持一个独立的整体吗?(非常奇特且固执的“自由思想”)

所以我就觉得gcc应该是不能被拆分出来做llvm的前端的,当然实际情况怎么样我并不知道,如果是我想多了还请见谅。sweat

纵使GNU的程序员能力再大,要将GCC这样一个大型项目做成一个完全密不可分的大块头也不可能吧,而且这样也没什么好处。我不太清楚这其中的历史纠葛,但是GCC从一开始就被设计为前后端分离的结构。大多数编译器都是如此。

Reply View the author