Linux下C编译系统

2023-11-16

Linux下C编译系统

编译过程概述
了解一些编译知识的读者都知道,所谓编译,就是在编译程序读取源程序(字符流),对之进行词法和语法的分析,将高级语言指令转换为功能等效的汇编代码,再由汇编程序转换为机器语言,并且按照操作系统对可执行文件感谢格式的要求链接生成可执行程序。
UNIX环境下的C编译系统所遵循的也是这么一个一般的过程。值得注意的是这个过程并不是有某个单个程序完成的,而是有多个分别完成某一方面工作的程序组合完成的。这一设计思想同我们最初提到的UNIX系统软件功能专一的特点是相符的。
归纳起来,可以将UNIX环境下C编译系统的工作过程下图所示。
C源程序头文件-->预编译处理(cpp)-->编译程序本身-->优化程序-->汇编程序-->链接程序-->可执行文件
一般我们用cc命令来完成对源程序的编译工作。此cc命令并不是一个二进制的可执行程序,而是一个shell命令文件。它的工作就是依次调用我们上面所列出的各个完成某部分工作的具体程序,将指定的c源程序转换成可执行的代码。
1.编译预处理
在此阶段,预编译程序读取c源程序,对其中的伪指令(以#开头的指令)和特殊符号进行处理。C语言中的伪指令主要包括以下四个方面
(1)宏定义指令,如# define NameTokenString,#undef等。对于前一个伪指令,预编译所要作得的是将程序中的所有Name用TokenString替换,但作为字符串常量的Name则不被替换。对于后者,则将取消对某个宏的定义,使以后该串的出现不再被替换。
(2)条件编译指令,如#ifdef,#ifndef,#else,#elif,#endif,等等。这些伪指令的引入使得程序员可以通过定义不同的宏来决定编译程序对哪些代码进行处理。预编译程序将根据有关的文件,将那些不必要的代码过滤掉
(3)头文件包含指令,如#include "FileName"或者#include<FileName>等。在头文件中一般用伪指令#define定义了大量的宏(最常见的是字符常量),同时包含有各种外部符号的声明。采用头文件的目的主要是为了使某些定义可以供多个不同的C源程序使用。因为在需要用到这些定义的C源程序中,只需加上一条#include语句即可,而不必再在此文件中将这些定义重复一遍。预编译程序将把头文件中的定义统统都加入到它所产生的输出文件中,以供编译程序对之进行处理。
包含到c源程序中的头文件可以是系统提供的,这些头文件一般被放在/usr/include目录下。在程序中#include它们要使用尖括号(<>)。另外开发人员也可以定义自己的头文件,这些文件一般与c源程序放在同一目录下,此时在#include中要用双引号("")。关于预编译程序如何搜索头文件,后面我们将要介绍。
(4)特殊符号,预编译程序可以识别一些特殊的符号。例如在源程序中出现的LINE标识将被解释为当前行号(十进制数),FILE则被解释为当前被编译的C源程序的名称。预编译程序对于在源程序中出现的这些串将用合适的值进行替换。
从上述过程我们可以看到,预编译程序所完成的基本上是对源程序的“替代”工作。经过此种替代,生成一个没有宏定义、没有条件编译指令、没有特殊符号的输出文件。这个文件的含义同没有经过预处理的源文件是相同的,但内容有所不同。下一步,此输出文件将作为编译程序的输出而被翻译成为机器指令。
2.编译阶段
经过预编译得到的输出文件中,将只有常量。如数字、字符串、变量的定义,以及C语言的关键字,如main,if,else,for,while,{,},+,-,*,/,等等。预编译程序所要作得工作就是通过词法分析和语法分析,在确认所有的指令都符合语法规则之后,将其翻译成等价的中间代码表示或汇编代码。
这种等价的中间代码表示或汇编代码由于是编译程序按照一种比较固定的、相对而言比较机械的方法转换得到的。自然我们不能指望它具有比较高的效率。但一般情况下,我们在这方面的要求也不是很高,这样得到的代码也就基本上可以了。但特殊情况下还要对此种程序进行优化,以期产生效率比较高的代码。
3.优化阶段
优化处理是编译系统中一项比较艰深的技术。它涉及到的问题不仅同编译技术本身有关,而且同机器的硬件环境也有很大的

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

Linux下C编译系统 的相关文章

随机推荐

  • AQS原理 自己浅显理解

    http ifeve com java special troops aqs 这篇博客讲的很好 通篇看完收获不少 精简一下自己的收获 1 AQS是一个基于状态 state 的链表管理方式 reentracntlock这个锁是基于AQS实现的
  • shell-循环语句和case分支

    一 if 循环 if 条件 then 执行内容 elif then 执行内容 else 执行内容 fi 或者 if 条件 then 执行内容 else 执行内容 fi 例 chmod x 脚本名 给与执行权限 二 case 分支 case
  • 1-2、如何学习Linux

    1 2 如何学习Linux 版本说明 版本 作者 日期 备注 0 1 loon 2018 12 6 初稿 目录 文章目录 1 2 如何学习Linux 版本说明 目录 一 前言 二 如何学习Linux 三 最后 一 前言 注意 这里不是要教你
  • 一个人走的快,一群人才走的远

    有太多的技术文章来指引我们解决技术痛点问题 但很少有文字来帮助我们解答个人成长 职业发展 持续学习等思维意识层面的问题 07年计算机专业毕业后 抱着无限的迷茫踏上了漫漫职业生涯路 从菜鸟做起 一路走来也是跌跌撞撞 诚惶诚恐 很多时候都在想
  • Exception: Content is not allowed in prolog-搜集

    用webwork验证时老发生错误 提示Content is not allowed in prolog 由于是解析xml文件出错 找到相应的文件一看 发现开头有几行汉字说明忘注释掉了 我把它们注释掉 问题得到解决 由于以前没遇到这种问题 于
  • MRI是如何实现成像体素的空间定位的

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 磁共振的每一个信号都含有全层的信息 因此需要对磁共振信号进行空间定位编码 即频率编码和相位编码 接收线圈采集到的MR信号实际是带有空间编码信息的无线电波 属于模拟信号而非数
  • matlab 与 VC 混编函数参数传递<2>

    下面是这个例子用到的m代码 它定义了一个名为myadd2的函数 Copy to clipboard CODE function y z myadd2 a b dummy function just to demonstrate the id
  • vmware导入别人虚拟机

    https blog csdn net qq 43271194 article details 105855516 utm source app app version 4 21 1
  • LayUi介绍&前言

    目录 1 什么是layui 2 layui easyui与bootstrap的对比 有趣的对比方式 嘿嘿嘿 easyui jquery html4 用来做后台的管理界面 半老徐娘 bootstrap jquery html5 美女 拜金 l
  • 《学会提问:批判性思维指南》

    批判性思维的三个方面 1 有一套相互关联 环环相扣的关键问题的意识 2 恰如其分地提出和回答关键问题的能力 3 积极主动地利用问题的强烈愿望 思维方式 海绵式思维 1 吸收外部世界的信息越多 就越有头绪 2 被动的方式 不知如何取舍 淘金式
  • XPath提取网页数据(附实例)

    文章目录 一 XPath语法 二 用Python实践 Python爬虫的两个思路 三 三个案例 完整代码 一 XPath语法 借助Chrome浏览器的XPath插件来学习XPath语法 网页测试无误再把规则拿下来写代码 视频学习链接 网络爬
  • java 泛型多重限制,java中基于超类和子类的泛型类型的多重限制

    I have a generic list class that implements a particular interface The list items in the interface also implement the sa
  • B树、B-树、B+树的定义和区分

    B 树 B 树又名B树 我们把所有的数据进行折半块查找 比如一共100条数据 在30和60的地方分一下 存放30和60的节点就是根节点 30和60就是该节点的关键字 100也就是分成了3份 这个节点自动创建三个指针 这三份就是根节点的子节点
  • linux查看系统属性

    系统 uname a 查看内核 操作系统 CPU信息 head n 1 etc issue 查看操作系统版本 cat proc cpuinfo 查看CPU信息 hostname 查看计算机名 lspci tv 列出所有PCI设备 lsusb
  • DDSM数据库使用说明

    一 官网下载 我们的下载工具是winscp软件 该软件可以用于远程ftp下载 首先 在网上搜索安装包进行下载安装 安装之后 打开软件 选择ftp 输入DDSM网址 匿名登录 等待连接以后 就可以看到我们需要下载的资源 然后选择我们需要下载的
  • Xcode7.1环境下上架iOS App到AppStore 流程 (Part 一)

    前言部分 之前App要上架遇到些问题到网上搜上架教程发现都是一些老的版本的教程 目前iTunesConnect 都已经迭代好几个版本了和之前的 界面风格还是有很大的差别的 后面自己折腾了好久才终于把自己的App上架 所以一直想写个最新 Xc
  • TortoiseGit工具 修改登录用户名密码

    TortoiseGit是大家常用的git客户端 操作起来非常的简便 但是当账号密码变化之后 再使用TortoiseGit操作git就会提示没有权限 那么 TortoiseGit怎么修改用户名密码呢 下面本文就介绍一下 方法 步骤 首先 打开
  • umi配置chainWebpack,使用自定义loader----jsx-px2rem

    目录 吐槽 loader 修改chainWebpack配置 完结 吐槽 最初追随潮流 老大看到了umi这个国人开发标签的框架 觉得可以尝试 并且相信阿里 从此开始了填坑之路 虽然云谦大佬在github上说了 umi本身的配置已经很完善了 但
  • win10+ubuntu20.04 双系统卸载ubuntu20.04

    清除Ubuntu系统分区 使用磁盘管理器比较省事 也可使用diskgenius 打开磁盘管理器后可以看到Ubuntu分区 如图所示 右键删除卷即可 删除开启引导启动项 删除了Ubuntu系统所有分区后 Windows的EFI分区里仍然会有U
  • Linux下C编译系统

    Linux下C编译系统 编译过程概述 了解一些编译知识的读者都知道 所谓编译 就是在编译程序读取源程序 字符流 对之进行词法和语法的分析 将高级语言指令转换为功能等效的汇编代码 再由汇编程序转换为机器语言 并且按照操作系统对可执行文件感谢格