编译器(GNU & GCC & clang & llvm)

2023-11-02

前言:

很多时候,出现一些类似GNU,GCC,CLANG,LLVM等与编译器有关的名词的时候,都不太清楚它到底是干嘛的,理解这些东西后,
对于xcode中很多配置型的需求修改起来都会得心应手,因此有必要了解透彻他们直接的关系与区别。
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++。之后也变得可处理FortranPascalObjective-CJavaAda,以及Go与其他语言。

原本用C开发,后来因为 LLVM Clang 的崛起,令GCC更快将开发语言转换为C++。许多C的爱好者在对C++一知半解的情况下主观认定C++的性能一定会输给C,但是Taylor给出了不同的意见,并表明C++不但性能不输给C,而且能设计出更好,更容易维护的程序 

由于GCC已成为GNU系统的官方编译器(包括GNU/Linux家族),它也成为编译与创建其他操作系统的主要编译器,包括BSD家族、Mac OS XNeXTSTEPBeOS

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++的支持也热火朝天地进行着。  

更详细的原因:
总结:
因为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强大背后的基础。




FROM:  http://blog.csdn.net/itianyi/article/details/43057279

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

编译器(GNU & GCC & clang & llvm) 的相关文章

  • vue组件和js实现鼠标悬停显示title效果

    需求 显示文本内容过长 显示 鼠标悬浮时 全部显示 使用element组件
  • [开发

    下载安装人大金仓常见问题 需要去人大金仓https www kingbase com cn qd index htm下载linux版iso文件和授权文件 license 企业版 90天 iso文件需要挂载在指定目录下 参考 https ww
  • “电脑登录界面显示引用的账户当前已锁定”解决办法

    一 电脑登录界面显示引用的账户当前已锁定 解决办法 https www zhihu com question 400540089 answer 2159778869 具体步骤 1 开机进BIOS系统 不同机型方法不同 具体可百度 2 进入B
  • 服务器正常运行温度范围 & ubuntu查看cpu温度 & cpu温度过高

    服务器正常运行温度范围 服务器正常运行温度 服务器cpu的温度在什么范围内是属于正常温度 weixin 39571219的博客 CSDN博客 CPU温度 一般在45 65 或更低 如果在75 80 则要检查CPU和风扇间是否正常 更换CPU
  • 【基带】手机外设之SIM卡槽电路及其变化

    SIM卡槽是手机通讯必不可少的外设 从卸电池插卡到弹出式卡槽 双卡双待诞生后 从并行式双卡槽到现在重叠式双卡槽 SIM卡形态从曾经的大卡到Micro卡和NANO卡 SIM卡槽也随之经历了一系列变化 一 SIM卡原理 PIN1 VCC 电源输
  • css样式不能显示(史上最全)

    文章目录 css样式不能显示常见问题 浏览器问题 浏览器缓存 Google浏览器css显示不了 细节问题 外部样式引入错误 其他细节问题 选择器问题 编码格式问题 样式层叠问题 最后可根据流程图检查 css样式不能显示常见问题 浏览器问题
  • 机器学习笔记--2.1文本分类

    从分类算法层面来看 各类语言的文本分类技术大同小异 但从整个流程来考察 不同语言的文本处理所用到的技术还是有差别的 下面给出中文语言的文本分类技术和流程 主要包括以下几个步骤 1 预处理 去除文本的噪声信息 例如HTML标签 文本格式转换
  • SpringBoot之【mybatisplus】快速上手

    文章目录 1 概述 特性 2 快速开始 2 1 新建springboot 引入相关依赖 2 2 配置文件 2 2 1 在resources下新建db文件 2 2 2 配置文件yml 2 3 编码 2 3 1 启动类增加mapper扫描 2

随机推荐

  • 惊呼!VSCode 花式摸鱼大法!

    开始正文之前 推荐一款CocosStore新上架 超硬核动作游戏 Rougelike RPG Game Demo 来欣赏下游戏效果吧 源码地址 https store cocos com app detail 3117 作者QQ群 1192
  • http://blog.csdn.net/haomcu/article/details/7267090

    转自 http blog csdn net haomcu article details 7267090 一 Android平台Wifi的基本代码路径 1 Wpa supplicant源码部分 external wpa supplicant
  • 7-2 利用数组计算斐波那契数列 (15 分)

    本题要求编写程序 利用数组计算菲波那契 Fibonacci 数列的前N项 每行输出5个 题目保证计算结果在长整型范围内 Fibonacci数列就是满足任一项数字是前两项的和 最开始两项均定义为1 的数列 例如 1 1 2 3 5 8 13
  • MySQL 表的增删改查

    MySQL 表的 CURD 什么是 CURD 一 增加数据 1 insert into 语句 2 insert 语句注意事项 二 查询数据 1 全列查找 2 指定列查找 3 指定列查询为表达式 4 查询列指定别名 5 查询结果去重 6 针对
  • odoo系统架构介绍

    简介 odoo是一个现代化的商业应用套件 使用AGPL许可证 并具有客户关系管理 CRM 人力资源 销售 采购 会计 仓库管理 项目管理 以及众多社区模块 它是基于一个模块化 可扩展和直观的快速开发应用程序 RAD 的框架 使用Python
  • C语言实现流媒体广播项目

    一 简介 一个简单的流媒体项目 基于客户端 服务器模型 C S 开发 采用UDP组播技术 实现MP3格式音乐广播系统 服务器端采用多线程处理频道信息 实现媒体库 MP3 读取并进行流量控制 令牌桶 并通过UDP组播发送 客户端采用多进程 实
  • 用C++写一个顺序表简单实例

    要求 1 构造空的顺序表 2 建立含有若干数据元素的顺序表并输出 3 求表长 4 获取第三个元素的值 5 在第四个位置后 插入一个值为 38 的新的元素后输出顺序表 6 删除第五个位置上的元素后输出顺序表 测试数据 23 33 21 45
  • SQLZOO selfjoin/zh——爱丁堡巴士

    1 數據庫中有多少個站stops select count name from stops 2 找出車站 Craiglockhart 的 id select id from stops where name Craiglockhart 3
  • cmake的使用

    cmake CMake是一个跨平台的安装 编译 工具 可以用简单的语句来描述所有平台的安装 编译过程 他能够输出各种各样的makefile或者project文件 能测试编译器所支持的C 特性 类似UNIX下的automake
  • 自定义事件——this.$emit

    数据项在Vue的实例中 但是删除操作要在组件中完成 那么组件如何才能删除Vue实例中的数据呢 此时就涉及到参数传递与事件分发了 Vue为我们提供了自定义事件的功能 很好的帮助我们解决了这个问题 使用this emit 自定义事件名 参数
  • Snipaste1.12 贴在屏幕上的图不能操作解决方法

    使用Snipaste 将截图贴在屏幕上后 不能通过鼠标双击关闭 也不能移动 关闭后重开截图还继续在屏幕上 原因是在贴图时可能按到字母X 触发了内置快捷键 解决方法 右键图标 选择贴图 选择默认 也有可能是其他文字 然后选择关闭就可以了
  • Java 线程文字左右移动

    线程对象调用start 方法开启线程 并让调用run 方法在开启的线程中执行 import javax swing public class donghua JFrame jFrame JLabel jLabel class MyThrea
  • spring文件上传

    spring文件上传 在pom xml文件中加入
  • 不受环境干扰,这套声学全息方案实现了虚实交互

    一谈到全息显示 大家默认想到的就是光学全息方案 比如需要将光投射到某样东西上 比如视网膜 或是烟雾等介质上 才能成像 市面上一些常见的2D 3D全息方案 如全息风扇 Voxon全息系统等等 分别采用高速移动的条状光源或是平面介质 利用人眼视
  • show_bytes函数

    show bytes打印出每个以十六进制表示的字节 这段代码使用强制转换来访问和打印不同程序对象的字节表示 用typedef将数据结构类型byte pointer定义为一个指向类型 unsigned char 的对象的指针 typedef
  • 使用PicGo搭建github图床时出现图片上传失败(加载栏红色)的解决方法

    问题 使用PicGo搭建github图床 出现图片上传失败 加载栏红色 具体 图片上传失败 加载栏红色 解决后又发现图片可以用但是没法显示的问题 解决方案 解决方案 设定分支名改为main就好了 而不是master 最后重启一下就可以了 图
  • php网页能实现飘窗吗,网站飘窗广告的实现方法

    原标题 网站飘窗广告的实现方法 效果 代码 以上 在background url里设置飘窗广告图片的外链地址 其他参数也可以自己调整 像width height 关闭 以上 在a href里设置需要跳转的页面 lt language jav
  • 参考椭球体与大地水准面的区别

    转载 https www propelleraero com geoids vs ellipsoids whats the difference https support virtual surveyor com support solu
  • 结合机器学习的人口模型能够提高心理健康测量的准确性

    结合机器学习的人口模型能够提高心理健康测量的准确性 导语 关键术语解释 方法 Software Workflow Fig 1 Methods workflow https img blog csdnimg cn eea5b06d071242
  • 编译器(GNU & GCC & clang & llvm)

    前言 很多时候 出现一些类似GNU GCC CLANG LLVM等与编译器有关的名词的时候 都不太清楚它到底是干嘛的 理解这些东西后 对于xcode中很多配置型的需求修改起来都会得心应手 因此有必要了解透彻他们直接的关系与区别 1 GNU