注:本文仅仅是随想,不严谨,不专业,不负责。
计算机的本质是状态机以及状态机的变化。这里的状态可以简单理解为显示0或者1的电子原件(本质上是寄存器,通过高低电压来模拟0和1)。【计算机还有一个定义就是一段时序电路。通过外在信号的输入,可以改变时序电路的状态】。这些电子原件之间通过互相连接、组合以及传递,可以模拟一系列状态的变化,比如00-->01-->10-->11。现在假设有两个电子原件,其中有一个表示01 (0和1是位置,如果是二进制的话表示为1),另外一个表示为10(二进制表示为2)。如果将第一个电子原件的状态,叠加到第二个电子原子(01+10=11,二进制就是3),那么也就有了一个简单的加法器。这个就是运算器。也可以认为一个简单的计算机(computer 就是计算)。但是如果想要实现更加复杂的计算,理论上就需要更多的电子原件来模拟这个过程。在现实情况中,一般我们能用计算机进行大量的计算,比如1+2,3+4 等1万个需要计算。假设计算机正在处理1+2,那么后面9999个运算就需要一个地方来存储,这个地方就是存储器。另外有一个设备负责将3+4等数据放入前面的运算器中,这个就是控制器。上面提到的运算器,控制器,存储器的组合可以简单理解为我们常说的主机。
假设我们已经理解计算机内部是如何工作的,那么我们平常用到的显示器,鼠标又是如何运行的?在这之前,我们可以想象一下LED屏幕,它们通常是有内容的地方亮的,没有内容的地方是暗的。聪明的你是不是已经想到,我们可以用(0,1)来控制。没错,只要(0,1)足够多,我们就可以看到足够精细的图像,直到肉眼无法识别这种差别。但是还有好多问题,比如这只是模拟一个静态的图画,另外(0,1)只能模拟出黑白画面。这些和日常看到的精美绝伦的动画相差太大。对于前面一个,如何从静态的变成动态的,想象一下电影的原理,只要画面切换足够快,那么就可以认为它是动态的。对于后面一个,我们知道大部分色彩可以通过红、绿、蓝来控制,那么相应地也可以通过一些控制来实现色彩的展示。到这为止,我们大概知道计算机或者显示器是如何来模拟(欺骗)视觉的。那么听觉又是怎么回事呢?初中物理课讲过声音的本质是一种波,波是连续的。那么计算机又是如何模拟的呢?我们把波切成一块一块,就像微积分一样,只要足够细,就可以看出是连续的(就可以欺骗耳朵)。对于其中的一块,我们可以进行编码控制,这些通过计算机的某些元件来实现。显示器、摄像头、耳机、麦克风,这些设备都是电脑的外设;或者说是视觉和听觉的传感器,其中有些是输入设备,有些是输出设备。关于鼠标和键盘,它们的作用是向计算机中输入一定的信号来控制结果。上面提到的这些都是输入和输出设备。
到现在为止,我们大概理解了计算机的硬件,那么计算机的软件又是什么呢?首先,我们提到了许多概念,比如运算器,控制器,存储器,输入和输出设备。那么这些设备是如何一起工作的,什么时候需要谁,需要提供什么资源,需要多长时间?应该有一个东西来控制这些,没错,这个就是操作系统。有了操作系统我们就可以在一定时间内使用这些资源,通过这些资源配合我们可以完成一些特定任务,比如Word和Excel。这些就是基于操作系统的上层应用,其中涉及到了视觉展示,内部计算,信号输入等。通常我们可以一边在Word打字,另外还可以用Excel计算。主要原因是计算机的资源够多,可以“同时”分配给Word和Excel。当然还有一个可能就是计算机的速度太快了,可能是人的100万倍。乔布斯曾经讲过一个故事,我在你面前喝咖啡,如果我的速度够快的话,我可以回家一趟处理事情,然后再回来。但是从你的角度我是一直在你的面前。计算机很多时候就是通过这个原理来欺骗人的大脑。在速度方面,计算机和人相比,就像高维生物和低维生物,人类实在是太慢了。操作系统或者上层应用,这些都是软件。我们可以给个定义,软件就是为了实现某个目的而使用计算机硬件资源的一系列命令的集合。
软件本质是命令,更加底层的是0和1,这些都是计算机可以识别。想象一下有这样一段代码0001100011,从人类角度来讲实在是太难记了。假设这段代码11表示加法,11前面的三位和后面的三位表示需要加的数据,最后面表示计算之后的结果放置的位置。我们可以通过助计符 [数据1]add[数据2][结果],是不是简单多了。这里add就是汇编,每个公司的定义不一样,这里只是示例,非常不专业。这里的add 只是汇编中的几个语法,其实还包括sub, mov,但是一般也不是很多。在现实情况下,实现一个运算,可能需要一系列的add, mov。为了编程的简便,我们可以进一步封装(包装)。举个例子,23 本质是2 add 2 add 2, 这里有两个add 指令。这个时候就出现了更加高级的语言,比如C/C++,Java,Python, 我们只需要输入23, 计算机会自动翻译为2 add 2 add 2, 是不是简单多了。这些高级语言都有各自的使用场景,但是最终都会变成底层的0和1来执行,这个过程是就是编译。这些就是计算机运行的大概情况。