首先要对一个程序有感性上的认识,才能把握它。
程序生存的空间是 存储器,存活的时间是叫时钟的脉冲序列,构筑程序的砖块,无论是哪种语言的面孔,最终都是01二进制序列。
这几句略显文艺的话,是这一部分的总纲。其实最初我这一部分想的标题叫
程序的几张脸,但我怕吓着你们,还要解释,浪费字数。
而我前面关于 函数 和 变量 的内容,其实都在解释第一句
“程序生存的空间 是 存储器”。
410字.......这篇总结显然是不够的,算了,规矩就是拿来打破的。
先总结一下第一句话:“程序的生存空间是 存储器。”
从组分来说,程序分为 代码指令 和 数据。这个代码指令你既可以理解为C语言下写出来的表达式,C语句,也可以理解为编译出来的最终运行的机器码,在这个语境下,它们是一回事。
而数据,当然指的是程序运行中会产生或者需要用到的数据。
记住:数据,当然是数据,而代码指令,其实也是数据。这句话可以配合第三句话来理解“构筑程序的砖块,无论是哪种语言的面孔,最终都是01二进制序列”
总而言之,如果你想看到一个程序的真面目,我告诉你,它是存储器上的0100101111101011011101110111......它们当中,有的被认为是代码,有的被认为是数据,至于怎么认为,嗯,那不是你干的事,确切的说,那不该是人干的事情,自有机器去做这件事情。
我始终坚信,确切知道一个东西的本来面目,你才能真正握住这个东西。
2 指令其实也是数据
你也许会很奇怪,代码指令(以后简称 指令,事实上,指令用在这里是最合适的,代码只是指令的载体)
你可能不理解为什么 指令 可以是一串数字——假如你不懂数字电路,不要紧。这里不需要你学逻辑门。
回想一下每天要出门抬两桶水的小明。
在他的动作里,其实来来去去就是三个基本动作,出门,抬水,回家。
如果我要让其他人,甚至东西去做这三个动作,比方说,比方说一个装载了电脑的简单机器人去做这件事可不可以呢?
可以,至于它怎么抬动什么什么轮才可以出门,怎么怎么才能抬水,我不操心。我关心的是,我要告诉它什么时候出门什么时候抬水。让出门,他就会出门,让抬水,他就抬水。
注意到了没,这个故事的真相就是——怎么出门,其实它自己“芯里”是知道的,它身上的“轮子”也能够配合完成,而我告诉他的,只不过是——“出门”,“抬水”.......那么,我可不可以说1它就出门,说2它就抬水呢?
显然可以。
我啰啰嗦嗦地解释了一番,但这就是指令就是数据的所有真相。
指令的意思就是 命令,让机器去执行什么动作的意思。
而每个机器所能做的动作,设计让它能做的动作总是有限的。因此,我们总能以一套数字来代表这些指令,专业术语叫 数字化。
这个看起来非常简单的动作,把电子控制从 模拟时代 引向 数字时代。OK...打住。
3 程序是如何执行的
接下来,我将说到 第二句话,程序的生存时间。
前面我们提到,程序在存储器上的存储和运行有两种方式:
一种是,像51等单片机上面的程序,它的特点是,一经烧录,代码将永久保存在 程序存储器上,它又叫裸机程序;另一种是,像PC机这种带高级操作系统的,PC机开机后,CPU的控制权已经移交给了操作系统,由操作系统在需要运行程序时,把相关的指令和数据一并加载到内存上,因为CPU始终在内存上读取指令(读取指令就是在运行程序)。
这一段话,信息量有点大。
让我们来衔接 数字化 更进一步解释。
首先,明晰一点,任何地方,指令和数据都是 一串01,它们最终都存在存储器上,不管它是叫 程序存储器,数据存储器,还是内存硬盘。
那么,运行程序,到底是怎么个“运行”法呢?
还是回到 小明的抬水机器上去。
现在,小明拥有一台机器人使唤了,他只要发出指令,机器人就会帮他完成之前他自己的辛苦抬水任务。
小明首先要想起自己平时做这些事情的过程,很简单:
出门->抬第一桶水->回家->出门->抬第二桶水->回家->结束
数字化一下吧
1 -> 2 ->3 ->1 -> 2->3 ->0
如果有一天,小明不在家或者还没睡醒,他如果能把这些事情写在一张纸上,让机器人看着照着办就好了。
这组数字,确切说这组指令,就是程序代码。
机器人一条一条去读懂这些指令并且按指令执行,抬水这件事情就做完了,也就等同于,抬水这个程序执行完了。
所以,“执行程序”这件事情,其实说白了,就是一条一条指令的执行。只不过机器人里,这件事情是由CPU完成的。
纸上的代码,机器人一辈子都看不懂。
这些代码当然是写在所谓的程序存储器或者内存上的。
它们怎么写上去的?呵呵,它们比我简练——要干啥就写啥。
是的,你看到的那些个010101111......如果翻译成十进制,就是前面的
1
2
3
1
2
3
0
这样的七个数字就够了,因为,机器人看到1就知道要 出门了,看到2就知道 抬水了.......
程序就是如此简单。
4 CPU是个超级大懒虫
说到 这句话里说的
“存活的时间是叫时钟的脉冲序列”
我没有太好的例子,我只能这样说。CPU这个家伙就像一个很狗屎的家伙,它出奇的懒,它非得人家捅它一下,它才会动一下,而且只动一下。
我的意思是.......
旁边的人:喂!
CPU: (哦) 1——出门
旁边的人:喂!
CPU: (行了行了) 2 ——抬水
......
你只要把旁边那个人的 喂-喂-喂 换成一串方波,就可以了,它就是我说的 脉冲序列,程序的生存时间就在这一声又一声的 喂 里,因为其他时间,它都一直在睡觉,如死了一般。
今天的内容写得太长了。