一、程序编译运行涉及各部件
1、编译过程分析
对于一个计算机程序文件,在被编写出来后要还要经过一系列的操作才可以被执行实现程序员想要实现的功能。
首先需要进行的就是进行编译,将其转换成二进制文件。
在上图中C源程序首先要经过预处理器的处理,该过程主要时将类似#<stdio.h>
这样的头文件内容加载进来最终产生C.i中间文件;
C.i程序文件经过编译器处理被翻译成汇编源文件,其中将C语言全部翻译成汇编代码生成C.s汇编文件(汇编代码和二进制机器指令是一一对应的);
汇编文件经过汇编器处理被翻译成二进制程序文件,生成C.o文件;
由于在c程序中会调用C标准库中的一些函数例如prinf()
,所以需要使用链接器将这些被调用的函数从标准库中链接到二进制程序中最终形成而可执行文件C.
2、执行各个部件的介绍
将C源程序编译成可执行文件后被存储于磁盘中,然后在计算机接到执行指令后开始执行。该执行过程需要计算机内部各部件共同分工协作完成,接下来将对这些部件进行初步介绍。
- CPU(处理器)
CPU是执行程序指令的地方,其中主要分三大主要部件PC(程序计数器)、寄存器、ALU算术逻辑部件;
PC(程序计数器):相当于一个指针,它总是指向下一条即将执行的程序指令;
寄存器:是CPU内临时存储数据的地方,存储空间较小,CUP在提起到一条指令后若需要用到数据,则会提前从主存中将数据提取出来存储在寄存器中以待使用;
ALU算术逻辑部件:顾名思义该部件就是进行计算的地方。 - 主存
主要作用也是用于存储计算机程序以及CPU执行指令时所需要的数据,其空间比寄存器要大,是唯一可以与CPU进行数据交互的部件。 - I/O
I/O即输入输出设备以及计算机内部各部件之间的数据交互通道也被称为总线,其被设计用于传送指定字长块(同时传送的字节数),不同的系统其总线宽度也不一样,一般是4个字节。 - 磁盘
磁盘是计算机中存储空间最大的部件,但是也导致其放速度也是计算机内部最慢的部件。
二、程序在计算机内运行过程
在上节中C源程序已经被编译成了二进制可执行文件,该文件被存储于计算机磁盘中,但CPU接到执行命令时就会被提取出来执行;在这里我们以Linux系统为例(Windows系统上执行过程差不多)。
首先是在Linux界面输入执行命令:
./可执行文件名
如./hello
此时计算机内部CPU将输入传入主存中
当在键盘上输入回车时,CPU就知道输入完成开始执行一系列的操作将磁盘中的可执行文件以及需要的数据转移至主存:
接下CPU将二进制程序指令接受,以及将数据传入寄存器中然后根据指令进行输出或者传入ALU进行计算后在输出;
三、在Linux上编译执行文件
编写C源程序:
vim dome.c
编译文件:
gcc -o dome dome.c
该dome
文件为编译的可执行文件。
执行该文件
./dome
四、其他涉及
- 高速缓存
由于计算机中各个部件之间的存储空间存在很大的差异进而导致数据的读取也写入速度也存在着很大的差异,CPU存储空间小故而其读写速度非常快,但是在跟主存进行数据交互时由于存储空间存在差异进而导致其读写速度变慢;由此诞生了高速缓存——设置一个存储空间将事先需要进行操作的指令数据导入其中。 - 进程
在计算机中不是只存在一个程序运行,但是在计算机多个应用程序运行中都像是独立运行的。这其中就运用到了进程的概念,在计算机系统中当一个应用该程序需要优先运行时,计算机会记录下当前运行应用程序的状态然后停止让优先的应用程序运行,等起运行完后在以记录的状态运行停止的应用程序;而这就被称之为一个进程(在进程中还存在线程)。 - 网络通信
网络通信时计算机通过网络适配器与外界计算机进行数据交互,
在该栏目后期我会展示如何构造网络应用程序,并利用这些只是创建一个简单的Web服务器。
希望笔者的总结能给大家带来一些帮助,由于笔者水平有限还望大神对本人的错误加以指出。对于大家的问题也可以在文末留言,大家可以一起交流学习。