GCC强大背后

2023-11-11

前记: 经常浏览博客园的同学应该会觉得本文有标题党之嫌,这个标题的句式来自于MiloYip大牛的大作《C++强大背后》,在此,向Milo兄致意。

 

 

GCC,全称GNU Compiler Collection,是一套GNU开发的编译器环境,它的创始人便是大名鼎鼎的Richard.M.Stallman。最初GCC刚开始开发时,它还叫做GNU C Compiler,随着开发的深入,GCC很快得到了扩展,不仅可以支持C语言,还可以处理C++,Pascal,Object-C,Java以及Ada等其他语言。目前,GCC不仅是GNU的官方编译器,也成为编译和创建其他操作系统的编译器,包括BSD家族以及MAC OS X等。另外,GCC也是跨平台交叉编译的首选,它不仅支持Intel的x86系列,同时也支持MIPS,ARM,PowerPC,SPARC等等处理器。可以这么说,即使GCC不是世界上效率最高的编译器,它也一定是世界上最全面的编译器。

 

1. GCC简介

我们先回到一个常识性的问题,什么是编译器呢?简单地说,编译器可以看作是一个语言翻译器。就像把中文翻译成英语一样,编译器可以把高级语言翻译成计算机能够执行的机器语言。这样看来,GCC可以算得上是一个精通多国语言的高级翻译官了。
最简单的GCC使用指令如下所示:
gcc  hello.c  -o  hello
 
GCC接受hello.c作为输入,最后产生目标可执行代码hello。这个简单的流程实际上经历了很多步骤,如下图所示:
虽然我们只用了一条命令就完成了编译,但实际上gcc命令依次呼叫了cpp,gcc自己,gas以及ld来进行完整的编译流程,最后生成最终的可执行文件hello。
下面我们看一下分解动作:
cpp  hello.c  >  hello.i
gcc  -S  hello.i
as  hello.s  -o  hello.o
ld  -dynamic-linker  /lib/ld-linux.so.2  /usr/lib/crt1.o  /usr/lib/crti.o  /usr/lib/gcc/i686-linux-gnu/4.4.5/crtbegin.o -L/usr/lib/gcc/i686-linux-gnu/4.4.5 hello.o  -lgcc  -lgcc_eh  -lc  /usr/lib/gcc/i686-linux-gnu/4.4.5/crtend.o  /usr/lib/crtn.o  -o  hello
 
看完这些步骤有没有晕头转向的感觉呢?对于普通的用户来说,还是让GCC帮我们做这些事情比较好。
对于如何学习使用GCC,可以参考GCC官方的手册,如果大家觉得官方的手册太罗嗦,我这里推荐一本GCC的入门书籍《 An Introduction to GCC》,这本书详尽的介绍了GCC的使用方法,内容浅显易懂,很适合初学者。
 

2. GCC强大的背后

学过编译原理这门课程的同学对下面这副图应该很熟悉,这是经典的编译流程。

GCC作为经典的编译器,自然也是遵循这个教科书流程(实际GCC的处理更复杂点,但本质上是一样的)。我们先简化一下上面这幅图,以中间代码为分界,前面的词法分析、语法分析、语义分析我们把它称之为前端处理,后面的优化和目标代码生成我们称之为后端处理。

试想一下,是否可以为不同的高级语言单独写一个前端,然后为不同的处理器架构单独写一个后端呢?

GCC基本上也是这么实现的,不过不要误会,并没有一个统一的gcc执行程序能够处理如此多的前端和后端,每个语言的编译器都是一个独立的程序(如C语言的编译器是gcc,C++的编译器是g++),而不同的后端也要对应不同的可执行程序。你可以下载单独的一份GCC源代码,通过不同的configure来生成自己需要的编译器。

而且,编译器的实现也比上图要复杂的多,前端的主要功能是产生一个可供后端处理的语法树,而语法树结构实际上很难与处理器架构脱钩,这些都是编译器应用中需要解决的问题。

