二、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/

Clanghttp://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公司从创立之初到现今富可敌国的公司,中间的起起伏伏,堪比一部电视连续剧。

C语言编译器之二,Clang相关推荐

  1. 编译器之后端原理(三十六)

    一.编译器的后端技术 1. 编译器的前端技术,重点是让编译器能够读懂程序,无结构的代码文本经过前端的处理以后,就变成了Token.AST和语义属性.符号表等结构化的信息,基于这些信息,可以实现简单的脚 ...

  2. c语言编译的四个阶段

    总结:(源文件名为loops.c) 可以转换到不同阶段.阶段1,将头文件加进来.阶段2,转换成汇编程序,与机器类型相关.阶段3,转换成机器码,但不完整.阶段4,链接其他系统文件,形成最终可执行文件 c ...

  3. 【流媒体开发】VLC Media Player - Android 平台源码编译 与 二次开发详解 (提供详细800M下载好的编译源码及eclipse可调试播放器源码下载)

    作者 : 韩曙亮  博客地址 : http://blog.csdn.net/shulianghan/article/details/42707293 转载请注明出处 : http://blog.csd ...

  4. C语言编译全过程剖析

    一. 摘要 C语言编译的整个过程是非常复杂的,里面涉及到的编译器知识.硬件知识.工具链知识都是非常多的,深入了解整个编译过程对工程师理解应用程序的编写是有很大帮助的,希望大家可以多了解一些,在遇到问题 ...

  5. C语言编译链接生成可执行文件四大步骤:预处理(-E)->编译(-S)->汇编(-c) ->链接

    文章目录 一.编译过程简介 1.预处理器 2.编译器 3.汇编器 二.链接过程简介 1.静态链接: 由链接器在链接时将库的内容直接加入到可执行程序中 2.动态链接: 一.编译过程简介 编译过程可以分为 ...

  6. centos安装llvm_Linux CentOS上编译并安装Clang教程

    如何在Linux CentOS上编译并安装Clang?下面小编为大家具体的介绍一下,解决你在安装Clang遇到的一系列问题. 一.Minimal版CentOS安装Clang前的环境准备 1,安装gcc ...

  7. (四)Go 语言编译流程简述

    一.概述 Go 语言编译的最后一个阶段是根据 SSA 中间代码生成机器码,这里谈的机器码是在目标 CPU 架构上能够运行的二进制代码,中间代码生成一节简单介绍的从抽象语法树到 SSA 中间代码的生成过 ...

  8. 一起学习C语言:函数(二)

    上一篇<一起学习C语言:函数(一)> 中,我们了解了函数的概念,以及函数实现与程序编译过程.本章节,我们分析内部函数和外部函数,以及变量的生命周期. 章节预览: 4. 外部函数与内部函数 ...

  9. c语言程序设计实验二模板,C语言程序设计实验二.doc

    C语言程序设计实验二.doc 下载提示(请认真阅读)1.请仔细阅读文档,确保文档完整性,对于不预览.不比对内容而直接下载带来的问题本站不予受理. 2.下载的文档,不会出现我们的网址水印. 3.该文档所 ...

最新文章

  1. plotly可视化绘制共享坐标轴图
  2. 数据500%暴涨的神秘公式,顶级增长黑客如何实现用户指数级增长
  3. Android开发 ShapeDrawable详解
  4. JavaScript--DOM操作表格及样式(21)
  5. DevExpress.XtraGrid.view.gridview 属性说明
  6. vs2013创建及使用DLL
  7. java下标运算符_《Java从小白到大牛精简版》之第6章 运算符(下)
  8. 【转】3.1(译)构建Async同步基元,Part 1 AsyncManualResetEvent
  9. 20165230 《Java程序设计》实验五《网络编程与安全》实验报告
  10. Luhn校验原理与实现【转载】
  11. 三维全景导航、偏航识别、深度学习偏航引擎,滴滴导航若干关键功能的技术突破与实践...
  12. 电脑出现的问题以及解决方法
  13. Jquery.EasyUI datebox控件
  14. 02-body标签中相关标签
  15. 电脑是否入侵,是否留有后门
  16. Python多线程实例
  17. 海贼王游戏--EM游戏03--初出茅庐
  18. 一些有用软件收藏(更新中)
  19. html 整体架构框架 源码,上 中 下结构网页模板布局框架代码
  20. 无法卸载office,一招搞定

热门文章

  1. 数据库篇(二)——什么是存储过程?有哪些优缺点?
  2. ECharts-Java 开源项目寻求合作维护
  3. PHP构造函数的继承问题
  4. 【几维安全】Android sdk加固,sdk加固使用详细说明
  5. Matlab中的类定义 classdef
  6. 仅剩1位73岁开发者苦撑!能求解超复杂物理方程式的计算程序,要没人维护了...
  7. FileSystem的append方法文件内容追加坑记
  8. 软件模型之业务建模|概述
  9. JS/CSS判断是不是iphoneX?
  10. Symbol、Map、Set