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函数;也有可能是意外终止。
目录
打赏
0
0
0
0
5
分享
相关文章
【C语言】编译与链接:深入理解程序构建过程
【C语言】编译与链接:深入理解程序构建过程
"揭秘C语言中的王者之树——红黑树:一场数据结构与算法的华丽舞蹈,让你的程序效率飙升,直击性能巅峰!"
【8月更文挑战第20天】红黑树是自平衡二叉查找树,通过旋转和重着色保持平衡,确保高效执行插入、删除和查找操作,时间复杂度为O(log n)。本文介绍红黑树的基本属性、存储结构及其C语言实现。红黑树遵循五项基本规则以保持平衡状态。在C语言中,节点包含数据、颜色、父节点和子节点指针。文章提供了一个示例代码框架,用于创建节点、插入节点并执行必要的修复操作以维护红黑树的特性。
126 1
C语言实现的图像处理程序
C语言实现的图像处理程序
251 0
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
90 5
|
2月前
|
C语言编程中,错误处理至关重要,能提升程序的健壮性和可靠性
C语言编程中,错误处理至关重要,能提升程序的健壮性和可靠性。本文探讨了C语言中的错误类型(如语法错误、运行时错误)、基本处理方法(如返回值、全局变量、自定义异常处理)、常见策略(如检查返回值、设置标志位、记录错误信息)及错误处理函数(如perror、strerror)。强调了不忽略错误、保持处理一致性及避免过度处理的重要性,并通过文件操作和网络编程实例展示了错误处理的应用。
85 4
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
84 1
C语言在网络通信程序实现中的应用,介绍了网络通信的基本概念、C语言的特点及其在网络通信中的优势
本文探讨了C语言在网络通信程序实现中的应用,介绍了网络通信的基本概念、C语言的特点及其在网络通信中的优势。文章详细讲解了使用C语言实现网络通信程序的基本步骤,包括TCP和UDP通信程序的实现,并讨论了关键技术、优化方法及未来发展趋势,旨在帮助读者掌握C语言在网络通信中的应用技巧。
67 2
C语言中的指针既强大又具挑战性,它像一把钥匙,开启程序世界的隐秘之门
C语言中的指针既强大又具挑战性,它像一把钥匙,开启程序世界的隐秘之门。本文深入探讨了指针的基本概念、声明方式、动态内存分配、函数参数传递、指针运算及与数组和函数的关系,强调了正确使用指针的重要性,并鼓励读者通过实践掌握这一关键技能。
57 1
深入C语言:文件操作实现局外影响程序
深入C语言:文件操作实现局外影响程序
C语言程序的基本结构
C语言程序的基本结构包括:1)预处理指令,如 `#include` 和 `#define`;2)主函数 `main()`,程序从这里开始执行;3)函数声明与定义,执行特定任务的代码块;4)变量声明与初始化,用于存储数据;5)语句和表达式,构成程序基本执行单位;6)注释,解释代码功能。示例代码展示了这些组成部分的应用。
165 10

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等