GCC强大的真正原因是什么?是因为它支持了众多的前端和后端吗?这些都不过是一个表象而已。GCC是一款真正自由的编译器,我们可以随时把代码拿过来修改以实现自己需要的功能。如果你的硬件平台增加了一些指令,而普通的编译器并不能产生这些指令怎么办?在GCC后端添加这些指令吧。如果你觉得C语言用的不太顺手,想给它添加一些功能怎么办?修改GCC的前端吧。因为有了GCC,我们才拥有这些自由,以及迅速实现自己想法的能力,而这些才是GCC强大背后的基础。

2010年1月份的时候,Google的Go语言前端被允许进入GCC编译器家族,GCC更加强大了。

 

3. GCC的多样性

GCC因为其灵活性被应用到了很多领域和系统,从PC上的开发到嵌入式开发,都可以见到GCC的影子。
 

3.1   PC开发

我们先看看PC。MAC自从投入Intel的怀抱,是否也可以看作是一种PC呢?

Linux

Linux系统应该是GCC的主战场,但也是最没必要去说的一个系统,除了GCC,难道我们还有更好的选择吗?Linux内核、Apache服务器、MySQL数据库,等等一系列伟大的作品都是通过GCC来构建的,GCC可以说是GNU/Linux系统的基石。

MAC OS X

MAC OS X也是GCC的重度用户,其应用程序开发环境Cocoa就是使用的GCC,所以在MAC OS X下开发也是离不开GCC的。

Windows

现在在Windows下开发C/C++程序一般都是用微软的编译器,当年的Borland已经成为传说。但是如果你不想付钱的话,也可以考虑Windows下的GCC。
在Windows下体验GCC最常用的有两种方式:一是在Cygwin下使用GCC,另外一种是使用MinGW。
Cygwin是一个自由软件的集合,最初由Cygnus Solutions开发,目的是在Windows系统上运行类Unix的软件。通过Cygwin编译的程序可以在Windows上运行,但必须使用cygwin.dll。
MinGW(Minimalist GNU for Windows),是将GNU开发工具移植到Windows平台的产物,包括一系列头文件、库和可执行文件,用MinGW开发的程序不需要额外的第三方DLL就可以直接在Windows上运行。Nokia的图形开发包QT在Windows下就是调用MinGW来编译的。

DOS

