C语言程序生命周期

这篇具有很好参考价值的文章主要介绍了C语言程序生命周期。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

可能大家都知道一个C语言程序需要经过编译生成可执行文件就可以运行起来,但是这并非是一个完整的C语言程序流程,下面我们就详细了解一下C语言程序的整个生命周期。

一个完整C语言的生命周期分为以下五个部分:

  • 编写代码
  • 编译
  • 链接
  • 装载
  • 执行

1. 编写代码

编写代码是大家最熟悉不过的了,相信大家在学校里学C语言的第一步都是输出"Hello World",也就是编写代码这一步。如果大家使用的开发环境是Visual Studio等IDE的话,直接点个运行,程序的结果就输出在你面前了。如果不详细追究过程,可能连编译是什么都不知道(初学C语言时的我就是这样的),以为编写的代码本来就是可以直接运行的,这是因为IDE(集成开发环境)把编译、链接、装载、执行都集成到运行按钮上了,IDE可以简化开发流程,对新手比较友好,但是不利于我们理解C语言程序生命周期。下面我们就详细了解一下编译、链接、装载、执行这些步骤。

2. 编译

大家都知道计算机只能识别0和1,所以编译就是将高级语言写的代码转换成计算机能够识别的二进制即0和1,如果在学习C语言的时候用的是Linux操作系统,那么应该了解编译这一过程,比如使用命令gcc main.c -o main即可将一个名为main.c的程序编译为名为main.o的二进制可执行文件。

上述命令中的gcc为C语言编译器,编译器负责编译程序。除gcc编译器以外还有许多编译器,比如负责交叉编译的gcc-arm,clang等编译器。

编译器的输入是程序源文件,比如上述命令中的main.c就是一个C语言源文件。同时编译器可以有多个输入,比如下列命令gcc main.c function.c -o main,可以将多个有关联的文件组合为一个main.o程序。当然通常情况下,不会这么编译程序,而是借助makefile。

编译器的输出是所有二进制目标文件的集合,每一个目标文件对应一个输入文件,最后为了让程序运行起来,还需要经过链接这一过程,即将所有目标文件组合为一个可执行文件的过程。

编译分为如下4个步骤:详细过程可以参考我之前写的帖子认识GCC_CyberMakes的博客-CSDN博客

a. 预处理(Preprocessing):对每个源文件进行预处理,包括宏展开、头文件包含、条件编译等。预处理的输出是扩展后的源文件。

b. 编译(Compiling):将预处理后的源文件编译成汇编代码。编译器将源代码转换为特定机器架构的汇编语言。

c. 汇编(Assembling):将汇编代码转换为机器代码,生成目标文件。汇编器将汇编语言转换为机器指令和数据。

d. 链接(Linking):链接器将所有的目标文件和库文件合并,生成最终的可执行文件。

其实链接也是编译的一部分,但是需要单独看一下,因为链接过程比较重要。

3. 链接

链接是将多个目标文件和库文件组合成一个可执行文件或者共享库的过程。链接器将目标代码与所需的库函数和其他目标文件进行组合,生成最终的可执行文件。链接分为静态链接和动态链接两种类型,动态库和静态库也是两个比较重要的概念。

静态链接和动态链接的区别:静态链接将所有需要的头文件都放到编译出来的二进制文件中。动态链接将不会链接一些不必要的库,直到程序运行时进行链接。

  1. 符号解析(Symbol resolution):链接器解析目标文件中使用的符号,包括函数、变量等。对于未定义的符号,链接器会在其他目标文件和库文件中查找定义。

  2. 重定位(Relocation):在符号解析之后,链接器需要确定每个符号在最终可执行文件中的地址。它会将每个符号的引用替换为对应的地址。

  3. 符号表生成(Symbol table generation):链接器生成一个符号表,记录所有的符号及其对应的地址。这个符号表在程序执行时,可用于动态链接、调试等。

  4. 地址解析(Address resolution):如果目标文件或库文件中有引用其他库的符号,链接器会解析这些引用,并将它们与相应的库文件关联起来。

  5. 可执行文件生成(Executable file generation):最后,链接器将经过重定位和符号解析后的目标文件和库文件合并成一个可执行文件。这个可执行文件包含了所有需要的代码和数据,可以直接执行。

链接是一个非常复杂的过程,具体推荐大家去看一下程序员的自我修养这本书。
链接的最终结果就是二进制可执行文件,其结构遵循目标平台的二进制可执行文件格式,Linux系统下的二进制可执行文件格式为ELF格式。虽然不同平台下的格式不同,但本质上可执行文件会包含.text .bss .data等由链接器链接起来的各种节。

