C语言程序运行过程

简介: C语言程序运行过程


众所周知计算机是只能识别二进制指令的,那么我们写得代码计算机究竟是怎么识别的呢?

在ANSI C(标准C)的任何一种实现中,存在两个不同的环境。

第1种是翻译环境,在这个环境中源代码被转换为可执行的机器指令。

第2种是运行环境,它用于实际执行代码。

翻译环境

image.png

  • 组成一个程序的每个源文件都会单独通过编译过程分别转换成对应的目标文件
  • 每个目标文件由链接器捆绑在一起,形成一个单一而完整的可执行程序
  • 链接器同时也会引入标准C函数库中任何被该程序所用到的函数,而且它可以搜索程序员个人的程序库,将其需要的函数也链接到程序中

翻译环境又可以分为:

编译

  • 预编译
  • 编译
  • 汇编

链接



编译

预编译

预编译会生成一个.i为后缀的文件。左图是源程序,右图为经过预编译之后的程序(最上面那几行都是对头文件的引用)。

image.png

程序在预编译阶段要做的都是一些文本操作:

  1. 将代码中的所有注释进行删除;
  2. 将#define定义的所有的宏和标识符进行替换;
  3. 对所有头文件进行包含;
  4. 对所有的预处理指令进行处理。

编译

代码经过预编译阶段的处理后就进入了编译阶段,在这个阶段代码会被翻译成汇编代码放在一个后缀为.s的文件中。

image.png

这就是上述代码经过编译阶段后所生成的.s文件中的汇编代码。

在编译阶段程序会进行以下操作:

  • 语法分析
  • 词法分析
  • 语义分析
  • 符号汇总

汇编

在汇编阶段代码会被转换成二进制代码。

在 Linux下gcc编译后所产生的目标文件和可执行程序都是以ELF格式进行存储的。而这种格式可以在gcc中用下面的指令所识别(readelf test.o -a):

image.png

在汇编阶段程序会进行以下操作:

  • 形成符号表;
  • 将汇编代码转化成二进制代码。

符号表示什么呢?

在编译阶段有一部是符号汇总下面的代码在经过符号汇总后会生成符号表变成如图所示:

image.png

链接

在链接阶段程序会由.o文件转换成可执行程序。

在链接阶段程序会进行以下操作:

  • 合并段表;
  • 符号表的合成与重定位。

由于每个源文件都会单独生成一个符号表而可执行程序却只有一个所以会进行符号表的合并将名称一样的符号进行合并,并替换无效地址,用上文的程序距离如果impgame.c文件中没有定义ADD函数那么此时程序就会报错。也就是说函数是在链接阶段发现被调用的函数未定义。




运行环境

程序执行的过程:

  1. 程序必须载入内存中。在有操作系统的环境中:一般这个由操作系统完成。在独立的环境中,程序的载入必须由手工安排,也可能是通过可执行代码置入只读内存来完成。
  2. 程序的执行便开始。接着便调用main函数。
  3. 开始执行程序代码。这个时候程序将使用一个运行时堆栈(stack),存储函数的局部变量和返回地址。程序同时也可以使用静态(static)内存,存储于静态内存中的变量在程序的整个执行过程一直保留他们的值。
  4. 终止程序。正常终止main函数;也有可能是意外终止。
目录
相关文章
|
1月前
|
存储 自然语言处理 编译器
【C语言】编译与链接:深入理解程序构建过程
【C语言】编译与链接:深入理解程序构建过程
|
3月前
|
存储 算法 C语言
"揭秘C语言中的王者之树——红黑树:一场数据结构与算法的华丽舞蹈,让你的程序效率飙升,直击性能巅峰!"
【8月更文挑战第20天】红黑树是自平衡二叉查找树,通过旋转和重着色保持平衡,确保高效执行插入、删除和查找操作,时间复杂度为O(log n)。本文介绍红黑树的基本属性、存储结构及其C语言实现。红黑树遵循五项基本规则以保持平衡状态。在C语言中,节点包含数据、颜色、父节点和子节点指针。文章提供了一个示例代码框架,用于创建节点、插入节点并执行必要的修复操作以维护红黑树的特性。
102 1
|
3月前
|
NoSQL 编译器 程序员
【C语言】揭秘GCC:从平凡到卓越的编译艺术,一场代码与效率的激情碰撞,探索那些不为人知的秘密武器,让你的程序瞬间提速百倍!
【8月更文挑战第20天】GCC,GNU Compiler Collection,是GNU项目中的开源编译器集合,支持C、C++等多种语言。作为C语言程序员的重要工具,GCC具备跨平台性、高度可配置性及丰富的优化选项等特点。通过简单示例,如编译“Hello, GCC!”程序 (`gcc -o hello hello.c`),展示了GCC的基础用法及不同优化级别(`-O0`, `-O1`, `-O3`)对性能的影响。GCC还支持生成调试信息(`-g`),便于使用GDB等工具进行调试。尽管有如Microsoft Visual C++、Clang等竞品,GCC仍因其灵活性和强大的功能被广泛采用。
124 1
|
3月前
|
编译器 C语言 计算机视觉
C语言实现的图像处理程序
C语言实现的图像处理程序
155 0
|
1月前
|
存储 文件存储 C语言
深入C语言:文件操作实现局外影响程序
深入C语言:文件操作实现局外影响程序
|
2月前
|
存储 编译器 程序员
C语言程序的基本结构
C语言程序的基本结构包括:1)预处理指令,如 `#include` 和 `#define`;2)主函数 `main()`,程序从这里开始执行;3)函数声明与定义,执行特定任务的代码块;4)变量声明与初始化,用于存储数据;5)语句和表达式,构成程序基本执行单位;6)注释,解释代码功能。示例代码展示了这些组成部分的应用。
95 10
|
3月前
|
自然语言处理 编译器 C语言
C语言程序的编译
C语言程序的编译
65 2
|
4月前
|
Linux C语言 Windows
C语言文件编程-Linux环境下运行
本文介绍了在Linux环境下使用C语言进行文件编程时的两种主要接口:C标准库函数与Linux系统调用。C标准库提供了`fopen`, `fread`, `fwrite`, 和 `fclose`等函数,适用于普通文件操作;而Linux系统调用如`open`, `read`, `write`, 和 `close`则更适合处理设备文件,同时也可用于普通文件。这两种方法的主要区别在于前者使用文件指针,后者使用文件描述符。文章还给出了两个示例程序:一个使用C标准库函数实现文件复制,另一个则使用Linux系统调用完成相同任务。
|
4月前
|
前端开发 C语言 C++
C语言03----第一个程序HelloWorld(vs版)
C语言03----第一个程序HelloWorld(vs版)
|
5月前
|
自然语言处理 C语言 C++
程序与技术分享:C++写一个简单的解析器(分析C语言)
程序与技术分享:C++写一个简单的解析器(分析C语言)