在DOS系统下也是可以用GCC的,国内的DOS开发者可能更熟悉Turbo C或者Open Watcom,GCC的DOS版本 DJGPP其实也是32位DOS程序开发的主流环境之一。最初DJGPP的发起人DJ Delorie曾经询问过Richard Stallman,FSF是否考虑过把GCC移植到MS-DOS下,当时Richard的回答是GCC太庞大,而MS-DOS只不过是个16位的操作系统,所以官方并没有考虑这件事。DJ Delorie并没有因此而退缩,最终给我们带来了这个优秀的开发平台。DJGPP刚开始开发时叫做djgcc,在引入了C++之后改为现在这个名字(DJ's GNU Programming Platform)。
 

3.2   嵌入式开发

对于嵌入式开发领域来说,因为开发板的能力限制,是无法运行编译环境的,这样就需要在PC上通过交叉编译来生成目标可执行程序,GCC的高度灵活性在嵌入式开发上发挥了极大的作用。

Android

看看当今最火的移动平台Android,就是完全用GCC来构建的,请注意,这里指的不是Android应用程序,Android下的应用程序是运行在Dalvik虚拟机上的Java程序。

iOS

Apple的iOS应用程序开发也是用Cocoa来进行,这怎么会离开GCC呢?

MeeGo/Symbian

在Apple和Google的冲击下,Nokia似乎已经日薄西山了,但对于中国国情来说,真的是这样吗?iPhone高高在上,拥有者只会是少数,Google退出中国之后,Android Market很难在国内有所作为,再加上Nokia手机一贯皮实的口碑,现在的Symbian以及将来的MeeGo的保有量应该不会低。Nokia已经把Symbian和MeeGo的开发环境统一到QT上了,这里依然是GCC的一亩三分田。
 
 
GCC是强大的,但它并不是一个人在战斗,在它的背后站着 GNU工具链,包括make,GCC,Binutils,GDB等一系列工具,这些工具之间是相辅相成的,只有把它们组合起来使用才能发挥其最大的威力。

FROM: http://www.cnblogs.com/wwang/archive/2010/11/24/1883850.html


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

GCC强大背后 的相关文章

  • MySQL数据库表的合并及分区

    今天我们来聊聊处理大数据时Mysql的存储优化 当数据达到一定量时 一般的存储方式就无法解决高并发问题了 最直接的MySQL优化就是分区分表 以下是我个人对分区分表的笔记 1 合并表 把多个结果相同的的表合并为一个容器 容器的类型 Myis
  • 欢聚集团 -- 前端二面

    面试形式 牛客网 电话面试 30多分钟 我二面进行两次 第一次二面自我介绍完 输出等腰三角形代码还没写完牛客网面试页面就死掉了 第一次二面就这样结束了 第二次二面牛客网还是不行就直接电话面试了 面试内容 用JS在控制台输出由 构成的等腰三角
  • Harbor仓库自启动设置

    1 配置文件 cd etc systemd system vi harbor service Unit Description Harbor After docker service systemd networkd service sys
  • Java搭建区块链

    前言 为了更好的理解区块链的底层实现原理 决定自己动手模拟实现一条区块链 思路分析 通过之前的学习 从文本知识的角度 我们知道 创世区块 记账原理 挖矿原理 工作量证明 共识机制等等区块链的相关知识 创建一条区块链 首先默认构造创世区块 在
  • 【Vue介绍】

    Vue js是一套构建用户界面的渐进式框架 Vue 只关注视图层 采用自底向上增量开发的设计 Vue 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件 Vue js 使用了基于 HTML 的模板语法 允许声明式地将 DO
  • 通过方法引用获取方法名

    在学习Mybatis plus时 可以通过getter方法的方法引用来获取到对应的字段名 LambdaQueryWrapper
  • vue前端下载——jszip压缩和解压,结合file-saver导出图片zip,每20个图片分一个目录

    使用jszip和file saver导出图片 并打包为zip import JSZip from jszip import FileSaver from file saver 一 jszip解压缩 使用loadAsync zipFile为压
  • 侧信道攻击

    1 侧信道攻击简介 侧信道攻击中所指的侧信道信息一般为这几种 声音 温度 功耗 电磁 色彩 等等 这些信息叫做侧信道信息是因为 在加密硬件进行加密的时候 上述的信息只是加密过程中附带产生的一些物理量 这些物理量不会对加密提供任何好处 而天才

随机推荐

  • OSI七层模型、TCP/IP四层模型(超详细!!!!!)

    OSI七层模型 七层模型 亦称OSI Open System Interconnection 参考模型是国际标准化组织 ISO 制定的一个用于计算机或通信系统间互联的标准体系 一般称为OSI参考模型或七层模型 它是一个七层的 抽象的模型体
  • Matlab_day_3

    Matlab矩阵的表示 1 矩阵的建立 1 直接输入法 如 lt
  • AIGC 基础,从VAE到DDPM 原理、代码详解

    作者 王建周 编辑 汽车人 原文链接 https zhuanlan zhihu com p 607117094 点击下方卡片 关注 自动驾驶之心 公众号 ADAS巨卷干货 即可获取 点击进入 自动驾驶之心 AIGC 技术交流群 一 前言 A
  • yolov5 训练一半中断,如何重连

    resume python train py xxx resume last pt
  • 用ENVI为风云三号VIRR地表温度LST日产品添加头文件(地理信息)

    上一篇文章中我们介绍了怎么用ENVI查看风云三号VIRR地表温度LST日产品的属性 下面介绍怎么用ENVI将该产品从HDF格式转换成ENVI标准格式 2019 1 7更新 有小伙伴说头文件中的datum设置成unknown才可以和他的其他矢
  • 【Google drive】【Colab】引用同级下的.py文件

    ps 1 drive后稍等片刻左侧目录会刷新 2 上传文件格式为 ipynb能够直接打开编辑 py文件只读模式
  • 1-5、Lua函数

    1 5 Lua函数 文章目录 1 5 Lua函数 5 1 多返回值 5 2 可变参数 5 3 命名参数 函数有两种用途 1 完成指定的任务 这种情况下函数作为调用语句使用 2 计算并返回值 这种情况下函数作为赋值语句的表达式使用 语法 fu
  • ffmpeg批量转换ape为mp3

    1 新建一个txt文件 并复制如下代码进入 然后保存 echo off title cd d dp0 for a in ape do ffmpeg i sa y acodec libmp3lame aq 0 na mp3 pause 2 把
  • 批量重命名:删除文件名相同的部分或指定的部分

    本代码提供两个函数 1 用于批量重命名文件 重命名时 删除 路径 下的文件名中含有 重复名 的部分 重命名删除同义名 路径 重复名 例如 删除 Image001 png Image002 png Image003 png 中的 Image
  • [Python人工智能] 六.神经网络的评价指标、特征标准化和特征选择

    从本系列文章开始 作者正式开始研究Python深度学习 神经网络及人工智能相关知识 前五篇文章讲解了神经网络基础概念 Theano库的安装过程及基础用法 theano实现回归神经网络 theano实现分类神经网络 theano正规化处理 这
  • DS1302时钟模块

    DS1302结构原理图 DS1302涓流充电计时芯片实时时钟 日历和31字节的静态RAM 通过IO口与微机处理器通讯 该实时时钟 日历提供年月日和时分秒星期 还具备月份闰平年自动校正 其信息与外部的传输由CE I O和SCLk 串行时钟 决
  • 数据库聚合函数

    1 常用函数 常用函数这里就不过多的阐述和演示 大家感兴趣的话 可以去官网看 官网地址 MySQL Developer Zone 我们主要讲聚合函数 2 聚合函数 聚合函数是我们经常使用的函数 常用聚合函数名称 描述 1 count 计数
  • MySQL从安装到精通(多表)

    目录 1 创建练习环境 1 1创建一个部门表 1 2创建一个员工表 2 多表查询的分类 2 1mysql 表子查询 2 1 1什么是子查询 subquery sql 2 1 2 单行子查询 2 1 3多行子查询 2 1 2 多列子查询 2
  • 【python】如何把你的python包发布出去(pip install)

    python 如何把你的python包发布出去 pip install 介绍 实际上分为两步 打包 发布 我们要发布的网站是https pypi org 也就是用户通过pip install XXX 就可以安装你的包 1 通过setupto
  • python环境的安装(Windows)

    步骤一安装 打开python官网https www python org 点击Downloads 选择Windows进入后根据自己的电脑是32位还是64位 右击此电脑属性查看 选择相应的版本下载 注意 要选择Windows installe
  • 【2023硅谷数模笔试题】~ 题目及参考答案

    本章目录 0 前言 1 题目 答案 第一题 第二题 第三题 第四题 第五题 第六题 第七题 第八题 第九题 第十题 第十一题 声明 0 前言 哈喽 二舅 最近和你们一样 不断被鞭策 今天抽个小空给大家带来的是前几天做的一套笔试题 名称如标题
  • 谈谈tomcat的优化经验

    第一次写博客 搜集了很多的优化经验 然后自己归纳下来 大概有7条 没涉及到的欢迎大家补充 1 优化方法 加大tomcat使用的jvm的内存 具体操作 Tomcat默认可以使用的内存为128MB 可在配置文件或环境变量里增加使用内存 在配置文
  • IDEA创建Maven工程后卡死,问题分析及解决

    问题 同标题 IDEA创建Maven工程后卡死 网上收集经验后 大多数版本为2020及以后的问题 但应该是同样的问题 即archetype catalog xml文件太大源地址下载过慢 这里记录一下方便的解决方式 解决方法 提前将arche
  • IDEA 热部署插件 -- JRebel

    从idea找到设置Plugins插件 激活参考http www javatiku cn idea 51 html 服务器链接 http idea javatiku cn ad4bd706 15a3 4ecf b3e3 c7b6a64942b
  • GCC强大背后

    前记 经常浏览博客园的同学应该会觉得本文有标题党之嫌 这个标题的句式来自于MiloYip大牛的大作 C 强大背后 在此 向Milo兄致意 GCC 全称GNU Compiler Collection 是一套GNU开发的编译器环境 它的创始人便