程序是什么?

“老衲”又有不懂的了,问了一个值得思考的问题:

#include <stdio.h>

int main(int argc, const char* argv[])
{
     printf("hello,world");
     return 0;
}

“老衲”说:我上c语言的时候,老师就直接把这个写出来了,也没告诉我这为啥这么写呀!

不着急,来听我慢慢絮叨!

上面这段是什么?是程序吗?其实并不是,上面这段是代码

那么程序又是什么呢?

程序是什么?

程序是指示计算机每一步动作的指令,也是一个可执行文件

是不是有点纳闷,其实啊,这个程序譬如全运会、音乐会的程序等,指的是“行事的先后次序”,计算机的程序也是一样的道理!

那么,程序是由什么组成的呢?

程序是指令和数据的组合体 

数据是什么?

这块我们简单介绍一下:指令是printf,“hello ,world”是数据。如果想深入了解,可以点击超链接进入另一篇博客:数据是什么?

讲到这里,“老衲”说:我明白了,那么那么我写的这段代码,是如何让计算机变成程序,并让他运行的呢?

有意思了,开始举一反三发问了。别急,这块我会分成两部分来介绍:

  1. 计算机是如何让代码变成程序
  2. 它如何运行程序的

计算机如何让代码变成程序?

咳咳!开唠!

通过这张图,我们就能看出计算机运行程序的大概过程了。虽然图中只简单写出了一步,但实际上,让代码成为程序(计算机可以处理的机器语言)需要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的组成

  1. 寄存器:用来暂存指令、数据等处理对象
  2. 控制器:负责把内存上的指令、数据读入寄存器
  3. 运算器:负责运算从内存中读入寄存器的数据
  4. 时钟:负责发出CPU开始计时的时钟信号(linux信号相关)

总之,在这里我们先简单搞清了如果CPU要处理我们编写的代码,就要通过控制器读取内存上的程序放到cpu里面去运算,然后在返回处理后的结果。

而程序运行的底层原理又是如何解释呢?编译链接完毕的程序,如何把它从硬盘上装载到内存中,而代码在内存中又是如何分布的呢?这里后续我会编写几篇博客,讨论操作系统内存分布以及虚拟内存、cpu是如何读取内存上的程序的。传送门→此处应有超链接

结束语

“老衲”,你理解了吗?

  • 11
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悟道xn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值