编译和链接【程序员的自我修养】

🚀Get to know🚀
🛸大家好,我是适才,希望你看完文章后能对你有所帮助。🛸
🌍文章有不足的地方还望指正❗❗❗🔍适才的个人主页🔍随时欢迎您的到来。⛳
🎁欢迎各位➡👍点赞➡💌留言➕关注💖
文章末尾分享一本书📕程序员的自我修养📕
📚学习是终身的事业📚

Ⅰ编译

对于平常的应用程序开发,我们都很少去关注编译和链接的过程,因为开发境都是流行的集成开发环境(IDE),比如VScode、Visual Studio、Delphid等。这样的IDE一般都将 编译和链接的过程完成。通常这种编译和链接合并到一起的过程叫构建(Build)

C语言的经典“hello world‘程序几乎是每个程序员闭着眼睛都能写出来的代码。

#include<stdio.h>
int main()
{
	printf("hello world");
	return 0;
}

将这样的代码转换为可执行的程序,经过四个步骤分别是预处理、编译、汇编和链接。

1.预处理

预处理先把源代码文件和相关的头文件转换为后缀.i的文件。对于C++ 程序来说,它的源代码文件的扩展名可能是.cpp或者是.cxx,头文件的扩展可能是.hpp,而经过预处理后的文件扩展名是.ii。

预处理过程主要处理那些源代码文件中的以"#“开始的预编译指令。比如”#include"、"#define"等处理规则如下
🔹将所有的“#define”删除,并且展开所有的定义。
🔹处理条件编译指令。比如“ if ” 、“ ifend ” 等。
🔹删除所有注释“//”和“/* */”。
🔹保留所有的#pragme编译器指令,因为编译器需要使用它们。
🔹处理“ #include ”预处理指令,将被包含的文件插入到该预编译指令的位置。注意,这个过程是递归进行的,也就是说被包含的文件可能还包含其他文件。
🔹添加行号和文件名标识,以便于编译时编译时编译器产生调试用的行号信息及用于编译编译时产生编译错误或警告时能够显示行号。

经过预编译后的.i文件不包含任何宏定义,因为所有的宏已经被展开,并且包含的文件也已经被插入到.i文件中。所以当我们无法判断宏定义是否正确或头文件包含是否正确时,可以查看预编译后的文件来确定问题。

2.编译

编译过程就是把预处理完的文件进行一系列词法分析、语法分析、语义分析及优化后生产相应汇编代码文件,这个过程是整个程序构建的核心部分,也是最为复杂的部分之一。

2.1.词法分析

首先源代码程序被输入到扫苗器,扫描器的任务很简单,它只是简单地进行词法分析,运用一种类似有限状态机的算法可以很轻松地将源代码的字符序列分割成一系列的记号。
词法分析产生的记号一般可以分为如下几类:关键字、标识符、字面量(包含数字、字符串等)和特殊符号(如加号、等号)。在识别记号的同时,扫苗器也会完成了其他工作。比如将标识符存放到符号表,将数字、字符串常量存放到文字表等,已备后面的步骤使用。

2.2.语法分析

语法分析器将对由扫描器产生的记号进行语法分析,从而产生语法树。整个分析过程采用上下文无关语法的分析手段。简单地讲,由语法分析器生成的语法树就是以表达式为节点的树。我们知道,C语言的一个语句是一个表达式,而复杂的语句是很多的表达式的组合。表达式依然要遵循符号计算的优先级。

2.3.语义分析

语义分析是由语法分析器来完成。语法分析仅仅是完成了对表达式的语法层面的分析。编译器所能分析的语义是静态语义,所谓静态语义是指在编译期可以确定的语义,与之对应的动态语义就是只有在运行期间的才能确定的语义。

2.4 汇编代码文件

汇编器是将汇编代码转转变成机器可执⾏的指令,每⼀个汇编语句⼏乎都对应⼀条机器指令。就是根据汇编指令和机器指令的对照表⼀⼀的进⾏翻译,也不做指令优化。
汇编命令如下:

gcc -c test.s -o test.o

Ⅲ 链接

链接是⼀个复杂的过程,链接的时候需要把⼀堆文件链接在⼀起才生成可执行程序。链接过程主要包括:地址和空间分配,符号决议和重定位等这些步骤。链接解决的是⼀个项⽬中多⽂件、多模块之间互相调⽤的问题。

我们在写代码时,一般会创建两个代码文件分别是.c和.h文件。其实每一个源文件会单独的链接形成一个对应的目标文件。
例如
test.c 经过编译器处理生成test.o

Ⅳ 运行环境

1)程序必须载⼊内存中。在有操作系统的环境中:⼀般这个由操作系统完成。在独⽴的环境中,程序
的载⼊必须由⼿⼯安排,也可能是通过可执⾏代码置⼊只读内存来完成。
2)程序的执⾏便开始。接着便调⽤main函数。
3.)开始执⾏程序代码。这个时候程序将使⽤⼀个运⾏时堆栈(stack),存储函数的局部变量和返回
地址。程序同时也可以使⽤静态(static)内存,存储于静态内存中的变量在程序的整个执⾏过程
⼀直保留他们的值。
4)终止程序。正常终止main函数;也有可能是意外终止。

链接:程序员的自我修养一书
提取码:1006
–来自百度网盘超级会员V1的分享

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值