c 各种编译器(gcc clang)
GCC原名为GNU C语言编译器(GNU C Compiler),因为它原本只能处理C语言。GCC很快地扩展,变得可处理C++。之后也变得可处理Fortran、Pascal、Objective-C、Java、Ada,以及Go与其他语言。
由于GCC已成为GNU系统的官方编译器(包括GNU/Linux家族),它也成为编译与创建其他操作系统的主要编译器,包括BSD家族、Mac OS X、NeXTSTEP与BeOS。
这个软件项目在2005年由苹果电脑发起,是LLVM编译器工具集的前端(front-end),目的是输出代码对应的抽象语法树(Abstract Syntax Tree, AST),并将代码编译成LLVM Bitcode。接着在后端(back-end)使用LLVM编译成平台相关的机器语言 。Clang支持C、C++、Objective C。
LLVM历史
Apple(包括中后期的NeXT) 一直使用GCC作为官方的编译器。GCC作为开源世界的编译器标准一直做得不错,但Apple对编译工具会提出更高的要求。
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 hello.c -o hello
学过编译原理这门课程的同学对下面这副图应该很熟悉,这是经典的编译流程。
下面以GCC编译器为例,GCC作为经典的编译器,自然也是遵循这个教科书流程(实际GCC的处理更复杂点,但本质上是一样的)。我们先简化一下上面这幅图,以中间代码为分界,前面的词法分析、语法分析、语义分析我们把它称之为前端处理,后面的优化和目标代码生成我们称之为后端处理。
试想一下,是否可以为不同的高级语言单独写一个前端,然后为不同的处理器架构单独写一个后端呢?
GCC基本上也是这么实现的,不过不要误会,并没有一个统一的gcc执行程序能够处理如此多的前端和后端,每个语言的编译器都是一个独立的程序(如C语言 的编译器是gcc,C++的编译器是g++),而不同的后端也要对应不同的可执行程序。你可以下载单独的一份GCC源代码,通过不同的configure 来生成自己需要的编译器。
而且,编译器的实现也比上图要复杂的多,前端的主要功能是产生一个可供后端处理的语法树,而语法树结构实际上很难与处理器架构脱钩,这些都是编译器应用中需要解决的问题。
GCC强大的真正原因是什么?是因为它支持了众多的前端和后端吗?这些都不过是一个表象而已。GCC是一款真正自由的编译器,我们可以随时把代码拿过来修 改以实现自己需要的功能。如果你的硬件平台增加了一些指令,而普通的编译器并不能产生这些指令怎么办?在GCC后端添加这些指令吧。如果你觉得C语言用的 不太顺手,想给它添加一些功能怎么办?修改GCC的前端吧。因为有了GCC,我们才拥有这些自由,以及迅速实现自己想法的能力,而这些才是GCC强大背后 的基础。
c 各种编译器(gcc clang)相关推荐
- 编译器GCC与Clang的异同
GCC:GNU(Gnu's Not Unix)编译器套装(GNU Compiler Collection,GCC),指一套编程语言编译器,以GPL及LGPL许可证所发行的自由软件,也是GNU项目的关键 ...
- 编译器(GNU GCC clang llvm)
前言: 很多时候,出现一些类似GNU,GCC,CLANG,LLVM等与编译器有关的名词的时候,都不太清楚它到底是干嘛的,理解这些东西后, 对于xcode中很多配置型的需求修改起来都会得心应手,因此有必 ...
- 解读帖子:结构化编译器前端 Clang 介绍(VS2017编译clang)
因为需要提取出头文件或源文件的函数名列表和相应的函数参数类型,我想从已有的编译器中寻找函数调用,于是我找到了--结构化编译器前端 Clang 介绍 这个贴子折腾了我很久(还有几个开源项目我也没有搞定) ...
- 编译器 LLVM Clang原理与实战 制作自己的编译器 source-to-source 源代码转换 编译遍 compile pass 代码插桩
编译器 LLVM Clang原理与实战 参考1 clang LLVM CMU 教案 深入剖析-iOS-编译-Clang-LLVM LLVM_proj LLVM编程索引 llvm源码浏览带跳转 llvm ...
- 编译器 llvm clang 源码转换示例
编译器 llvm clang 源码转换示例 从git获取llvm项目的源码方式: git clone https://github.com/llvm/llvm-project.git 下载源码后,进入 ...
- Linux编译器GCC的使用
嵌入式Linux编译器GCC的使用 1.GCC概述 作为自由软件的旗舰项目,Richard Stallman在十多年前刚开始写作GCC的时候,还只是仅仅把它当作一个C程序语言的编译器,GCC的意思也只 ...
- MinGW-w64安装教程——著名C/C++编译器GCC的Windows版本
基本操作就是将下面下载的任意版本解压到你想安装的目录而后将bin 添加到环境变量即可 https://download.csdn.net/download/weixin_32759777/850205 ...
- Linux 之 编译器 gcc/g++参数详解
2016年12月9日16:48:53 ----------------------------- 内容目录: [介绍] gcc and g++分别是gnu的c & c++编译器 gcc/g+ ...
- 【Linux】三、Linux 环境基础及开发工具使用(上篇)|开发工具|编辑器-vim使用|sudo提升权限问题|编译器 - gcc/g++使用|项目自动化构建工构建工具-make/Makefile
目录 一.开发工具 二.Linux编辑器 - vim使用 2.1 vim 的基本概念 2.2 vim的基本操作 2.3 vim正常模式命令集 2.4 vim末行模式命令集 2.5 简单vim配置 2. ...
最新文章
- LeetCode简单题之图片平滑器
- [文摘20070930]人际关系,你有五十五招
- (0012) iOS 开发之MAC 终端命令学习
- debian重启ssh服务_Jenkins远程部署Linux服务器
- 第二十三天 how can I 坚持
- 进入虚拟化服务器,服务器虚拟化即将进入3.0时代
- 关于字符集的简单介绍
- 批处理批量创建域用户
- 腾讯2019实习生笔试(编程题)
- 使用CXF开发WebService程序的总结(七):Spring+CXF+Mybatis+Mysql共同打造的服务端示例...
- 最新基于高德地图的android进阶开发(3)GPS地图定位
- 萤火虫小程序_十一爱萌乐园试营业欢乐开启!萤火虫星光夜梦幻来袭!更有…...
- TIGER(泰格)胡东国老师带单有盈利吗?平台正规吗?
- 全面了解三极管——三极管基本参数2
- 公式推导 圆面积公式 圆周长公式
- windows mingw 64,SDL ,devil,glfw,opengl,qt环境搭建
- LaTex 之 各类括号总结
- 黑白和彩色CCD摄像机成像原理简介
- SSR服务端渲染(nuxt重构项目)
- B站网页视频加速设置
热门文章
- oracle修改时区无效,Oracle 时区问题
- python网络爬虫程序技术,Python网络爬虫程序技术
- python分块处理功能_Python-numpy实现灰度图像的分块和合并方式
- springboot 分层_限量!阿里Spring Boot成长笔记终开源!理论实战满满
- 有关Run-Time Check Failure #2 - Stack around the variable 'XXX' was corrupted.错误的解决方法
- 自定义html托管,10分钟搞定“傻瓜式”的静态网站搭建托管之旅
- 使用beanutil简化request值的接收
- Xcode可重用代码块code snippets
- MXNet动手学深度学习笔记:卷积计算
- Bzoj2780: [Spoj]8093 Sevenk Love Oimaster