akm建站系统,宁乡网站建设公司,wordpress转换成dede,做网站还是做阿里#x1f984;个人主页:小米里的大麦-CSDN博客 #x1f38f;所属专栏:C_小米里的大麦的博客-CSDN博客 #x1f381;代码托管:C: 探索C编程精髓#xff0c;打造高效代码仓库 (gitee.com) ⚙️操作环境:Visual Studio 2022 目录
一、前言
二、预处理#xff08;Preprocessi… 个人主页:小米里的大麦-CSDN博客 所属专栏:C_小米里的大麦的博客-CSDN博客 代码托管:C: 探索C编程精髓打造高效代码仓库 (gitee.com) ⚙️操作环境:Visual Studio 2022 目录
一、前言
二、预处理Preprocessing
三、编译Compilation
四、汇编Assembly
五、链接Linking
总结
各阶段输出总结
流程总结
共勉 一、前言 每个语言和环境都有其特定的构建和执行流程但大多数都会涉及某种形式的处理将源代码转换成机器可以直接理解的形式。在编译和构建一个 C/C 程序的过程中通常会经过 预处理、编译、汇编 和 链接 这四个阶段这个过程被称为构建流程或者编译流程。每个阶段都负责将代码从一个形式转换为下一个形式最终生成可执行文件。下面我会以一个简单的C/C程序详细讲解每个阶段的具体过程。 注意编译器的工作其实非常复杂远远不是博主我这轻描淡写的两句话就能描述清楚的想要深入了解还需不断钻研 二、预处理Preprocessing
预处理阶段是编译过程的第一个步骤主要负责对代码进行宏替换、头文件展开、条件编译等操作。这一阶段的任务是将代码进行格式化和标准化方便后续的编译步骤。 头文件展开#include 指令引入的头文件会被展开将头文件中的内容插入到文件中。宏替换预处理阶段会替换所有的宏定义例如 #define MAX 100在代码中使用 MAX 的地方都会被替换为 100。条件编译根据 #ifdef、#ifndef 等预处理指令编译器会有选择地包含或忽略某些代码。删除注释所有的代码注释// 和 /* ... */会在预处理阶段被移除代码中只会保留实际的指令。 输出经过预处理的源文件会生成一个新的文件通常扩展名为 .i这就是纯净的、展开后的源代码文件。
例如
#include stdio.h
#define PI 3.14
int main() {printf(%f\n, PI);//打印PI的值
}预处理后
int main() {printf(%f\n, 3.14);
}三、编译Compilation
编译器会将预处理后的源代码.i 文件转化为汇编代码。这一阶段会对代码的语法进行检查确保没有语法错误并且会生成与硬件无关的汇编语言代码。 语法分析编译器会检查代码的语法确保代码符合 C/C 语言规范。如果语法有问题编译器会抛出错误。语义分析编译器会检查变量类型、函数调用等确保它们的使用是正确的。生成汇编代码编译器会将源代码转换成一种与 CPU 架构无关的汇编代码。这个文件通常以 .s 作为后缀。 输出经过编译后的文件通常以 .s 为后缀它包含的是汇编代码。
例子生成的汇编代码部分大致是这样会有部分不准确
movl $0, %eax
call printf四、汇编Assembly
在汇编阶段汇编器会将汇编代码.s 文件转换成机器代码即二进制指令。这些二进制指令可以直接被计算机的处理器执行。 汇编器会将汇编语言翻译成机器指令这些指令以二进制格式存储在目标文件.o 或 .obj中。目标文件是不可执行的它只是包含了机器代码和一些符号信息如变量、函数名等供下一步的链接使用。 输出这个阶段的输出是一个目标文件通常以 .o 或 .obj 作为后缀里面包含了二进制机器代码。
五、链接Linking
链接是编译过程的最后一步负责将一个或多个目标文件.o 文件合并生成一个可执行文件。这个阶段包括以下几项工作 符号解析链接器会解析每个目标文件中的符号如函数和变量并将它们正确地关联在一起。比如如果一个目标文件调用了一个在另一个目标文件中定义的函数链接器会负责将它们连接起来。库链接链接器会将程序需要的库文件如标准库 libc与目标文件链接在一起确保程序能调用库函数。地址分配链接器会为每个符号函数、变量分配内存地址使得程序在执行时可以正确访问它们。 输出链接后的最终产物是一个可执行文件通常命名为 a.out在 Linux/Unix 系统中或 .exe 文件在 Windows 系统中。
例子链接后生成的可执行文件可以直接运行执行程序逻辑。 下面放几张图片使抽象的理解形象些 总结
各阶段输出总结
预处理Preprocessing生成预处理后的源代码文件通常扩展名为 .i。编译Compilation生成汇编代码文件通常扩展名为 .s。汇编Assembly生成目标文件通常扩展名为 .o 或 .obj。链接Linking生成可执行文件扩展名为 a.outLinux/Unix或 .exeWindows。 流程总结
预处理对代码做初步的处理如头文件展开、宏替换等。编译将预处理后的代码转化为汇编代码同时进行语法检查。汇编将汇编代码转换为机器代码生成目标文件。链接将目标文件与库文件链接生成可执行程序。
这个编译过程将源代码逐步转化为计算机可以执行的二进制机器代码是 C/C 编译过程的核心。
共勉