GNU
时间:2021-10-20 16:20:34
手机看文章
扫描二维码
随时随地手机看文章
[导读]关注、星标公众号,直达精彩内容来源|技术让梦想更伟大整理 | 李肖遥很多时候,出现一些类似GNU,GCC,CLANG,LLVM等与编译器有关的名词的时候,都不太清楚它到底是干嘛的,理解这些东西后,对于xcode中很多配置型的需求修改起来都会得心应手,因此有必要了解透彻他们直接的关...
关注、星标公众号,直达精彩内容
GCC接受hello.c作为输入,最后产生目标可执行代码hello,这个简单的流程实际上经历了很多步骤。
1,GNU
先看看wiki百科上的官方说明:
“GNU,名称来自Gnu's Not Unix"的缩写,一个类UNIX的操作系统,由GNU计划推动,目标在于创建一个完全兼容于UNIX的自由软件环境。”由于当时UNIX系统是商业软件,是收费的,而且有一部分源码是没有开放的,所以在1983年,理查德·斯托曼提出GNU计划,希望发展出一套完整的开放源代码操作系统来取代Unix,计划中的操作系统,名为GNU。
总结
GNU计划本来是为了开发一个自由系统来取代UNIX的,但是由于开发的内核hurd一直不怎么样,这个系统至今都没出稳定版本,然而GNU计划中开发的其他一些自由软件,比如GCC编译器,却非常的好,在移植到各大操作系统上一直广泛使用至今。
注意一点
文中说的自由软件,千万别与免费软件混淆了,自由是说你可以自由的使用,当然前提是获得了源码才能自由的使用。
2,GCC
先看看wiki百科上的官方说明:
“ GCC(GNU Compiler Collection,GNU编译器套装),是一套由GNU开发的编程语言编译器。它是一套以GPL及LGPL许可证所发布的自由软件,也是GNU项目的关键部分,亦是自由的类Unix及苹果电脑Mac OS X 操作系统的标准编译器。GCC(特别是其中的C语言编译器)也常被认为是跨平台编译器的事实标准。GCC原名为GNU C语言编译器(GNU C Compiler),因为它原本只能处理C语言。GCC很快地扩展,变得可处理C 。之后也变得可处理Fortran、Pascal、Objective-C、Java、Ada,以及Go与其他语言。
总结
mac之前的cocoa框架便是用GCC编译的,所以ios与mac os都是默认使用的GCC编译器(现在是clang与llvm,下面会有介绍)
3,Clang
先看看wiki百科上的官方说明:http://zh.wikipedia.org/wiki/Clang
“ Clang 是一个C、C 、Objective-C和Objective-C 编程语言的编译器前端。它采用了底层虚拟机(LLVM)作为其后端。它的目标是提供一个GNU编译器套装(GCC)的替代品。Clang项目包括Clang前端和Clang静态分析器等。
总结
GCC目前作为跨平台编译器来说它的兼容性无异是最强的,兼容最强肯定是以牺牲一定的性能为基础的,苹果为了提高性能,因此专门针对mac系统开发了专用的编译器clang与llvm,clang用于编译器前段,llvm用于后端。
3,LLVM
先看看wiki百科上的官方说明:http://zh.wikipedia.org/wiki/LLVM
“ LLVM,它是一个编译器的基础建设,以C 写成。它是为了任意一种编程语言写成的程序,利用虚拟技术,创造出编译时期,链结时期,运行时期以及“闲置时期”的优化。在Xcode4之后,苹果将Xcode的默认编译器变成了LLVM,为什么呢?
LLVM历史
Apple(包括中后期的NeXT) 一直使用GCC作为官方的编译器。GCC作为开源世界的编译器标准一直做得不错,但Apple对编译工具会提出更高的要求。
Clang历史
Apple吸收Chris Lattner的目的要比改进GCC代码优化宏大得多——GCC系统庞大而笨重,而Apple大量使用的Objective-C在GCC中优先级很低。此外GCC作为一个纯粹的编译系统,与IDE配合得很差。加之许可证方面的要求,Apple无法使用LLVM 继续改进GCC的代码质量。于是,Apple决定从零开始写 C、C 、Objective-C语言的前端 Clang,完全替代掉GCC。
更详细的原因:
Xcode编译器介绍:
总结:
因为GCC的编译器已经慢慢无法满足苹果的需求,因此,苹果开发了Clang与LLVM来完全取代GCC,Xcode4之后,苹果的默认编译器已经是LLVM了。Clang作为编译器前端,LLVM作为编译器后端。
4,编译器相关知识
问题:苹果以clang作为编译器前端,llvm作为编译器后端,那么编译器的前后端到底是什么东西呢?
GCC接受hello.c作为输入,最后产生目标可执行代码hello,这个简单的流程实际上经历了很多步骤。





