当前位置: 首页 > news >正文

C/C++ 程序执行的主要过程

在这里插入图片描述

预处理(Preprocessing)

  • 任务:
    处理源代码中以 # 开头的预处理指令,包括:
    • 头文件包含(#include):将头文件(如 stdio.h)的内容直接插入到源文件中。
    • 宏替换(#define):将代码中的宏定义(如 #define PI 3.14)进行文本替换。
    • 条件编译(#ifdef #else #endif 等):根据条件决定代码的保留或删除(例如,区分调试和发布版本的代码)。
  • 输出:生成一个经过预处理的中间文本文件(仍为可读文本,但已展开所有预处理指令)。

编译(Compilation)

  • 任务:
    将预处理后的代码转换为汇编语言代码。编译器会进行以下操作:
    • 词法分析:将代码分解成一个个单词(Token),例如识别关键字、变量名、操作符等。
    • 语法分析:检查代码是否符合 C/C++ 语法规则(如括号是否匹配、语句是否完整)。
    • 语义分析:检查代码的语义正确性(如变量是否先定义后使用、类型是否匹配)。
    • 中间代码生成与优化:生成中间表示代码,并进行优化(如删除无用代码、优化循环),最终转换为汇编语言。
  • 输出:生成汇编代码文件(如 Helloworld.s)。

汇编(Assembly)

  • 任务:
    汇编器(Assembler)将汇编语言代码转换为机器可识别的二进制目标文件(Object File,如 Helloworld.obj 或 Helloworld.o)。每个汇编指令会被映射为对应的机器码。
  • 输出:生成二进制目标文件,此时文件中可能仍包含对其他函数(如标准库函数 printf)的未解析引用。

链接(Linking)

  • 任务:
    链接器(Linker)将多个目标文件(包括自身代码生成的 .obj 和依赖的库文件)链接成一个可执行文件(如 Helloworld.exe)。分为两种方式:
    • 静态链接:将库函数的代码直接复制到可执行文件中,最终文件较大,但运行时无需依赖外部库。
    • 动态链接:仅记录对库函数的引用信息,运行时由操作系统加载对应的动态链接库(如 .dll 在 Windows 或 .so 在 Linux)。
      链接过程会解析目标文件中的外部符号引用(如解决 printf 的具体实现来自哪里)。
  • 输出:生成可直接运行的可执行文件。

运行(Execution)

  • 任务:
    操作系统加载可执行文件到内存中,创建进程,分配资源(如内存、文件句柄),然后执行程序的指令。程序从 main 函数开始执行,直到遇到 return 或 exit 等退出操作。

相关文章:

  • [万字]qqbot开发记录,部署真寻bot+自编插件
  • JavaScript进阶(九)
  • mysql8常用sql语句
  • VLLM推理大模型显存不够后,导致程序引擎崩溃的调优方案尝试
  • Mac M系列 安装 jadx-gui
  • java架构设计
  • git cherry-pick和git stash命令详解
  • 反转链表II
  • leetcode0295. 数据流的中位数-hard
  • 关于 javax.validation.constraints的详细说明
  • HuggingFace的SafeSensor格式模型能转成Ollama格式的吗?
  • 26、测试咒语:魔法校验—— Jest+Testing Lib
  • SimpleAdmin云服务器发布
  • 浅聊一下数据库的索引优化
  • 19.Excel数据透视表:第2部分数据透视计算
  • 生产级编排AI工作流套件:Flyte全面使用指南 — Core concepts
  • 需求管理缺乏持续改进机制,如何建立
  • 计算机视觉----时域频域在图像中的意义、傅里叶变换在图像中的应用、卷积核的频域解释
  • 黑白浮生项目测试报告
  • 【入门】纸盒的最大体积是多少?
  • 佩斯科夫:俄方代表团15日将在伊斯坦布尔等候乌克兰代表团
  • 西安市未央区委书记刘国荣已任西咸新区党工委书记
  • 央媒评网红质疑胖东来玉石定价暴利:对碰瓷式维权不能姑息
  • 王毅谈中拉论坛第四届部长级会议重要共识
  • “水运江苏”“航运浙江”,江浙两省为何都在发力内河航运?
  • 这个“超强致癌细菌”,宝宝感染率高达40%,预防却很简单