程序运行只是单单的编译吗?一文让你深入理解程序运行的过程
创始人
2024-02-07 07:46:42
0

 前言:

      写了这么长时间的c语言代码,我们都没有想过为什么要写头文件吗,而程序执行的过程又是如何呢?只有编译吗 ?要知道机器只能读懂二进制但我们所写的代码编译器是如何读懂的呢?这一篇文章看后一定能解决以上问题同时能够让你深入的理解程序执行的过程。^ _ ^

 💞 💞    欢迎来到小马学习代码博客!!!!

目录

一、程序执行的过程:

1.1前提准备:

1.2 程序执行过程图:

二、编译器的几个阶段:

2.1编译器阶段的过程图:

2.2通过一个代码分析:

2.3预处理阶段:

2.4编译阶段:

2.5汇编过程:

2.6程序的链接:

总结:


 

一、程序执行的过程:

1.1前提准备:

    为了更好的演示过程这里我没有用Xcode同时也用不了VS2019,因为这样的编译器无法观察编译的具体过程,这里我用的是gcc编译器能够更好的演示在程序运行过程中的每一个过程!!!

1.2 程序执行过程图:

1.2.1    在一个项目中会有不同的.c 文件的形成就好比我上一次写的一个通讯录程序就是有两个.c文件一个.h文件来完成的一个通讯录而.c文件就是程序的源文件他在编译的操作下变成了目标文件,而又通过链接器把我们的目标文件和链接库合并成一个可执行的程序。而编译器是如何将源文件变成目标文件呢?如下图 ☟☟☟☟☟

二、编译器的几个阶段:

2.1编译器阶段的过程图:

 2.1.1在程序执行过程中我们从上面图可以知道编译本身也是分为几个阶段来进行的:预编译阶段,编译阶段,汇编阶段。而每个阶段都有自己相应的功能接下来我来通过gcc来演示不同阶段的功能实现!!!

2.2通过一个代码分析:

#include "text.hpp"
#define M 100
#include 
int g_val=2022;
int add(int x,int y)
{return x+y;
}
//这是一个注释为了方便观察预处理
int main()
{int m =M;int arr[]={1,2,3,4,5,6,7,8,9,10};int i=0;for(i=0;i<10;i++){printf("%d ",arr[i]);}printf("\n");printf("%d ",g_val);return 0;
}

2.3预处理阶段:

2.3.1这是在gcc 编译器下我来演示的 gcc test.c -E -o test.i 这个命令是使test.c文件只执行到预处理阶段而就结束了,我们发现就出现一个test.i文件

 我们通过vim编译器进去观察一下 

对比没有预处理前的代码:

    对比发现在预处理阶段前面多了800多行代码(这里不好展示小马就省略展示了^ _ ^)他就是头文件的展开,同时发想define定义符号的替换删除定义符号(m定义为M发现在预处理阶段变成100了),同时我们的注释在预处理阶段也没有了。

这里我么可以总结一下

在预处理阶段完成了:《头文件的展开》《define定义符号的替换删除定义的符号》《注释删除》。

2.4编译阶段:

2.4.1gcc test.i -S这个指令是将test.i文件完成编译阶段就停止,同时生成一个test.s文件

进行保存翻译过程的信息。

我们在此通过vim编译器进行观察👀 

 我们发现我们写的代码已经被翻译成了汇编语言(这里我也只是为了方便只是展示了一部分^ _ ^)这里编译器经过了:语法分析、词法分析、语义分析、和符号汇总四个过程将我们的代码编程汇编语言,这个过程并不是简单的。而符号汇总是把全局变量的符号进行汇总起来,为了下面的过程提供帮助。

2.5汇编过程:

2.5.1 gcc test.s -c这个命令将test.s 文件进行汇编同时生成一个test.o文件,就是把test.s汇编文件转化为机器能够读懂的二进制文件!!

我们通过vim编译器进行观察test.o文件 :

 这里我们已经变成我们看不懂的二进制语言了(小马也看不懂二进制哈哈哈👀)这里编译器将我们的汇编语言变成机器能读懂的二进制语言,同时生成符号表(就是给我们的函数和全局变量生成地址方便链接的时候进行查找)

