C语言编译器之二,Clang

二、Clang编译器

Clang编译器是由APPLE公司的编译器大牛Chris Lattner主导下编写的,其目标是替换大名鼎鼎的GCC编译器;

2.1、Clang和GCC编译器架构

从源代码到可执行程序一般经过预处理、编译、链接过程,而编译是编译器的工作,编译分为三个阶段,分别为前端、优化器、后端。

i.编译前端:将源代码转化成中间代码。其详细过程包括:词法分析、语法分析、生成中间代码;

ii.优化器:对编译器生成的中间代码进行一些优化,最终提供给编译后端;

iii.编译后端:根据不同的 cpu 架构,将中间代码汇编,产生汇编代码,最后解析汇编指令,生成目标代码,也就是机器码;

编译器的这种前端、优化器、后端的架构的优点是:

a.当为新的语言开发编译器时,只需要针对新的语言开发前端,产生标准通用的中间代码,这样优化器与后端可以不用修改;

b.当为新的架构开发编译器时,只需要针对新的架构开发后端,而无需修改前端和优化器。所以,这种架构对编译器的开发维护工作就简单许多,同时提升执行效率。

2.2、Clang起源

GCC编译器从20世纪90年代就已经开发出来了,特别作为 Linux的当家编译器,GCC开源使得其广为流传,包括Apple在内,最开始也是使用GCC编译器,因为当时的Apple并没有自己的编译器,因此早期的XCODE使用GCC编译器编译Object-C,由于Object-C不断地引入新的特性,Apple公司不停与GCC组织协商改进GCC,可能当时的Apple还未有什么名气,GCC不太配合修改,这让Apple公司很是恼火。

转机来了,2005年刚研究生毕业的Chris Lattner被Apple招致麾下,Chris Lattner可是精通编译器理论,其博士阶段的LLVM-GCC架构的编译器在其进入Apple公司后就被完善使用,Apple公司甚至将其当作替代GCC编译器的不二之选。但是,GNU组织出台了《GCC 运行环境豁免条款》从根本上限制了 LLVM-GCC 的开发,这让Apple公司下定决心,从新开始编写C编译器,由Chris Lattner牵头,这就是Clang编译器的诞生,基于LLVM架构,为LLVM Compiler 1.0,这个版本不支持C++。

这就是早期XCODE同时支持GCC、LLVM-GCC、LLVM Compiler的原因。

从XCODE4开始,也就是 Mac OS X 10.6版本系统上,Apple 宣布停止更新GCC编译器,这样GCC停留在GCC4.2版本,并建议大家使用LLVM Compiler 2.0(LLVM-Clang),该版本完全支持C++/ Objective-C++,并提供libc++库来支持新的C++ standard(C++0x标准),而GCC/LLVM-GCC支持的是GCC标准库libstdc++;

从XCODE4.2开始,就默认使用LLVM-Clang,彻底抛弃了GCC;而LLVM-GCC毕竟也是亲儿子,改为一个GCC的插件DragonEgg。

由于Clang设计之初就考虑到模块化设计,因此,清晰简单,出错提示更好,易于扩展,容易与IDE集成;而GCC由于早期设计只支持C语言,后面不断扩展C++/ Java/Ada/Fortran/Go等,虽然支持更多平台;更流行,广泛使用,支持完备,但是其代码接口耦合性强,更新维护和性能等较差。

由于LLVM-Clang的优秀设计,Android NDK从r11开始建议大家切换到clang。并且把GCC标记为deprecated(弃用),将GCC版本锁定在GCC 4.9不再更新;Android NDK从r13起,默认使用Clang进行编译。但是暂时也没有把GCC删掉,Google考虑 libc++(LLVM-Clang的c++标准库)还不够稳定; Android NDK 在 r17 中宣称不再支持 GCC 并在后续的 r18 中删掉 GCC。现在GCC主战场只剩Linux跟部分Windows应用软件开发。

