“老衲”又有不懂的了,问了一个值得思考的问题:
#include <stdio.h>
int main(int argc, const char* argv[])
{
printf("hello,world");
return 0;
}
“老衲”说:我上c语言的时候,老师就直接把这个写出来了,也没告诉我这为啥这么写呀!
不着急,来听我慢慢絮叨!
上面这段是什么?是程序吗?其实并不是,上面这段是代码。
那么程序又是什么呢?
程序是什么?
程序是指示计算机每一步动作的指令,也是一个可执行文件
是不是有点纳闷,其实啊,这个程序譬如全运会、音乐会的程序等,指的是“行事的先后次序”,计算机的程序也是一样的道理!
那么,程序是由什么组成的呢?
程序是指令和数据的组合体
数据是什么?
这块我们简单介绍一下:指令是printf,“hello ,world”是数据。如果想深入了解,可以点击超链接进入另一篇博客:数据是什么?
讲到这里,“老衲”说:我明白了,那么那么我写的这段代码,是如何让计算机变成程序,并让他运行的呢?
有意思了,开始举一反三发问了。别急,这块我会分成两部分来介绍:
- 计算机是如何让代码变成程序
- 它如何运行程序的
计算机如何让代码变成程序?
咳咳!开唠!
通过这张图,我们就能看出计算机运行程序的大概过程了。虽然图中只简单写出了一步,但实际上,让代码成为程序(计算机可以处理的机器语言)需要4个步骤。
上面“老衲”已经完成了最初的一步:使用高级语言编写出代码。而接下来的步骤就交给我们的计算机:
预处理
预处理又分为以下步骤:
- 宏替换(把#define的内容替换掉)
- 删除注释
- 展开头文件(把#include的头文件包含进来)
对这部分详细内容感兴趣的话可以看看《程序员的自我修养》这本书。
让我们来看看预处理后的文件长什么样子:
gcc hello.c -E hello.i # 在linux系统下查看预处理过的代码文件
不明白gcc是什么?点击传送门→此处应有超链接
这是“老衲”所写的原程序:
//我是老衲的第一个程序
#include <stdio.h>
#define LAONA 521
int main()
{
int a = LAONA;
printf("hello, %d", a);
return 0;
}
这是经过计算机预处理的代码(部分):
经过预处理,LAONA这个宏定义被替换了,还把stdio.h这个头文件包含了进来,代码增加了700多行,然后还把注释删掉了。
是不是很奇妙?
编译
这一步是把上面这个预处理的文件,通过语法分析,语义分析等生成汇编语言!
mov enx,dword ptr [edp-8]
诸如这样的代码就是汇编语言,这块大致了解即可。
汇编
这一步是指,把编译得到的汇编语言翻译成0101010101的机器语言,这样计算机才能按照咱们写的代码逻辑去跑!
链接
我给“老衲”准备了一个故事:
很久很久以前,在一个非常遥远的赛博坦星系......人们编写程序时,将所有的源代码都放入一个文件,发展到后来一个程序源代码的文件长达数百万行,以至于已经没有 人具备维护这个程序的能力。人们开始寻找新的办法,就这样一场革命,即将爆发..........
实际上,早在
关于链接,简单来说就是把很多个源文件头文件都连在一起,组成一个可执行的文件。但这块涉及到的静态链接和动态链接比较复杂,以后会更新一篇博客来仔细讲讲。传送门→此处应有超链接
老衲发话了:我懂了,把代码变成程序就是,通过预处理把咱写的代码先格式化一下变成机器能翻译的高级语言,然后通过编译,让计算机去分析咱写的程序,就类似于咱们写了让他打印一句话,他翻译成汇编指令,然后在通过汇编翻译成机器语言,这样他就能跑了!
老衲就是聪明,看懂了。
程序如何在计算机上运行?
现在,“老衲”编写的代码经过了预处理、编译、汇编、链接,成为了程序(可执行文件),接下来我们需要让计算机用大脑来运行它。那么什么是计算机的大脑呢?
老衲说:CPU?
真聪明。
CPU是中央处理器的缩写,相当于计算机的大脑,他的内部由数百万至数亿个晶体管构成。
如果仅限于理解到这里,就没必要提及这个cpu了,且听我细细道来。
CPU负责解释和运行最终转换成机器语言的程序内容。
CPU的组成
- 寄存器:用来暂存指令、数据等处理对象
- 控制器:负责把内存上的指令、数据读入寄存器
- 运算器:负责运算从内存中读入寄存器的数据
- 时钟:负责发出CPU开始计时的时钟信号(linux信号相关)
总之,在这里我们先简单搞清了如果CPU要处理我们编写的代码,就要通过控制器读取内存上的程序放到cpu里面去运算,然后在返回处理后的结果。
而程序运行的底层原理又是如何解释呢?编译链接完毕的程序,如何把它从硬盘上装载到内存中,而代码在内存中又是如何分布的呢?这里后续我会编写几篇博客,讨论操作系统内存分布以及虚拟内存、cpu是如何读取内存上的程序的。传送门→此处应有超链接
结束语
“老衲”,你理解了吗?