这个问题很不错。当我11岁时我刚刚在电脑上玩游戏的时候,我的疑问就存在了,后来我又度过了6年的大学生涯,终于能够或多或少回答这个问题了。
计算机的工作过程本质上是非常复杂的,让我从最基本的开始吧。
1、物质是由原子构成的(当然我们还可以将物质分得更小,但在这里原子就够了。“
2、原子中存在电子,电子的流动形成电流。
3、现在,为了使用这些电子,我们制造了能够按照要求存储/释放电流的晶体管。它们有两种状态:1和0,可以分别对应为5V和0V。
4、一个8比特位的数可以用8个晶体管来表示。所以3这个数字的比特位表示(二进制)为:00000011.
而这是如何在硬件上实现的呢?将8个晶体管一字排开(称为寄存器或存储单元)。让前面的六个晶体管处于0V状态,后面的2个晶体管则处于5V状态。
CMOS晶体管
5、将这些晶体管进行某种形式的组织,就能得到寄存器和存储单元,并进一步得到CPU和RAM。
计算机的层次
6、为了能更简单地使用CPU,我们发明了机器代码。这种代码可以直接运行在CPU上。运行过程中会实现比特位的位翻转。例如我想做一个2+3的运算,在机器中,首先将2存入到了一个寄存器中,然后由将3存入了另一个寄存器。然后这些值被放到加法器单元进行数学加运算(这并不是电压的相加),得到的结果又存储在另一个寄存器中。这个过程的机器代码是:
80 02 F3
80 03 F4
88 F3 F4 F5
显然,基本上没人能看懂这是什么意思。所以我们想出一个朴实的解决方案来设计人类读得懂的代码。这就是所谓的汇编语言。下面给出的代码就代表了上面提到的数字。
MOVI 2,REG A
MOVI 3,REG B
REG ADD A,REG B,REG C(A加B,结果存储在C)
其中,MOVI = 80
REG A = F3
REG B = F4
REG C = F5
ADD = 88
瞧,我们的第一个编码语言!
全加器
7、但是,对人类来说,汇编指令实在是太难记了,而且编程过程也过于繁杂。所以更高级的语言C语言出现了,通过合适的编译器可以将C语言代码转换成汇编代码(记住,这是可以直接用来计算的)
而上面的计算代码也变成了:
{
int a = 2; b = 3;
c = a+b;
}
8、就像世界上存在各种各样的语言一样。我们也发现编程的时候如果有更有表现力的语言,人们就能写出更好的程序。然后再将其编译成汇编,然后就可以在寄存器中实现位翻转。也就是说为对最底层的晶体管产生影响,进而影响其中的电流。
9、有了以上的基础,我们开始编写操作系统,以实现硬件的最大化利用,因为看起来在我们从磁盘取数据的时候,CPU会保持闲置。
10、而其他的我们使用到的一切都是通过有表现力的语言写出的程序,当然,这些程序都运行在操作系统之上。
11、在操作系统之上,我们开发出了一个名为TCP / IP的网络协议栈。该协议栈为计算机之间的相互通信提供了一个标准化的方法。
12、然后,互相连接的计算机越来越多。我们又创造了万维网和Http.这使得不同网络之间可以实现通信。注意http是一种协议。除了内部协议之外,服务器和客户端都至少要遵循http协议。
接下来,让我们调转船头,从软件到电子再看一遍:
1、当你在浏览器中键入网址并按下Enter键后,一个http请求就从你的浏览器(客户端)发送到了该网站的服务器。
2、在你的电脑上,浏览器是用C/C++写成的一个程序。
3、写出浏览器的C/C++代码需要经过编译处理才能得到我们使用的程序,该程序运行在操作系统上。
4、操作系统(Windows/Linux等等)和相关的驱动程序都是经过编译之后再运行到机器上的。
5、当程序在CPU中运行时,其是以机器代码的方式运行的。
6、机器代码在寄存器和存储单元中实现位翻转。
7、寄存器和存储单元由晶体管组成。
8、晶体管通过控制电子流来控制电流。
这些过程的描述都非常简单,但本质上就是这么个过程。
我很高兴能够回答这个问题,计算机是人类有史以来最伟大的发明,而这也不是那一个单独的个人就能完成的。我们已经在这条道路上前进了50多年的时间,成千上万的人为此贡献了自己的心力和智慧。单独的个人要想对这整个过程都有深刻专业的认识并不容易,我谈到的也都很肤浅,我甚至没有谈到缓存、微架构、GPU、BIOS等等,但是希望我写出的这点东西能够帮到你。