4. 装载

装载器最重要的最用就是把链接器链接好的节复制到进程内存映射中

5. 执行

一开始我们会认为一个C/C++程序是从main函数开始执行的,但在main函数之前还会执行一些其他函数,这些函数用于为运行程序做准备。装载器装载程序后会执行一段汇编代码,初始化堆栈寄存器、PC基准其等一系列寄存器后调用main函数开始真正意义上的执行程序。文章来源地址https://www.toymoban.com/news/detail-512877.html

到了这里,关于C语言程序生命周期的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 微信小程序——生命周期,生命周期的分类,页面生命周期,生命周期函数的分类,应用的生命周期函数,页面的生命周期函数,wxs脚本概述

    生命周期( Life Cycle )是指一个对象从创建-运行-销毁的整个阶段,强调的是一个时间段。 例如: .张三出生,表示这个人生命周期的开始 .张三离世,表示这个人生命周期的结束 .中间张三的一生,就是张三的生命周期 我们可以把每个小程序运行的过程,也概括为生命周

    2024年02月01日
    浏览(60)
  • 微信小程序的全局生命周期和页面生命周期

            生命周期是指一个程序或者软件从创建、到开始、暂停、唤起、停止、卸载的过程,由于微信小程序分为全局和页面两部分,所有从这两部分来讲解微信小程序的生命周期            全局生命周期指的是使用App() 函数注册一个小程序,接受一个object参数,其指定

    2024年02月16日
    浏览(45)
  • 【C语言】函数(涉及生命周期与作用域)

    函数:是指程序中的实现某项特定需求的一小段代码 (容易跟数学上函数混淆),程序中函数翻译称为 子程序 。通常也称为 接口 ( 接口是内外连续的窗口,实现不同的功能和效果 ) 程序其实是由无数个小的函数组成,比如:我们编写 int main() 也是属于函数。函数就是运用\\\"大事

    2024年04月11日
    浏览(41)
  • 【C语言基础】那些你可能不知道的C语言“潜规则”

    📢:如果你也对机器人、人工智能感兴趣,看来我们志同道合✨ 📢:不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 📢:文章若有幸对你有帮助,可点赞 👍 收藏 ⭐不迷路🙉 📢:内容若有错误,敬请留言 📝指正!原创文,转载请注明出处 🧩UL的定义: 在

    2024年02月09日
    浏览(40)
  • 小程序的生命周期

    目录 一、生命周期的分类 二、生命周期函数的应用 1、(全局)应用的生命周期函数  2、页面的生命周期函数 3、组件的生命周期函数 1、应用的生命周期 指小程序从启动—运行—销毁的过程 2、页面的生命周期 指每个页面,从加载—渲染—卸载的过程 3、组件的生命周期

    2023年04月13日
    浏览(33)
  • 小程序系列--9.生命周期

    1. 什么是生命周期? 2. 生命周期的分类 3. 什么是生命周期函数   4. 生命周期函数的分类 5. 应用的生命周期函数  6. 页面的生命周期函数 

    2024年01月20日
    浏览(39)
  • 微信小程序生命周期

    必须在 app.js 中调用,必须调用且只能调用一次。 onLaunch : 小程序初始化完成时触发,全局只触发一次。 云开发的初始化 方便其他页面直接调用云开发的SDK 发送请求获取用户的个人信息 方便其他页面使用 获取本地存储数据 方便其他页面使用 onShow :小程序启动或切前台显

    2023年04月16日
    浏览(45)
  • 小程序组件的生命周期

    组件的生命周期,指的是组件自身的一些函数,这些函数在特殊的时间点或遇到一些特殊的框架事件时被自动触发。 其中,最重要的生命周期是 created attached detached ,包含一个组件实例生命流程的最主要时间点。          ·组件实例刚刚被创建好时, created 生命周期被触发

    2023年04月15日
    浏览(37)
  • 微信小程序——生命周期

    微信小程序有以下几个生命周期函数: onLaunch :小程序初始化时触发,只会执行一次。可以在此函数中进行全局的初始化操作。 onShow :小程序启动或从后台进入前台显示时触发。可以在此函数中执行需要在小程序显示时进行的逻辑操作。 onHide :小程序从前台进入后台时触

    2024年02月09日
    浏览(46)
  • 微信小程序 生命周期

    在小程序中,生命周期分为两类 应用生命周期 指小程序从启动-运行-销毁的过程 页面生命周期 特指小程序页面的加载-渲染-销毁的过程 生命周期函数是由小程序框架提供的内置函数,会自动按次序执行,生命周期函数允许程序员在特定的时间点执行某些特定的操作,比如,

    2024年02月13日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包