程序的运行过程:从代码到机器运行

Posted Love and Share

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了程序的运行过程:从代码到机器运行相关的知识,希望对你有一定的参考价值。

1)你知道程序是如何运行的吗?

1.1)Unix是怎么来的?

  • Ken Thompson 的妻子回娘家一个月,他在贝尔实验室无聊,就搞出了UNICS操作系统(unix的前身)。

  • 当时可没有c语言,大佬是用B语言和汇编语言写出来的。

1.2)那UNIX是怎么来的呢?

  • 牛人的朋友也是牛人,Thompson的朋友Dennis Ritchie也加入他的操作系统创造之旅,撸出了C语言。并且用C语言写了UNIX。同时也写出了影响深远的第一版“Hello World”。

     #include "stdio.h"
     int main(int argc, char const *argv[])
         printf("Hello World!\\n");
         return 0;
     

1.3)计算机硬件能直接运行这个C程序吗?

  • 不能,需要翻译官C语言编译器,把这段代码编译成具体硬件平台的二进制代码(机器码)。再由具体操作系统建立进程,把这个二进制文件装进其进程的内存空间中,才能运行。

1.4)程序编译过程是怎样的?

  • 使用命令:gcc HelloWorld.c -o HelloWorld 或者 gcc ./HelloWorld.c -o ./HelloWorld ,就可以编译这段代码。

1.5)GCC是什么玩意?

  • 一个指挥官,他会去调用预处理程序、编译程序、汇编程序、链接程序来完成具体工作。

     

     

1.6)GCC工作的整个过程是怎样的?

  • gcc HelloWorld.c -E -o HelloWorld.i 预处理:加入头文件,替换宏。

  • gcc HelloWorld.c -S -c -o HelloWorld.s 编译:包含预处理,将 C 程序转换成汇编程序。

  • gcc HelloWorld.c -c -o HelloWorld.o 汇编:包含预处理和编译,将汇编程序转换成可链接的二进制程序。

  • gcc HelloWorld.c -o HelloWorld 链接:包含以上所有操作,将可链接的二进制程序和其它别的库链接在一起,形成可执行的程序文件。

2)程序是怎样装载执行的?

  • 首先图灵老前辈提出了图灵机。

2.1)图灵机长什么样呢?

  • 一条无限长的纸带,上面有无数个小格子,小格子中写有相关的信息。纸带上有一个读头,根据纸带小格子里的信息做相关的操作并能来回移动。

     

     

2.2)1+1=2在图灵机上是怎样运算的?

  • 读头读到“+”之后,就依次移动读头两次并读取格子中的数据,最后读头计算把结果写入第二个数据的下一个格子里

     

     

     

     

     

     

3)图灵机是理想,不可能实现,那最终是谁让梦想成真呢?

  • 冯诺依曼

3.1)冯诺依曼的思想是什么?

  • 计算机用二进制数制系统和储存程序,并按照程序顺序执行。

3.2)根据冯诺依曼体系结构构成的计算机,必须具有哪些功能?

  • 程序和数据要能装进计算机中。

  • 记性要好,要能记住数据,中间结果,计算结果。

  • 能够做运算还有简单的数据加工

  • 控制程序的运行,并且我下达什么命令它能听的懂,并且叫其它部件干活。

  • 按照要求将处理的数据结果显示给用户。

3.3)为了完成上述的功能,计算机必须具备哪些基本组成部件?

  • 装数据和程序的输入设备;(键盘)

  • 记住程序和数据的存储器;(磁盘)

  • 完成数据加工处理的运算器;(CPU)

  • 控制程序执行的控制器;(CPU)

  • 显示处理结果的输出设备。(屏幕)

4)有了冯诺依曼的理论,我们怎么改造图灵机让它变得合理?

  • 把图灵机的几个部件换成电子设备

     

     

5)怎样将 HelloWorld 程序装入原型计算机?

 

 地址                  代码数据                                                     汇编代码           注释

 

 

以上是关于程序的运行过程:从代码到机器运行的主要内容,如果未能解决你的问题,请参考以下文章

C从源码到运行发生了哪些事

《C++ Primer Plus》学习笔记——C++程序创建到运行的整个过程

jvm原理和代码运行的过程

JVM

程序的静态链接

从DevC ++转向命令行编译