编译器通过这三个过程把我们的test.c文件变成了机器能读懂的test.o文件,最后通过链接器变成一个可执行的程序。

2.6程序的链接:

 2.6.1gcc test.o命令就是将test.o文件中的符号表进行链接起来,最后生成一个可执行的a.out文件!!!

我们编译一下a.out文件 

 链接的作用:合成段表同时将符号表进行合成和重定位 最后形成了我们形成一个可以执行的程序。

总结:

         通过我们的一步步演示,在看我们前言所提问的问题就能过很容的进行解决啦,一个程序的执行,并不是一个简单的编程这么简单,他是通过预处理,编译,汇编最后链接这几个步骤才形成一个可执行的程序,而四个步骤每一个步骤都是至关重要的也是缺一不少了,我们通过简单的了解他的执行过程能过让我们深入的理解程序的执行过程,对以后的问题就能够有更深的理解啦^ _ ^

        最后小马码文不易,如果觉得有帮助就多多支持哈!!!^ _ ^

相关内容

热门资讯

自由的英文名言 关于自由的英文名言  自由是一个政治哲学概念,在此条件下人类可以自我支配,凭借自由意志而行动,并为自...
礼貌的名人名言 有关礼貌的名人名言  在学习、工作乃至生活中,大家都知道一些经典的名言吧,巧用名言有助于我们正确对待...
赞美老师的名言 赞美老师的名言(精选50句)  名言是一个汉语词汇,基本意思是很出名的说法,著名的话,一般指名人说的...
经典名言录 经典名言录  名言录  1、一寸光阴一寸金,寸金难买寸光阴。——中国谚语  2、浪费别人的时间是谋财...
感恩教师节名言警句 感恩教师节名言警句  在平时的学习、工作或生活中,大家都对那些经典的名言警句很是熟悉吧,在议论文中,...
历史的名言 关于历史的名言大全  1、历史本身是自然史的一个现实的部分,是自然生成为人这一过程的一个现实的部分。...
交通安全名言警句大全   车在轨上行是幸福路,人在轨上走是危险路。如下是中国人才网给大家整理的交通安全名言警句大全,希望对...
朱熹的名言名句 朱熹的名言名句集锦  1、涵养、致和、力行三者,便是以涵养为首,致和次之,力行又次之。  2、心,生...
教师人生格言 教师人生格言大全  创新是人类进步的不竭动力!  当代能做老师的人必定是不平凡的人;因为教育事业本身...
歌颂母爱的名言摘抄 有关歌颂母爱的名言摘抄  在平平淡淡的日常中,大家总免不了要接触或使用名言吧,下面是小编为大家整理的...
毕达哥拉斯名言   毕达哥拉斯名言  1、友谊是一种和谐的平等。  2、要这样生活;使你的朋友不致成为仇人,使你的仇...
伤感的名言 伤感的名言  1.用一转身离开,用一辈子去忘记。  2.明知道天要下雨就该带把伞,明知道不会有结果就...
犯罪心理第七季的励志名言 犯罪心理第七季的励志名言  1.遗伤难愈——伊莉莎白一世  2.若为奇迹,一切证据皆可为之,若为事实...
我的人生格言 我的人生格言我的人生格言如果你的心灵很敞亮,很仁厚,你有一种坦率和勇敢,那么你有可能收获到许多意想不...
蒙田名言   蒙田名言  1、生命的价值不在于时间的长短,而在于你如何利用它。  2、作为一个父亲,最大的乐趣...
中国古代爱情的名言名句 中国古代关于爱情的名言名句(精选115句)  无论是身处学校还是步入社会,许多人都接触或是使用过一些...
人生励志名言 100句人生励志名言精选  1、没有行动的承诺,不过是一席空话。  2、坚持最初的梦想,年轻没有失败...
李嘉诚名言 李嘉诚名言(通用40句)  扩张中不忘谨慎,谨慎中不忘扩张……我讲求的是在稳健与扩张中取得平衡。船要...
目标与理想的名言警句 目标与理想的名言警句  平凡朴实的梦想,我们用那唯一的坚持信念去支撑那梦想,目标与理想的名言警句。以...
张爱玲名人名言 张爱玲名人名言汇总80句精选  人生最可爱就在那一撒手。下面这篇文章是小编收集整理的张爱玲名人名言,...