在V3.20版的core_cm3.h文件中有以下一段代码:html
#if defined ( __CC_ARM )
#define __ASM __asm /*!< asm keyword for ARM Compiler */
#define __INLINE __inline /*!< inline keyword for ARM Compiler */
#define __STATIC_INLINE static __inline
#elif defined ( __ICCARM__ )
#define __ASM __asm /*!< asm keyword for IAR Compiler */
#define __INLINE inline /*!< inline keyword for IAR Compiler. Only available in High optimization mode! */
#define __STATIC_INLINE static inline
#elif defined ( __TMS470__ )
#define __ASM __asm /*!< asm keyword for TI CCS Compiler */
#define __STATIC_INLINE static inline
#elif defined ( __GNUC__ )
#define __ASM __asm /*!< asm keyword for GNU Compiler */
#define __INLINE inline /*!< inline keyword for GNU Compiler */
#define __STATIC_INLINE static inline
#elif defined ( __TASKING__ )
#define __ASM __asm /*!< asm keyword for TASKING Compiler */
#define __INLINE inline /*!< inline keyword for TASKING Compiler */
#define __STATIC_INLINE static inline
#endif
在V4.30版的core_cm3.h文件中有以下一段代码:前端
#if defined ( __ICCARM__ )
#pragma system_include /* treat file as system include file for MISRA check */
#elif defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)
#pragma clang system_header /* treat file as system include file */
#endif
增长了Clang编译器功能。linux
部分编译器简介:转载自https://blog.csdn.net/itianyi/article/details/43057279android
1,GNU
先看看wiki百科上的官方说明:
“GNU,名称来自Gnu's Not Unix"的缩写,一个类UNIX的操做系统,由GNU计划推进,目标在于建立一个彻底兼容于UNIX的自由软件环境。”
因为当时UNIX系统是商业软件,是收费的,并且有一部分源码是没有开放的,因此在1983年,理查德·斯托曼提出GNU计划,但愿发展出一套完整的开放源代码操做系统来取代Unix,计划中的操做系统,名为GNU。
所以,GNU的出现的目的就是为了取代UNIX系统。
可是操做系统是包括不少软件的,除了操做系统内核以外,还要有编辑器,编译器,shell等等一些软件来支持。
1989年,GNU项目中的其余部份,如编辑器、编译器、shell等都已经完成,独缺操做系统核心。1990年,自由软件基金会开始正式发展Hurd,做为GNU项目中的操做系统。
注意:linux并非GNU计划的一部分。linux只是使用了许多GNU计划软件(包括GCC编译器,文本编译器等)。
1991年,Linux出现,全部GNU项目中,运行于用户空间的软件,均可以在Linux上使用。许多开发者转向于Linux,Linux成为常见的GNU计划软件运行平台。理查德·斯托曼主张,Linux操做系统使用了许多GNU计划软件,应正名为GNU/Linux,但没有获得Linux社区的一致认同,造成GNU/Linux命名争议。
1992年,Linux与其余GNU软件结合,彻底自由的操做系统正式诞生。许多程序员参与了Linux的开发与修改,也常常将Linux当成开发GNU计划软件的平台。该操做系统每每被称为“GNU/Linux”或简称Linux。但Linux自己不属于GNU计划的一部份,GNU计划本身的内核Hurd依然在开发中,但直到2013年为止,都尚未稳定版本发布。
GNU工程十几年以来已经成为一个对软件开发主要的影响力量,创造了无数的重要的工具,例如:强健的编译器,有力的文本编辑器,甚至一个全功能的操做系统。这个工程是从1984年麻省理工学院的程序员理查德·斯托曼的想法得来的,他想要建立一个自由的、和UNIX相似的操做环境。从那时开始,许多程序员汇集起来开始开发一个自由的、高质量、易理解的软件。
GNU计划采用了部分当时已经可自由使用的软件,例如TeX排版系统和X
Window视窗系统等。不过GNU计划也开发了大批其余的自由软件,这些软件也被移植到其余操做系统平台上,例如Microsoft
Windows、BSD家族、Solaris及Mac
OS。
许多UNIX系统上也安装了GNU软件,由于GNU软件的质量比以前UNIX的软件还要好。
因此,GNU计划中的许多软件目前在全部的操做系统中都应用普遍(Unix,mac,linux,windows,bsd...),最出名的就是GCC了
总结:
GNU计划原本是为了开发一个自由系统来取代UNIX的,可是因为开发的内核hurd一直不怎么样,这个系统至今都没出稳定版本,然而GNU计划中开发的其余一些自由软件,好比GCC编译器,却很是的好,在移植到各大操做系统上一直普遍使用至今。
注意一点:
文中说的自由软件,千万别与免费软件混淆了,自由是说你能够自由的使用,固然前提是得到了源码才能自由的使用。
好比,你在一个应用里面使用了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与其余语言。
本来用C开发,后来由于LLVM、Clang的崛起,令GCC更快将开发语言转换为C++。许多C的爱好者在对C++只知其一;不知其二的状况下主观认定C++的性能必定会输给C,可是Taylor给出了不一样的意见,并代表C++不但性能不输给C,并且能设计出更好,更容易维护的程序 ”
因为GCC已成为GNU系统的官方编译器(包括GNU/Linux家族),它也成为编译与建立其余操做系统的主要编译器,包括BSD家族、Mac
OS X、NeXTSTEP与BeOS。
GCC一般是跨平台软件的编译器首选。有别于通常局限于特定系统与运行环境的编译器,GCC在全部平台上都使用同一个前端处理程序,产生同样的中介码,所以此中介码在各个其余平台上使用GCC编译,有很大的机会可获得正确无误的输出程序。
总结:
mac以前的cocoa框架即是用GCC编译的,因此ios与mac os都是默认使用的GCC编译器(如今是clang与llvm,下面会有介绍)
android的系统层由于是linux内核,天然也是GCC编译的,可是android的app由于是运行在Dalvik虚拟机,因此用的不是GCC。
windows的应用,大部分都是使用的vs系列的编译器,毕竟是windows自家的编译器,用到GCC的很少。
3,Clang
先看看wiki百科上的官方说明: http://zh.wikipedia.org/wiki/Clang
“ Clang 是一个C、C++、Objective-C和Objective-C++编程语言的编译器前端。它采用了底层虚拟机(LLVM)做为其后端。
它的目标是提供一个GNU编译器套装(GCC)的替代品。 Clang项目包括Clang前端和Clang静态分析器等。
这个软件项目在2005年由苹果电脑发起,是LLVM编译器工具集的前端(front-end),目的是输出代码对应的抽象语法树(Abstract
Syntax Tree, AST),并将代码编译成LLVM Bitcode。接着在后端(back-end)使用LLVM编译成平台相关的机器语言 。Clang支持C、C++、Objective
C。
Clang自己性能优异,其生成的AST所耗用掉的内存仅仅是GCC的20%左右。FreeBSD 10将Clang/LLVM做为默认编译器.
测试证实Clang编译Objective-C代码时速度为GCC的3倍,还能针对用户发生的编译错误准确地给出建议。
总结:
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对编译工具会提出更高的要求。
一方面,是Apple对Objective-C语言(甚至后来对C语言)新增不少特性,但GCC开发者并不买Apple的账——不给实现,所以索性后来二者分红两条分支分别开发,这也形成Apple的编译器版本远落后于GCC的官方版本。另外一方面,GCC的代码耦合度过高,很差独立,并且越是后期的版本,代码质量越差,但Apple想作的不少功能(好比更好的IDE支持)须要模块化的方式来调用GCC,但GCC一直不给作,从根本上限制了LLVM-GCC的开发。 因此,这种不和让Apple一直在寻找一个高效的、模块化的、协议更放松的开源替代品,因而Apple请来了编译器高材生Chris
Lattner, LLVM就这样产生了。
Clang历史
Apple吸取Chris Lattner的目的要比改进GCC代码优化宏大得多——GCC系统庞大而笨重,而Apple大量使用的Objective-C在GCC中优先级很低。此外GCC做为一个纯粹的编译系统,与IDE配合得不好。加之许可证方面的要求,Apple没法使用LLVM 继续改进GCC的代码质量。因而,Apple决定从零开始写 C、C++、Objective-C语言的前端 Clang,彻底替代掉GCC。
正像名字所写的那样,Clang只支持C,C++和Objective-C三种C家族语言。2007年开始开发,C编译器最先完成,而因为Objective-C相对简单,只是C语言的一个简单扩展,不少状况下甚至能够等价地改写为C语言对Objective-C运行库的函数调用,所以在2009年时,已经彻底能够用于生产环境。C++的支持也热火朝天地进行着。
更详细的缘由:
Xcode编译器介绍: http://www.cnblogs.com/ydhliphonedev/archive/2012/08/29/2661726.html
总结:
由于GCC的编译器已经慢慢没法知足苹果的需求,所以,苹果开发了Clang与LLVM来彻底取代GCC,Xcode4以后,苹果的默认编译器已是LLVM了。Clang做为编译器前端,LLVM做为编译器后端。
在Xcode6.0中查看默认编译器:
4,编译器相关知识
问题:苹果以clang做为编译器前端,llvm做为编译器后端,那么编译器的先后端究竟是什么东西呢?
咱们先回到一个常识性的问题,什么是编译器呢?简单地说,编译器能够看做是一个语言翻译器。就像把中文翻译成英语同样,编译器能够把高级语言翻译成计算机可以执行的机器语言。这样看来,GCC能够算得上是一个精通多国语言的高级翻译官了。
最简单的GCC使用指令以下所示:
gcc hello.c -o hello
GCC接受hello.c做为输入,最后产生目标可执行代码hello。这个简单的流程实际上经历了不少步骤,以下图所示:
虽然咱们只用了一条命令就完成了编译,但实际上gcc命令依次呼叫了cpp,gcc本身,gas以及ld来进行完整的编译流程,最后生成最终的可执行文件hello。
学过编译原理这门课程的同窗对下面这副图应该很熟悉,这是经典的编译流程。
下面以GCC编译器为例,GCC做为经典的编译器,天然也是遵循这个教科书流程(实际GCC的处理更复杂点,但本质上是同样的)。咱们先简化一下上面这幅图,以中间代码为分界,前面的词法分析、语法分析、语义分析咱们把它称之为前端处理,后面的优化和目标代码生成咱们称之为后端处理。
试想一下,是否能够为不一样的高级语言单独写一个前端,而后为不一样的处理器架构单独写一个后端呢?
GCC基本上也是这么实现的,不过不要误会,并无一个统一的gcc执行程序可以处理如此多的前端和后端,每一个语言的编译器都是一个独立的程序(如C语言的编译器是gcc,C++的编译器是g++),而不一样的后端也要对应不一样的可执行程序。你能够下载单独的一份GCC源代码,经过不一样的configure来生成本身须要的编译器。
并且,编译器的实现也比上图要复杂的多,前端的主要功能是产生一个可供后端处理的语法树,而语法树结构实际上很难与处理器架构脱钩,这些都是编译器应用中须要解决的问题。
GCC强大的真正缘由是什么?是由于它支持了众多的前端和后端吗?这些都不过是一个表象而已。GCC是一款真正自由的编译器,咱们能够随时把代码拿过来修改以实现本身须要的功能。若是你的硬件平台增长了一些指令,而普通的编译器并不能产生这些指令怎么办?在GCC后端添加这些指令吧。若是你以为C语言用的不太顺手,想给它添加一些功能怎么办?修改GCC的前端吧。由于有了GCC,咱们才拥有这些自由,以及迅速实现本身想法的能力,而这些才是GCC强大背后的基础。
转载自:https://blog.csdn.net/itianyi/article/details/43057279