编程语言
首页 > 编程语言> > 计算机系统->Hello World的一生 | 程序如何运行

计算机系统->Hello World的一生 | 程序如何运行

作者:互联网

2021年11月27日准备发在基地微信公众号上的推文。

综合了多篇大佬的博客,以及自己已经知道的知识,对一些疑惑进行了现阶段我认为还算满意的解答。

不过又产生了很多疑问:

  1. 内存和磁盘的关系
  2. CPU是如何运行机器指令的(虽然大概想过去会是数字逻辑上的电路的组合)
  3. ......

========================================================================================================================================

我写的上一篇推文是:Vscode里的多文件编译,本来这一篇计划是多语言混编,可是还没玩太明白,就来补充讲一讲程序的运行过程,对上一篇也是一种补充。

当我们要让一个程序运行起来,如下面这段代码:

1 #include <stdio.h>
2 int main()
3 {
4     printf("Hello World\n");
5     return 0;
6 }

需要以下过程:

1. 预处理

 gcc -E hello.c -o hello.i 

这一过程主要是处理源代码文件中:

2. 编译

 gcc -S hello.i -o hello.s 

编译程序(Compiler)把预处理完的文件进行一系列词法分析、语法分析、语义分析及优化后生产相应的汇编代码文件。

当然,预处理和编译可以合二为一,直接一步到位:

 1 gcc -S hello.c -o hello.s 

这里提一下这个gcc,这只是后台编译程序(compiler)的控制台,会根据不同参数去调用不同的预处理、编译程序,来处理不同的语言。

3. 汇编

 1 gcc -c hello.c -o hello.o 

.o文件就是“目标文件”(Object File),将汇编语句转换为机器语言,机器语言是CPU可以执行的命令。

4. 链接

在上面的过程中,原本的一个文件会生成若干个目标模块,这些模块是割裂的。

由链接程序(Linker)将这些目标模块(程序段),以及它们所需要的库函数链接在一起,形成一个完整的装入模块(Load Module);这是完整的执行命令的可执行文件exe(此时已经是二进制文件)。

链接分为静态链接和动态链接。不展开了。

DLL文件就是Dynamic Link Library文件.

5. 装入

可执行文件只有装载到内存以后才能被CPU执行。

装入过程就是由装入程序(Loader)将装入模块装入物理内存。物理内存就是真实存在的内存条。

物理内存是由若干个存储单元组成的,每个存储单元有一个编号,这种编号可唯一标识一个存储单元,称为内存地址(或物理地址)。

可以简单理解成类数组的一个结构。

这个过程进行了地址重定位,主要是将逻辑地址转换成物理内存的绝对地址(相当于拿考号找座位)。这个过程只有在程序将要被运行的时候才会发生。

图片

6. 执行

执行不是一个严格的概念,只是我用来描述装入到输出“Hello World”这个过程的一个名词。

当计算机要运行该程序时,二进制文件中相关的指令会发送给CPU,经过CPU的操作,显示到了显示器上。

7. GCC

补充GCC的工具链

img

8 复习

  1. 程序从按下“编译”到装入内存需要哪些过程?
  2. GCC工具链有哪些?

 

标签:文件,计算机系统,装入,CPU,Hello,编译,内存,World,hello
来源: https://www.cnblogs.com/Roboduster/p/15612880.html