C语言:编译与链接

本篇博客给大家带来的是代码从运行到生成可执行文件的流程和原理

🐟🐟文章专栏:C语言

🚀🚀若有问题评论区下讨论,我会及时回答

❤❤欢迎大家点赞、收藏、分享

你们的支持就是我创造的动力

今日思想:不能因为遇到了坏的事情,就总是悲观看人!!


Ⅰ、翻译环境和运行环境

在ANSIC的任何一种实现中,有两种不同的环境,他们有各自的作用

翻译环境:把源代码转换成可执行的二进制指令

运行环境:用于实际执行代码

Ⅱ、翻译环境=预编译+编译+汇编+链接

1、翻译环境

笼统的讲翻译环境是由编译和链接组成,但是编译又分成预处理(预编译)、编译、汇编三个过程。
编译: 通过cl.exe编译器把.c文件转换成.obj文件

注意:在Windows环境下生成的是.obj文件,在Linux环境下生成.o文件

链接:把多个obj文件加上链接库经过链接器(link.exe)生成可执行文件

链接库是指运行时库(它是支持程序运行的基本函数集合)或者第三方库。

2、预处理

预处理阶段:处理#开头的源文件

具体如下:

1.将所有的 #define 删除,并展开所有的宏定义。

2.处理所有的条件编译指令,如: #if、#ifdef、#elif、#else、#endif 。

3.处理#include 预编译指令,将包含的头文件的内容插入到该预编译指令的位置。这个过程是递归进行的,也就是说被包含的头文件也可能包含其他文件。

4. 删除所有的注释

5.添加行号和文件名标识,方便后续编译器生成调试信息等。

6.保留所有的 #pragma 的编译器指令,编译器后续会使用。

3、编译

编译:将预处理生成的文件 进行一系列的词法分析、语法分析、语义分析及优化,然后生成相应的汇编文件

假设有下面的代码:

cpp 复制代码
array[index] = (index+4)*(2+6);

3、1词法分析

语义分析:将源代码程序被输入扫描器,扫描器的任务就是简单的进行词法分析,把代码中的字符分割成⼀系列的记号(关键字、标识符、字⾯量、特殊字符等)。

将上面的代码进行词法分析可得16个记号:

3、2语法分析

语法分析:通过语法分析器将对扫描产生的记号进行语法分析,从而产⽣语法树。这些语法树是以表达式为节点的树。

语法树:

3、3语义分析

语义分析:由语义分析器来完成语义分析,即对表达式的语法层面分析。编译器所能做的分析是语义的静态分析。静态语义分析通常包括声明和类型的匹配,类型的转换等。这个阶段会报告错误的语法信息。

4、 汇编

汇编:通过汇编器将汇编代码转变成机器可执⾏的指令(2进制的指令),每⼀个汇编语句几乎都对应⼀条机器指令。就是根据汇编指令和机器指令的对照表⼀的进行翻译,也不做指令优化**。**

5、链接

链接:把多个文件链接在一起生成可执行文件

过程:地址和空间分配、符号决议和重定位等步骤

目的:解决一个项目中多文件、多模块之间互相调用的问题

代码实例:

test.c文件代码

cpp 复制代码
#include<stdio.h>
extern int Add(int, int);
extern int g_val;
int main()
{
	int a = 10;
	int b = 20;
	int sum = Add(a, b);
	printf("%d\n", sum);
	return 0;
}

add.c文件代码

cpp 复制代码
int g_val = 2024;
int Add(int x,int y)
{
	return x + y;
}

在链接阶段他们会合并各自的符号表:

合并为:

tste.c文件运行时会通过这个符号表来查找外部变量

Ⅲ、运行环境

1. 程序必须载入内存中。在有操作系统的环境中:⼀般这个由操作系统完成。在独立的环境中,程序 的载入必须由手工安排,也可能是通过可执行代码置入只读内存来完成。

2. 程序的执行便开始。接着便调用main函数。

3. 开始执行程序代码。这个时候程序将使⽤⼀个运行时堆栈(stack),存储函数的局部变量和返回 地址。程序同时也可以使用静态(static)内存,存储于静态内存中的变量在程序的整个执行过程 ⼀直保留他们的值。

4. 终止程序。正常终止main函数;也有可能是意外终止。

完!!

相关推荐
feifeigo12325 分钟前
matlab电力系统重构实现
开发语言·matlab·重构
小c君tt30 分钟前
QT笔记记录
开发语言·笔记·qt
布朗克16833 分钟前
Go 入门到精通-08-复合类型之数组与切片
开发语言·后端·golang·数组与切片
AI人工智能+电脑小能手1 小时前
【大白话说Java面试题 第151题】【06_Spring篇】第11题:说一下 Spring Bean 的生命周期?
java·开发语言·后端·spring·面试
广州浮点FLOATLIC1 小时前
Creo 许可证利用率怎么优化:制造企业该先看共享规则,还是先看模块占用结构
java·开发语言
wuyk5551 小时前
21. 嵌入式面试避坑指南:sizeof 是关键字,不是函数!
c语言·开发语言·stm32·单片机·嵌入式硬件
2601_962440841 小时前
计算机毕业设计之jsp教室管理系统
java·开发语言·笔记·分布式·算法·课程设计·推荐算法
十月的皮皮4 小时前
C语言学习笔记20260703-牛牛与后缀表达式(逆波兰表达式)
c语言·笔记·学习
apocelipes2 天前
常用编程语言和库的正则表达式性能对比
c语言·c++·python·性能优化·golang·开发工具和环境
LDR00617 天前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言