手记

编程的本质——由浅入深理解程序的底层实现原理(二)

计算机程序的本质

通常,我们认为

程序 = 数据结构 + 算法

算法是对解决问题方案的准确而完整的描述,利用计算机有序地安排处理各种结构的数据实现算法的就是程序了,这很符合人类世界的认知。
那么,对于计算机来说,程序是什么?其实,计算机它就是机器,一个容纳数据和操作数据的机器,所以,实质上

程序 = 数据 + 指令

说明一下,指令简单来说就是计算机能够自动独立完成的一个基本动作,计算机有各种指令,这是由于指令也是用数据的形式描述的。
计算机是如何表示和识别数据的?
计算机的工作是依赖电信号的,电路的通断两种状态正好可以对应一位的二进制数,这个特点符合二进制数据,事实上计算机都以二进制的形式处理数据

计算机对内存中数据的处理

为了描述的方便,计算机底层数据划分如下:

  1. 每8个二进制位(bit)记一个字节(byte)
  2. 每2个字节为一个(word)
  3. 每2个为一个双字(dword)
  4. 每2个双字为一个四字(qword);依次类推。

    这样的数据可以直接用寄存器处理,多样的寄存器和丰富的指令可以灵活地组织数据形成各种结构的数据。必须明确一点,任何一个数据的含义都是人为地按照一定规则地安排而被赋予的。例如,在32位系统模式下,内存中数据的地址就是32位(双字大小)的,现在定义了一个DWORD类型数据,那么这个数据有无符号、是数值或是地址、整个用还是拆分用等完全取决于你自己的安排,是不是很有趣呢?

程序设计到运行的实现

现在发散思维,想象一下数据结构是怎么复杂起来的?列如,首先来一个基本类型数组,那么它的每一个元素都是一个简单的数值,元素有序地排成一列,结构就像一串糖葫芦一样。现在要把数组弄得复杂一点,把每个元素改为数组可不可以?还是可以,这个时候数组其实就变得像包装成一箱的饮料一样,但还是可以按序访问每个值,本质上还是线性数据。要是结合其他基本结构呢?例如,可以把数组放到结构体或链表中,也可以把链表放到数组中,而且组合的结构还可以再组合……这样数据结构当然会越来越复杂。
一个人可以在一个房子和各种家具等物体组成的家里,而人、大大小小的各种房子、道路、各种交通设施等等构成了一座城市,在城市里找一个人比在家里找一个人难得多啊!说到城市的构成,不妨倒过来看,一个城市可以有各种建筑、人和其他动植物等,这种思维用到程序设计中不就是面向对象的编程思想吗?
深入计算机底层后,你将不再认为计算机很神秘。我们将现实的事物抽象为计算机可以进行各种运算的数据,并把它们的关系按序编排为程序,这样计算机才能够完成复杂的工作。程序由设计到实现的任何一个细节都是人们处理好的,如果疏漏了一个细节,程序就不能正常运行。由此可见,计算机本身没什么的,真正厉害的是人,是一代又一代的编程大师们!

0人推荐
随时随地看视频
慕课网APP