🚀write in front🚀
📜所属专栏:> c语言学习
🛰️博客主页:睿睿的博客主页
🛰️代码仓库:🎉VS2022_C语言仓库
🎡您的点赞、关注、收藏、评论,是对我最大的激励和支持!!!
关注我,关注我,关注我,你们将会看到更多的优质内容!!
文章目录
- 前言:
- 一.翻译环境:
- 1.翻译环境总括:
- ①.编译:
- 预编译(预处理):
- 编译:
- 汇编
- 符号表:
- ②.链接:
- 二.运行环境:
- 总结:
前言:
在研究程序的编译与链接细节之前,我们首先要了解我们程序的翻译以及执行环境。对于一个程序的运行,第一步是翻译,第二步是执行。
第1种是翻译环境,在这个环境中源代码被转换为可执行的机器指令。
第2种是执行环境,它用于实际执行代码。
一.翻译环境:
1.翻译环境总括:
在翻译环境中执行的操作,简单来说可以分为三个步骤:
- 组成一个程序的每个源文件通过编译过程分别转换成目标代码(.obj)。
- 每个目标文件由链接器捆绑在一起,形成一个单一而完整的可执行程序。
- 链接器同时也会引入链接库(标准C函数库)中任何被该程序所用到的函数,而且它可以搜索程序员个人的程序库,将其需要的函数也链接到程序中。
每次编译运行完成以后,我们都可以在所在文件里发现.exe
文件和.obj
文件
翻译阶段可分为两个阶段,即编译与链接:
①.编译:
预编译(预处理):
首先我们先一段普通的代码:
然后用gcc做以下操作:
- 预处理 选项 gcc -E test.c -o test.i
- 预处理完成之后就停下来,预处理之后产生的结果都放在test.i文件中
就会发现下面的情况:
预处理的作用:
头文件的包含、#define 定义符号的替换、注释的删除,文本操作。
编译:
用gcc选项 gcc -S test.c
编译完成之后就停下来,结果保存在test.s中,我们便会发现汇编代码
编译的作用:
编译阶段就是将 C 语言的代码翻译成汇编代码,其中包含了语法分析、词法分析、语义分析、符号汇总(后面会重点讲到)等。
汇编
用gcc选项gcc -c test.c
汇编完成之后就停下来,结果保存在test.o中,出现乱码(2进制码以文本形式无法看懂)
汇编的作用:
将汇编代码翻译成二进制的指令(存放到目标文件)符号汇总后:形成符号表
符号表:
一个类似于这样的表格:
在这里,我们的符号表里是该程序里所有的函数名和每个函数所在的的地址,(对于使用的其他文件的函数,只要该函数的申明存在,地址都先设为0x00,在后面链接阶段在修改该地址)
②.链接:
链接的作用是:
合并段表
合并符号表
重定位符号表
这里就是对所有文件的一个汇总,对于一个程序里,一个源文件使用了另一个源文件的函数,通过链接,就会将函数的地址汇总,并且改掉地址为0的函数。
二.运行环境:
在这个环境下,我们的程序就真正进入了运行阶段。我们程序的执行过程可以简述为下面四个步骤:
-
①. 程序载入内存中:在有操作系统的环境中该步骤通常由操作系统完成;而在独立环境中则必须由我们自己手动完成;独立环境中的程序也有可能通过执行可执行代码置入只读内存来完成。
-
②. 调用 main 函数:程序正式开始执行。
-
③. 顺序执行程序代码:在这个阶段中,我们的程序会使用一个运行时堆栈来存储函数的局部变量和返回地址。同时程序也可以使用静态内存来存储变量,并且这些存储于静态变量中的变量在整个程序的执行过程中将始终保留它们的值。
-
④. 终止程序:一般情况下会正常终止 main 函数,但我们的程序也有可能会意外终止。
总结:
这就是程序翻译与执行的相关知识。当然,这里对于宏的讲解是往往不够的!宏的相关知识将在下一篇文章中进行详细讲解!更新不易,辛苦各位小伙伴们动动小手,👍三连走一走💕💕 ~ ~ ~ 你们真的对我很重要!最后,本文仍有许多不足之处,欢迎各位认真读完文章的小伙伴们随时私信交流、批评指正!
专栏订阅:
每日一题
c语言学习
算法
智力题
更新不易,辛苦各位小伙伴们动动小手,👍三连走一走💕💕 ~ ~ ~ 你们真的对我很重要!最后,本文仍有许多不足之处,欢迎各位认真读完文章的小伙伴们随时私信交流、批评指正!