0
点赞
收藏
分享

微信扫一扫

程序是如何在计算机中运行的?

MaxWen 2022-01-11 阅读 76

程序是如何在计算机中运行的?

可能很多朋友都写过print函数,可是否有想过为什么print能够将文字输出到屏幕上?它在变成屏幕上的文字前到底经历了什么?是道德的沦丧还是人性的缺失?本例将以c语言和window环境为例为大家讲解其过程。

print的心路历程

大家好,我是print,就在刚刚我又一次被打在了编辑器上。这是我第999999999999次被人输入到编辑器上,可为什么我没有评上劳模?
是因为你们觉得我将负责将数据打印出来是件很简单的事情对吧!今天我要为自己正名,请大家欣赏本人的工作vlog!

程序编译

print被编写后并不能被计算机所执行,必须通过编译器处理成机器语言后才能被执行,任何语言都会编译成机器语言,一般称编译后的文件为目标文件
大家可能觉得编译器仅与语言相关,其实不同cpu所执行的机器语言也不同,成功编译程序需要对应的CPU类型+对应的语言+对应的系统环境

程序链接

编译完成后的程序,虽然能被计算机所识别,但它并不完整,因为仅依靠print自己是无法将文字输送到屏幕的,还需要操作系统的辅助即利用系统集成API辅助进行,通常这些集成API储存在DDL(动态链接库)
通过调用系统控制屏幕的API目标文件和已经编译好的目标文件进行
链接
变成完整程序。而运行链接文件的exe则被成为链接器
我们应该意识到一点,我们认为是通过简单的print实现了输出到屏幕的功能,实际上只是因为操作系统给了我们极大的便利。如今的程序因为操作系统的缘故早已与硬件脱节,即便是对硬件毫无认知也能轻轻松松的用代码实现屏幕显示出所想要的内容。这也是我们绝大部分人入门编写的第一个程序,但要记住它的实现是因为操作系统控制了屏幕,而不是因为你的序。** 我希望大家能够明白操作系统为什么能给我们带来方便,而不是只会享受这份方便。**
虽说此时的程序已经是可被计算机运行的文件,但其运行细节可不止是输出文字。

内存中的程序

print程序运行后会被复制到内存,此时内存会开辟四个区间用来存储程序:

  • 用于存储函数的空间
  • 用于存储变量的空间

  • 用于存储程序运行时任意变量的内存

  • 用于存储程序运行时的局部变量

CPU 启动!

总所周知,CPU由寄存器,控制器,运算器和时钟组成。寄存器可以存放数据,对象等处理对象,寄存器有很多类型,一个CPU大概有上百个寄存器。控制器则是负责将内存中的指令和数据存入寄存器中并进行各种操作。运算器顾名思义就是负责将寄存器中的数据进行运算。时钟是用来发出CPU计时的信号,CPU的频率是决定其性能的重要因素。
我们只需要深入了解一下寄存器即可。寄存器分为两大类,用于“存放地址”和“用于存放运算数值”的,寄存器既可以存放数据又可以存放地址。一般有如下几类:

种类功能
EAX累加(Accumulator)寄存器
EBX基址(Base)寄存器
ECX计数器(Counter)寄存器
EDX数据(Data)寄存器
ESI来源索引(Source Index)寄存器
EDI目的索引(Destination Index)寄存器
ESP堆栈指针(Stack Point)寄存器
EBP基址指针(Base Point)寄存器

当我们程序加载到内存后,控制器会根据时钟信号将内存中的指令和数据存入寄存器中,并分配地址
分配完地址后会根据程序计数器(ECX)依次执行命令,程序计数器在每执行完一次指令后地址就会+1(比如执行完地址100的指令后就会变成101),具体过程如下:

地址指令类型内容
100指令将地址103的输出内容存入通用寄存器中
101指令将通用寄存器的内容输出到显示器
102指令结束程序
103数据劳模

结语

print兄的工作vlog播报完毕,确实挺累的,希望大家给它补一个劳模称号。
哦对了,我是print的第100000000000次调用者。

举报

相关推荐

0 条评论