一、引言

我们平常编写C语言程序都是使用集成开发环境(IDE),这样的IDE通常是将编译和链接过程合并成一步完成,称为构建(Build)。这样对开发者虽然比较友好,但同时由于集成开发环境运行时掩盖了程序运行机制与机理,导致基础开发者并不知道从C源代码到二进制可执行文件生成中间到底经历哪些过程呢?接下来就来探索一下其中各个过程具体做了哪些工作。


二、C源代码的编译过程
c程序的基本编译过程具体如下图1和图2所示:

图1 C程序编译过程

图2 C语言源代码编译流程图

  1. 预编译
    源代码.c文件和相关头文件被预编译器预编译成一个.i文件;
    对于C++程序而言,一般是.cpp文件和头文件,预编译成.ii文件

预处理相当于根据预处理指令组装新的C/C++程序。经过预处理,会产生一个没有宏定义,没有条件编译指令,没有特殊符号的输出文件,这个文件的含义同原本的文件无异,只是内容上有所不同。

//gcc进行预编译:
gcc -E hello.c -o hello.i

具体工作:

1.删除所有“#define”,并展开所有宏定义(进行文本替换)
2.处理“#include”预编译指令,递归展开被包含的文件并插入到该预编译指令位置
3.处理“#if”、“#ifdef”、“#elif”、“endif”等条件编译指令
4.删除所有的注释(“//”和“/* */”)
5.添加行号和文件名标识,以便编译时编译器产生调试用的行号信息及用于编译时产生编译错误或警告时能够显示行号
6.保留所有的“#program”指令,因为编译器编译时需要使用它们

  • 编译
    将.i文件翻译成汇编代码.s文件(在windows中,通常使用.asm便是汇编文件)
//gcc进行编译:gcc -S hello.i -o hello.s//新版本的gcc把预编译和编译两个步骤合并成一个步骤,使用了一个叫cc1的程序。
// 使用的命令如下:gcc -S hello.c -o hello.s

具体工作:

1.词法分析
(对构成源程序的字符串从左到右进行扫描分析,根据语言的词法规则识别一个一个具有独立意义的单词,例如:保留字(begin、end、for、while等)、标识符、常数、运算符、界符等)
2.语法分析
(根据语言的语法规则,把单词符号串分解成各类语法单位,如短语、子句、句子、程序段等,并检查各种语法单位在语法结构上的正确性)
3.语义分析
(对每种语法单位进行静态语义(静态语义指程序在语义上要遵守的规则)审查,然后分析其含义,并用另一种语言形式来描述这种语义)
4.中间代码生成及优化
5.生成汇编代码文件(生成指令)

  • 汇编
    通过汇编器as将编译完的汇编代码文件翻译成机器指令,并生成可重定位目标程序的.o文件,该文件为二进制文件,字节编码是机器指令。
//gcc进行汇编:
gcc -c hello.s -o hello.o
//也可以使用gcc命令从源代码文件开始,经过预编译、编译、汇编直接输出目标文件
gcc -c hello.c -o hello.o
  • 链接
    通过链接器将一个个目标文件(或许还会有库文件)链接在一起生成一个完整的可执行程序。
    具体工作:

1.合并段和符号表
2.符号解析
3.分配地址和空间
4.符号重定义

  • 执行
    具体工作:

1.创建虚拟内存空间和物理内存(创建PCB)
2.加载指令和数据
3.将入口地址写入下一条指令寄存器


三、编译程序、翻译程序、汇编程序、解释程序的辨析

  • 翻译程序
    将用汇编语言或高级语言编写的程序转换成等价的机器语言程序,执行这种转换功能的程序统称为翻译程序

  • 汇编程序
    源程序为汇编语言,目标程序为机器语言的翻译程序

  • 编译程序
    源程序为高级语言编写的程序,目标程序为汇编语言或机器语言的翻译程序

  • 解释程序
    接受某个语言的程序并立即运行这个源程序。它的工作模式是一个个的获取、分析并执行源程序语句,一旦第一个语句分析结束,源程序便开始运行并且产生结果,它特别适合程序员以交互方式工作的情况,即希望在获取下一个语句之前了解每个语句的执行结果,允许执行时修改程序。

编译方式和解释方式实现高级语言的编译的区别:
在解释方式下,并不生成目标代码程序,而是直接执行源程序本身

【C语言】源代码的编译过程相关推荐

  1. gcc编译c文件_Linux下C语言程序的编译过程

    Linux下C语言程序的编译过程 使用gcc编译程序时,编译工程分为4个阶段: (1)预处理:(Pre-Processing) (2)编译:(Compiling) (3)汇编:(Assembling) ...

  2. c语言的详细编译过程

    gcc编译c语言的整个编译过程可分为预编译->编译->汇编->链接 我们先编辑一个name.c文件 1 # include<stdio.h> 2 int main(int ...

  3. C语言学习笔记---001C语言的介绍,编译过程原理,工具等

    C语言学习笔记---001C语言的介绍,编译过程原理,工具等 创梦技术交流平台:资源下载,技术交流,网络赚钱: 交流qq群:1群:248318056 2群:251572072 技术交流平台:cre.i ...

  4. C语言程序makefile编译过程

    C语言程序makefile编译过程 2022-0111 blog_010 makefile是一些大型linux下开发的项目经常会用到的编译脚本: 可以将makefile理解为类似shell一样的脚本语 ...

  5. C语言之gcc编译过程(十二)

    一.C语言gcc编译过程: .c/*源代码文件*/ .h/*C语言头文件*/ .i/*经过预处理之后的源代码文件*/ .s/*汇编代码文件*/ .o/*目标代码文件(二进制机器指令文件)*/ .a/* ...

  6. 【C语言】GCC编译过程详述

    目录 一.说明 二.GCC语法和参数 2.1 GCC语法 2.2 参数 2.3 C程序中的头文件包含两种情况∶ 三.基本规则 四.更多的常用选项 4.1 编译的时候 4.2 预处理选项 4.3 警告选 ...

  7. Linux下C语言程序的编译过程

    使用gcc编译程序时,编译工程分为4个阶段: (1)预处理:(Pre-Processing) (2)编译:(Compiling) (3)汇编:(Assembling) (4)链接:(linking) ...

  8. 嵌入式c语言1--GCC和编译过程

    目录 GCC概述 编译过程 GCC概述 GCC:GNU C Compiler GNU是一个自由的操作系统,其内容软件完全以GPL方式发布.GPL其实就是开源的意思.随着语言越来越多,慢慢的变成了GNU ...

  9. C语言——C程序编译过程

    C语言目录: 1. 概述 2. 数据类型 3. 量 4. 运算符 5. 流程控制 6. 函数 7. C程序编译过程 8. 文件 9. 内存管理 #mermaid-svg-5eSYOEOTEbZDntT ...

  10. C语言:gcc编译过程及make命令、makefile语法规则

    gcc编译过程 编译过程: make && makefile make概述 makefile语法规则 make命令格式 Makefile案例 之所以写成多个文件,是出于模拟多模块编程的 ...

最新文章

  1. CCNA--点对点协议(PPP)
  2. 优先队列/单调队列 - 滑动窗口最大值
  3. mysql监控sql
  4. mongodb在aggregate lookup 进行分页查询,获得记录总数
  5. 建设“智慧法院” 引入庭审语音识别系统
  6. ubuntu安装配置ssmtp
  7. MP3格式的音乐怎么转换成WAV格式?小编教你一招
  8. 博图——生成和导入外部源文件
  9. riot账号服务器互通吗,云顶之弈手游和PC数据互通吗账号数据同步分析
  10. 我对Javascript闭包的理解
  11. 优化无止境,爱奇艺中后台 Web 应用性能优化实践
  12. 信息学奥赛一本通:1132:石头剪子布
  13. 台式计算机无线网经常掉线,电脑无线网老是掉线怎么办?教你解决掉线问题
  14. 第 270 场力扣周赛
  15. 基于MATLAB金属表面缺陷分类与测量的GUI设计
  16. 禁止Android安装某些apk应用
  17. python 自动播放_在IPython noteb中自动播放声音
  18. 华为[ENSP]—— 实验一、二层交换原理
  19. 【Vivado使用误区与进阶】XDC约束技巧之时钟篇
  20. python分块上传

热门文章

  1. HeadFirstJava
  2. 专业解读:超高清4K是什么?
  3. 安卓开发-开发环境搭建
  4. 类似Windows开始菜单的右键菜单
  5. linux为mysql创建gpower_mysql在linux下的安装
  6. 盘点(腾讯字节谷歌等大厂)面试中常见的智力题
  7. c盘java文件误删_C盘的文件被误删如何恢复
  8. OpenCV基础——IplImage中的widthStep
  9. Java课程设计——学生成绩管理系统
  10. Roller 博客系统的搭建过程