c语言:编译和链接

翻译环境和运行环境

在ANSIC的任何⼀种实现中,存在两个不同的环境。

第1种是翻译环境,在这个环境中源代码被转换为可执行的机器指令。

第2种是执行环境,它用于实际执行代码。


编译过程

预处理(Preprocessing)

复制代码
 #### **文件包含(File Inclusion):**

 * **使用`#include`指令将其他文件的内容包含到当前文件中。**
 * **包含的文件可以是系统头文件(如`stdio.h`)或自定义头文件。**
 * **预处理器会将被包含文件的内容插入到`#include`指令所在的位置。**
复制代码
 #### **宏展开(Macro Expansion):**

 * **宏是一种用于替换文本的代码片段,可以通过`#define`指令定义。**
 * **预处理器会将源代码中出现的宏名称替换为宏定义中的内容。**
 * **宏展开可以简化代码、提高代码的可读性和维护性。**
复制代码
 #### **条件编译(Conditional Compilation):**

 * **使用条件编译指令(如`#ifdef`、`#ifndef`、`#if`、`#elif`、`#else`和`#endif`)根据条件选择性地编译代码。**
 * **条件编译可以根据宏的定义情况决定是否编译某些代码块。**
 * **这可以用于实现跨平台编译、调试代码和版本控制等。**
复制代码
 #### **注释删除(Comment Removal):**

 * **预处理器会删除源代码中的注释,包括单行注释(`//`)和多行注释(`/* ... */`)。**
 * **注释的目的是为了提高代码的可读性,但在编译过程中并不需要注释。**
复制代码
 #### **其他处理:**

 * **预处理器还可以执行其他一些操作,如去除行尾空格、处理特殊字符等。**
 * **例如,`#pragma`指令用于向编译器发出特定的指示。**

编译(Compilation):

复制代码
 #### **词法分析(Lexical Analysis):**

 * **词法分析器(Lexer)将源代码分解为一个个的词法单元(Token)。**
 * **词法单元是源代码中的最小语法单位,如关键字、标识符、运算符和常量等。**
 * **词法分析器根据预定义的词法规则来识别和分类词法单元。**
复制代码
 #### **语法分析(Syntax Analysis):**

 * **语法分析器(Parser)根据语法规则分析词法单元的组合,并构建抽象语法树(Abstract Syntax Tree,AST)。**
 * **抽象语法树是一种树状结构,表示源代码的语法结构和语义关系。**
 * **语法分析器检查代码是否符合语法规则,并生成语法树作为中间表示。**
复制代码
 #### **语义分析(Semantic Analysis):**

 * **语义分析器(Semantic Analyzer)对语法树进行语义检查,确保代码的语义正确性。**
 * **语义分析器会检查类型匹配、变量声明和使用、函数调用等语义相关的问题。**
 * **如果发现错误,会生成相应的错误信息。**
复制代码
 #### **代码生成(Code Generation):**

 * **代码生成器将语法树转换为汇编语言或机器语言。**
 * **生成的代码与目标机器的指令集和内存模型相关。**
 * **代码生成器会进行优化,以提高代码的执行效率和性能。**

汇编(Assembly):

  • 汇编器将汇编代码转换成机器代码。
  • 生成目标文件(通常是以.obj.o为扩展名的文件)。

链接过程:

目标文件生成:

  • 如果程序包含多个源文件,每个源文件都会被编译成一个目标文件。
  • 每个目标文件包含该文件的机器代码和一些附加信息。

库链接(Library Linking):

  • 如果程序使用了外部库,链接器会将程序与这些库连接在一起。
  • 静态链接时,整个库的机器代码被复制到可执行文件中。
  • 动态链接时,程序包含对库的引用,但实际的链接发生在运行时。

符号解析(Symbol Resolution):

  • 解决程序中使用的符号(变量和函数名)的地址。
  • 确保所有引用的符号都能在可执行文件中找到对应的地址。

重定位(Relocation):

  • 将程序中的相对地址转换为绝对地址。
  • 使得程序能够正确地在内存中运行。

可执行文件生成:

  • 最终生成可执行文件,该文件包含了所有必要的信息,可以在操作系统上运行。
相关推荐
背影疾风37 分钟前
C++之路:类基础、构造析构、拷贝构造函数
linux·开发语言·c++
Ting-yu41 分钟前
Java中Stream流的使用
java·开发语言·windows
【ql君】qlexcel1 小时前
Notepad++ 复制宏、编辑宏的方法
开发语言·javascript·notepad++··宏编辑·宏复制
Zevalin爱灰灰1 小时前
MATLAB GUI界面设计 第六章——常用库中的其它组件
开发语言·ui·matlab
冰糖猕猴桃1 小时前
【Python】进阶 - 数据结构与算法
开发语言·数据结构·python·算法·时间复杂度、空间复杂度·树、二叉树·堆、图
wt_cs2 小时前
银行回单ocr api集成解析-图像文字识别-文字识别技术
开发语言·python
_WndProc2 小时前
【Python】Flask网页
开发语言·python·flask
liujing102329293 小时前
Day04_刷题niuke20250703
java·开发语言·算法
能工智人小辰3 小时前
二刷 苍穹外卖day10(含bug修改)
java·开发语言
DKPT3 小时前
Java设计模式之结构型模式(外观模式)介绍与说明
java·开发语言·笔记·学习·设计模式