1. 翻译环境和运⾏环境
2. 翻译环境:预编译+编译+汇编+链接
3.运行环境:装入
1. 翻译环境和运⾏环境

2. 翻译环境
.c文件需要通过编译和链接步骤生成最终的可执行文件。2.1 预处理(预编译)
1.宏替换
预处理器会将所有宏定义展开。例如#define MAX 100,代码中所有MAX都会被替换为100。带参数的宏也会被展开。
2.文件包含
#include指令会将指定文件的内容插入到当前文件中。系统头文件如<stdio.h>和用户头文件如"myheader.h"都通过该指令引入。
3.条件编译
通过#ifdef、#ifndef、#if等指令控制哪些代码参与编译。
4.其他处理
预处理器还处理#pragma指令、删除注释、添加行号标记(⽅便后续编译器⽣成调试信息)等操作。这些处理结果会生成一个中间文件供编译器使用。
经过预处理后的.i⽂件中不再包含宏定义,因为宏已经被展开。并且包含的头⽂件都被插⼊到.i⽂件 中。所以当我们⽆法知道宏定义或者头⽂件是否包含正确的时候,可以查看预处理后的.i⽂件来确认。
2.2 编译
词法分析(Lexical Analysis)
词法分析器(Lexer)将源代码分解为一系列标记(Tokens)。这些标记包括关键字、标识符、运算符、常量等。
语法分析(Syntax Analysis)
语法分析器(Parser)根据语言的语法规则将标记组织成抽象语法树(AST)。
语义分析(Semantic Analysis)
编译器检查AST的语义正确性,如类型匹配、变量声明等。
例如:array[index] = (index+4)*(2+6);
词法分析:

语法分析:

语义分析

2.3汇编
汇编阶段是将编译器生成的汇编代码转换为机器可执行的二进制目标文件(通常是.o或.obj文件)。这一过程由汇编器(如as)完成,是编译流程中的关键步骤。
汇编器的主要功能
1.符号解析:处理标签(如函数名、全局变量)并记录其地址。
2.指令转换:将汇编指令(如movl、ret)转换为机器码。
3.节区处理:组织代码和数据到目标文件的特定节区(如.text、.data)。
2.4链接
链接程序的功能是将源程序经过编译后得到的一组目标模块(目标文件)以及他们所需要的库函数,装配成一个完整的装入模块。
链接可以三种:静态链接,装入时动态链接,运行时动态链接
静态链接:在程序循行之前,先将个目标模块以及它们所需的库函数链接成一个完整的装配模块,以后不再拆分。把这种事先进行链接而以后不在拆分的方式,称为静态链接。
装入时动态链接:将用户源程序编译后所得的一组目标模块,再装入内存时,采用边装入边链接的链接方式
运行时动态链接:将对某些模块的链接推迟到程序执行时才进行。
根据B站的博主可以这样理解:比如一些小朋友需要排队去参加运动会,静态链接就是它们在班级前就排队然后在去操场。装入时动态链接,就是小朋友到操场门口在排队。运行时动态链接就是它们某个班级需要上场表演了那是在排队。
例子可能不太恰当,请自行斟酌。



6553

被折叠的 条评论
为什么被折叠?



