源程序是指未经编译的,按照一定的程序设计语言规范书写的,人类可读的文本文件,源程序就是所写好的代码。可执行程序,即常说的.exe程序,可以执行程序,完成计算机功能。在C语言中,.c文件就是所谓的源文件。源文件到可执行程序的过程如下

.c文件生成.obj的过程称为编译,.obj文件生成.exe文件的过程称为链接。

.obj文件就是一个程序编译生成的二进制文件,当.exe文件生成以后.obj文件就会被删除。

事实上,.c文件生成.exe文件总共经历了四个过程。

预处理阶段:对源代码文件中文件包含关系(头文件)、预编译语句(宏定义)进行分析和替换,生成预编译文件。
编译阶段:将经过预处理后的预编译文件转换成特定汇编代码,生成汇编文件
汇编阶段:将编译阶段生成的汇编文件转化成机器码,生成可重定位目标文件
链接阶段:将多个目标文件及所需要的库连接成最终的可执行目标文件

1)预编译
       主要处理源代码文件中的以“#”开头的预编译指令。处理规则见下
1、删除所有的#define,展开所有的宏定义。
2、处理所有的条件预编译指令,如“#if”、“#endif”、“#ifdef”、“#elif”和“#else”。
3、处理“#include”预编译指令,将文件内容替换到它的位置,这个过程是递归进行的,文件中包含其他文件。
4、删除所有的注释,“//”和“/**/”。
5、保留所有的#pragma 编译器指令,编译器需要用到他们,如:#pragma once 是为了防止有文件被重复引用。
6、添加行号和文件标识,便于编译时编译器产生调试用的行号信息,和编译时产生编译错误或警告是能够显示行号。

7、当想要判断宏是否正确或者头文件包含是否正确时,也可以通过预编译来查看。

gcc test.c -E > test.i

2)编译
       把预编译之后生成的xxx.i或xxx.ii文件,进行一系列词法分析、语法分析、语义分析及优化后,生成相应的汇编代码文件。
1、词法分析:利用类似于“有限状态机”的算法,将源代码程序输入到扫描机中,将其中的字符序列分割成一系列的记号。
2、语法分析:语法分析器对由扫描器产生的记号,进行语法分析,产生语法树。由语法分析器输出的语法树是一种以表达式为节点的树。
3、语义分析:语法分析器只是完成了对表达式语法层面的分析,语义分析器则对表达式是否有意义进行判断,其分析的语义是静态语义——在编译期能分期的语义,相对应的动态语义是在运行期才能确定的语义。
4、优化:源代码级别的一个优化过程。
5、目标代码生成:由代码生成器将中间代码转换成目标机器代码,生成一系列的代码序列——汇编语言表示。
6、目标代码优化:目标代码优化器对上述的目标机器代码进行优化:寻找合适的寻址方式、使用位移来替代乘法运算、删除多余的指令等。

gcc test.i -S > test.s

3)汇编
       将汇编代码转变成机器可以执行的指令(机器码文件)。 汇编器的汇编过程相对于编译器来说更简单,没有复杂的语法,也没有语义,更不需要做指令优化,只是根据汇编指令和机器指令的对照表一一翻译过来,汇编过程有汇编器as完成。经汇编之后,产生目标文件(与可执行文件格式几乎一样)xxx.obj(Windows下)、xxx.o(Linux下)。这里生成的目标文件就是二进制文件,另外,在这里会形成符号表,给这些符号会分配虚拟地址。

gcc test.s -O > test.o

4)链接

由汇编程序生成的目标文件并不能立即就被执行,其中可能还有许多没有解决的问题。例如,某个源文件中的函数可能引用了另一个源文件中定义的某个符号〈如变量或者函数调用等)﹔在程序中可能调用了某个库文件中的函数等等。所有这些问题,都需要经链接程序的处理方能得以解决。链接程序的主要工作就是将有关的目标文件彼此相连接,也即将在一个文件中引用的符号同该符号在另外一个文件中的定义连接起来,使得所有的这些目标文件成为一个能够被操作系统装入执行的统一整体。
链接分为静态链接和动态链接:
静态链接:后缀是.a,主要在编译的时候将库文件里面代码搬迁到可执行的文件中;

动态链接:后缀是.so,主要在执行的时候需要转换到库文件代码执行;

1、静态链接:
       函数和数据被编译进一个二进制文件。在使用静态库的情况下,在编译链接可执行文件时,链接器从库中复制这些函数和数据并把它们和应用程序的其它模块组合起来创建最终的可执行文件。
       空间浪费:因为每个可执行程序中对所有需要的目标文件都要有一份副本,所以如果多个程序对同一个目标文件都有依赖,会出现同一个目标文件都在内存存在多个副本;
       更新困难:每当库函数的代码修改了,这个时候就需要重新进行编译链接形成可执行程序。
       运行速度快:但是静态链接的优点就是,在可执行程序中已经具备了所有执行程序所需要的任何东西,在执行的时候运行速度快。
