什么事LLVM和Clang?Clang与GCC有什么区别?Clang如何使用?
这个问题主要讲Xcode编译器的认知,在学习iOS之前有必要学习一下Objective-C的编译环境。
在了解LLVM和Clang之前,先得了解一下什么是编译器。
编译器是一种计算机程序,它将某种编程语言(高级编程语言)写成的源代码转换成另一种编程语言(低级编程语言)。一个现代编译器的主要工作流程为:源代码->预处理器->编译器->目标代码->链接器->可执行程序,最后打包文件,让计算机运行。编译器的目的是将便于人写的高级编程语言作为源代码,翻译成计算机能够执行的低级机器语言,也就是可执行文件。其中高级语言有C、C++、Java、Python等,低级语言有汇编语言和机器代码。一个编译器可以按照三段式分为:前段(Fontend)、优化器(Optimizer)、后端(Backend)。
GCC(GNU Compiler Collection)是一套有GNU开发的编程语言编译器,以GPL及LGPL许可证所发行的自由软件。GCC原名为GNU C 语言编译器,它原本只能处理C语言,随着技术的发展,GCC很快地得到扩展,变得可以处理C++,之后可以处理的语言扩展到Fortran、Pascal、Objective-C、Java等。
LLVM(Low Level Virtual Machine),即底层虚拟机。它是一个由C++编写而成的编译器基础框架,利用虚拟技术创造出编译时期、链接时期、运行时期以及“闲置时期”的最优化框架。从宏观上来讲,LLVM不仅仅是一个编译器或者虚拟机,它是一个众多编译器工具及低级工具技术的统称,它包含了一个前端、优化器、后端以及众多的函数库和模板。从微观上来讲,可以把它看做后端编译器,用来生成目标代码,前端编译器为Clang。Xcode5版本之前,编译器默认使用的是GCC,从Xcode5之后编译器默认使用LLVM。原因后面马上讲到。
CLang是一个由C++编写的编译器前端,能够编译C/C++/Objective等高级语言,属于LLVM的一部分,发布于BSD(自由软件中使用最广发的许可证之一)许可证下,其目的就是为了超越GCC。经过测试证明,Clang编译Objective-C代码的速度为GCC的3倍左右,同时它还能针对用户发生的编译错误准确地给出建议。
Clang和GCC的主要区别如下所示。
- Clang比GCC编译用的时间更短,包括预处理、语法分析、解析、语义分析、抽象语法树生成的时间。
- Clang比GCC的内存占用更小。
- Clang生成的中间产物比GCC更小。
- Clang的错误提示比GCC更加友好。
- Clang有静态分析,GCC没有。
- Clang使用BSD许可证,GCC使用GPL许可证。
- Clang从一开始就被设计为一个API,允许它被源代码分析工具和IDE集成。GCC被构建成一个单一的静态编译器,这使得它非常难以被作为API并集成到其他工具中。
- GCC比Clang支持更多的语言,例如Java。
- GCC比Clang支持更多的平台。
- GCC比Clang更流行。
在iOS开发中,经常使用Clang将Objective-C代码转化成C++代码,从而分析代码的底层实现。以main.m文件为例。
clang -rewrite-objc main.m //将Objective-C转为C++
什么事LLVM和Clang?Clang与GCC有什么区别?Clang如何使用?相关推荐
- FreeBSD 10 将使用 Clang 编译器替换 GCC
来自 phoronix 的消息称,根据 FreeBSD 2012 第一季度的状态报告 显示,来自 LLVM 的 Clang 编译器将成为 FreeBSD 10 的默认 C/C++ 编译器,废弃使用 G ...
- 编译器cc、CC、gcc、g++区别
编译器cc.CC.gcc.g++区别 看C语言经典教材<C程序设计语言>中,Linux下编译C代码用的是cc, 广为人知的C编译器的gcc, 还有CC.g++那么有啥差异呢 一.cc是Un ...
- linux gcc延时怎么写,Clang / GCC是否真的支持延迟加载功能?
如果您 确实经历过 与上述标题相关的事情,您是否愿意对此发表评论?我试图使共享对象在Ubuntu上同时被Clang和GCC延迟加载(我实际上不介意使用哪个编译器),但是它们看起来并没有真正支持任何延迟 ...
- Linxu终端gcc与gcc -c的区别
gcc的更多用法详见下链接: GCC 参数详解 | 菜鸟教程gcc 与 g++ 分别是 gnu 的 c & c++ 编译器 gcc/g++ 在执行编译工作的时候,总共需要4步: 1. ...
- gcc和arm-linux-gcc区别
安装arm-linux-gcc的时候,查了不少资料,总算环境搭好了.于是,想写个程序员的经典程序---hello world. 语法都没错,生成test.c. 命令行运行:arm-linux-gcc ...
- VC编译器与GCC编译器的区别
首先,所谓语法区别是针对程序设计语言而言的,这里首先你要分清楚它们之间的区别. Gcc:它是一款开源的C语言编译器,原来只能在Linux系统上使用,后来移植到了Windows操作系统上,以此为基础的编 ...
- WebRtc GCC、Sendside-BWE 区别
一.概念说明 由于webrtc里面包含GCC.Sendside-BWE两种拥塞控制算法.M55之前用的是GCC,M55之后用的是Sendside-BWE.里面有很多概念梳理如下,以免混淆,不方便理解代 ...
- 编译器GCC与Clang的异同
GCC:GNU(Gnu's Not Unix)编译器套装(GNU Compiler Collection,GCC),指一套编程语言编译器,以GPL及LGPL许可证所发行的自由软件,也是GNU项目的关键 ...
- How to use Clang Static Analyzer
Introduction Clang 宏观上讲,Clang是一个项目名称.微观上,类似于GCC,Clang是一个C语言.C++.Objective C语言的轻量级编译器,它是Clang项目的一部分. ...
最新文章
- Python使用问题汇总
- 【python教程入门学习】Python实现自动玩贪吃蛇程序
- php date 转换 string_php将时间差转换为字符串提示
- 国产光刻机正式宣布:今年出货150台
- java int byte数组_Java 中int与byte数组转换详解
- 每日程序C语言2-判断某日期是这一年的第几天
- (12)Verilog HDL变量:reg型
- python匹配字符串_字符串匹配算法之Kmp算法(Python实现)
- CF125E MST Company
- Maven 清理 .lastUpdated 文件
- 旋风解析磁力php,2018年免费引擎和正版旋风四核引擎棋力测试分析
- java ic卡读写_使用Java驱动ACR122U对IC卡进行读写,总结
- * Redis —— Scan、SScan、HScan、ZScan
- 新浪微博广告投放展现形式、展现位置!微博推广广告有效果吗?
- Gateway过滤器详解
- 外卖和快递行业数据_白领市场三分天下,外卖行业将何去何从?
- 云计算中的laaS、PaaS和SaaS是什么意思?
- LE250UQ激光位移传感器
- ubuntu各种实践笔记
- ~_~ 搬家啰 ~_~
热门文章
- appinventor HTML5,用APP Inventor纯图形化编程自制APP,通过WIFI物联网控制掌控板
- 【Python】爬取理想论坛单帖爬虫
- [代码审计]Weiphp5.0 前台文件任意读取分析
- c语言中文拼音排序,为sqlite增加汉字拼音排序功能
- windows服务器系统监控
- 工作经验是积累总结出来的
- 如何oracle调试存储过程
- 蓝牙文件传输服务linux,openwrt蓝牙文件传输
- 两端分散对齐怎么设置_Word文档两端对齐分散对齐有哪些设置方法
- Google全系列产品不再信任赛门铁克某款根证书-转载