现在最新LLVM版本号已经到了12.0.1版本,官方地址如下:

LLVM编译器基础架构:http://llvm.org/

Clang:http://clang.llvm.org/

DragonEgg – LLVM-GCC:http://dragonegg.llvm.org/

二进制安装文件在github仓库中,地址为:

https://github.com/llvm/llvm-project/releases/tag/llvmorg-12.0.1

可见Clang也在x86/arm/powerpc架构下,及Linux系统下已经广泛支持,Clang与GCC进入激烈竞争的局面,对于吃瓜群众来说,应该是好事!

Clang起源具体细节可以参考“Mac OS X 背后的故事(作者王越)”,该文详细介绍了Apple公司从创立之初到现今富可敌国的公司,中间的起起伏伏,堪比一部电视连续剧。

以上,个人理解,仅供参考!

(0)

相关推荐

  • 一言不合升性能,AMD为Ryzen推出专门的C/C 编译器

    在Ryzen刚推出的那段时间,内存,编译器等对重返高端市场的AMD都不怎么友好,但AMD没有放弃,而是不断的优化Ryzen软件和硬件两个层面的兼容性,好在现在Ryzen已经被刚推出时好多了.AMD现在 ...

  • 官宣:MSVC的Address Sanitizer正式发布

    官宣一则 特别感谢Aaron Gorenstein对本文内容的贡献.特别感谢Kevin Cadieux和Jim Radigan的贡献. 我们非常高兴地宣布:C++ Address Sanitizer( ...

  • Julia机器学习核心编程.2(LLVM和JIT)

    LLVM本来是伊利诺伊大学的一个研究项目,其目的是创建基于静态单一任务(SSA)的现代的.类型安全的编译方法.它拥有底层操作,具有灵活性,并且具有可以清晰地表示所有高级语言的能力.它实际上是模块化.可 ...

  • 没有语言,我们还存在吗? | 语言闲谈(二)

      ◆ ◆ ◆ 文丨周南飞 海德格尔有句广为流传的名言:语言是存在之家. 大凡一句深刻哲言,当其普遍流行之际,往往就是其真谛陨落之时.因为世人都会以流俗意见曲解直至掩埋哲理的本义.但这句名言,似乎逃过 ...

  • 专职交易:趋势跟踪利器之二

    期货开户:手续费仅在交易所基础上加1分钱,不限资金量(点击了解详情>>>) 股票开户:手续费万分之1.5以内,无资金量要求(点击了解详情>>>) 专职交易:从交易新 ...

  • 教会孩子说话,你需要掌握这些方法丨语言篇(二)

    教会孩子说话,你需要掌握这些方法丨语言篇(二)

  • C语言编译原理

    https://m.toutiao.com/is/Jo689AQ/ 源码编译工具gcc 为什么使用gcc GCC介绍 GCC手册 AliOS Things物联网操作系统\day03\02-参考资料\L ...

  • 藏礼于器之二

    <左传>:"惟器与名,不可以假人."名器者,表示等级的称号及表示如钟鼎等礼制的器物.如服饰,穿蓝衫表示末得功名的人,而青衫,就是朝廷赐予的名器. 一衫之色,涉及名器.所 ...

  • 各类统计方法R语言实现(二)​

    各位小伙伴们大家好,今天是我们的系列推文"各类统计方法R语言实现"第二篇,今天介绍的主要内容有:正态性检验.方差齐性检验.t检验.近似t检验. t检验亦称student t检验,是 ...

  • 【本质】你知道C语言编译的过程吗?

    【本质】你知道C语言编译的过程吗?

  • Go 语言编译过程概述

    Golang 是一门需要编译才能运行的编程语言,也就说代码在运行之前需要通过编译器生成二进制机器码,随后二进制文件才能在目标机器上运行,如果我们想要了解 Go 语言的实现原理,理解它的编译过程就是一个 ...

  • 山东省博物馆青铜器之二(原)

    山东省博物馆青铜器之二(原)