2、动态链接:
       动态链接的基本思想是把程序按照模块拆分成各个相对独立部分,在程序运行时才将它们链接在一起形成一个完整的程序,而不是像静态链接一样把所有程序模块都链接成一个单独的可执行文件。
       共享库:就是即使需要每个程序都依赖同一个库,但是该库不会像静态链接那样在内存中存在多分,副本,而是这多个程序在执行时共享同一份副本;
       更新方便:更新时只需要替换原来的目标文件,而无需将所有的程序再重新链接一遍。当程序下一次运行时,新版本的目标文件会被自动加载到内存并且链接起来,程序就完成了升级的目标。
       性能损耗:因为把链接推迟到了程序运行时,所以每次执行程序都需要进行链接,所以性能会有一定损失。

补充:静态链接库和动态链接库的介绍,制作及使用:Linux库_◣星河◢的博客-CSDN博客

C语言编译运行代码的过程相关推荐

  1. c语言打程序时会遇到什么问题,Sublime text3 实现C语言编译运行以及过程中可能遇到的问题...

    以前学C语言的时候主要用的编译器是cb,后来知道sublime text3配置之后可以编译运行C语言,在写简单程序的时候用起来就方便多了. 首先需要准备MinGW.sublime text3的安装包, ...

  2. 可以在线编译运行代码的网站(支持Python)

    推荐一个非常不错,可以在线编译.运行代码的网站https://www.dotcpp.com/run/ 同时支持C.C++.java.Python.php等语言,实时编译运行,非常方便

  3. c语言编译运行程序,用visual c++ 运行C语言程序的过程

    用visual c++ 运行C语言程序的过程 下面是用visual c++ 运行C语言程序的过程的详细步骤及操作教程,欢迎参考学习! 一:点击File-new(新建)出现如下对话框 在该对话框中选择第 ...

  4. keil c语言编译运行,Keil的c语言编译器

    我曾经通过查看反汇编代码对KEILC编译器进行了测试,大概有这么一下内容,也得出一些结论. (1)全局变量:如果程序中定义了全局变量,而且初始值不是0.此时,在程序调到main()函数执行前,除了要进 ...

  5. visual c语言编译运行结果,Visual Studio 2015编译运行C语言文件问题小结

    各位老友很久不见,距离上一篇博客已通过去四个多月了,这应该是近几年间隔最长的一次.很无奈,毕业季遇上了特殊时期,不少计划都被打乱了,半年前构思的各类场景在现实面前一一被抹杀,在家搞毕业设计是真的痛苦, ...

  6. win10 下用 vs code 编译调试代码的过程 (MinGW)

    一.下载软件 官网下载 vs code 和 MinGW. 二.建立工作区 1.建立文件夹 "ProjectTest",其内创建 Hello.cpp 文件,内容如下: #includ ...

  7. 配置Windows下编译运行C/C++过程

    1.首先确定电脑安装了VS或者VC++的IDE: 2.修改环境变量 在系统属性-高级-环境变量-用户变量中: 编辑PATH增加cl编译器的路径D:\Program Files\Microsoft Vi ...

  8. sublime text3c语言编译运行,c – Sublime text 3 – 编译程序并在终端中运行

    我正在使用Ubuntu 12.04,我想知道,是否有可能从终端自动运行c程序?当你不得不在构建控制台中使用它时,它真的很糟糕,因为有时候我会意外地创建无限循环,并且必须重新启动sublime文本再次工 ...

  9. Linux环境中Visual Studio Code的配置使用----编译运行C/C++(良心教程)

    之前的博文分享了下载安装[VS code]的详细教程, 有需要速戳–>Linux环境中Visual Studio Code 安装配置及其卸载(详细教程) 本篇博文分享本人初次使用[VS code ...

最新文章

  1. 文巾解题 810. 黑板异或游戏
  2. 在Tableau中去除选择高亮效果
  3. idea 设置java内存_java相关:IntelliJ IDEA设置显示内存指示器和设置内存大小的方法...
  4. mkdir和mkdir-p的区别
  5. 前端学习(3154):react-hello-react之脚手架文件介绍
  6. 所有C#程序员必须知道的13件事
  7. NLP算法面试的一些个人建议
  8. java文档注释——生成帮助文档
  9. 十大经典排序算法(C语言实现)
  10. 在图像中剪切圆形图片
  11. 涨跌的例题用C语言编辑,基于LSTM的股票涨跌分析-pytorch
  12. 2020-GKCTF-Reverse
  13. Crontab 每隔整点1小时2小时执行一次任务
  14. du和df文件大小不一致问题排查
  15. html文件怎么在桌面建立,怎么创建html网页 怎样在桌面上建立HTML网页文件?
  16. 测试ai模糊软件,AE/PR人工智能自动人脸检测马赛克模糊插件
  17. erp服务器性能测试,金蝶ERP性能测试经验分享
  18. 快速构建智慧社区场景的一种技术方案
  19. Python自动化办公 - 对PPT的操作(Python-pptx的基本使用)
  20. 爬虫配套学习-前端学习笔记06-一些动态效果

热门文章

  1. 软件补丁制作工具箱 v 1.0
  2. mongodb介绍及基本操作
  3. Java实现按中文名称排序
  4. Abaqus软件介绍
  5. Android 四大组件通信核心
  6. java无法检测到_使用JVM管理工具jvisualvm,系统提示无法检测到本地java应用程序的原因和解决办法...
  7. python pandas 官网_时间序列的Python-Pandas随机抽样
  8. visual studio如何设置背景图片
  9. 解决方法 android.view.AbsSavedState$1 cannot be cast to android.widget.CompoundButton$SavedState
  10. Could not find a getter for userState in class com.zj.entity.Users