公众号旧文

计算机世界的复杂性只是规模的幻觉

作者:胖子阅读 —

计算机显然是一个极其复杂的世界。

有无数语言、框架、协议、软件、系统。

  • Python 和 C 完全不同
  • Linux 和 Windows 完全不同
  • 浏览器和数据库完全不同
  • Docker 和 Nginx 完全不同

但计算机本质上只在做两件事:抽象与还原。

所有复杂系统,最终都会不断坍缩成少数几个核心结构。

一、从编程世界开始坍缩

所有人学编程时,都会先接触:

if
for
while
function

游戏引擎很复杂,Web 网站很复杂,AI 还是很复杂。

但无论多复杂的软件,最终都逃不过三种基础结构:

顺序(Sequence)
选择(Selection)
循环(Iteration)

这就是经典的结构化程序设计。

例如:

顺序

a = 1
b = 2
c = a + b

程序一步一步执行。

选择

if score > 60:
    print("pass")
else:
    print("fail")

程序开始判断。

循环

while True:
    work()

程序开始重复。

你会发现,无论是聊天软件,还是游戏,又或者数据库和浏览器。

最终都只是:

执行
判断
重复

在不断嵌套。

复杂软件,只是规模更大的组合。

二、函数,只是折叠复杂度

后来程序员又发明了 函数(function)

函数并没有创造新的计算能力。

它只是把一段复杂逻辑折叠起来。

于是:

send_message()

背后可能有:

  • 网络
  • 加密
  • IO
  • 序列化

但对外看,就只剩一个名字。

这就是抽象。

三、操作系统也在做同样的事情

操作系统世界,也在发生同样的坍缩。

表面上:

  • nginx
  • Python
  • Docker
  • sshd

千差万别。

但到了 Linux 内核系统调用层(syscall)后,整个世界开始收缩。

四、Linux 世界的坍缩

所有程序,最终都会不断变成:

文件操作

open
read
write
close

进程操作

clone
execve
exit
wait4

网络操作

socket
connect
send
recv

内存操作

mmap
brk
mprotect

于是浏览器、数据库、容器、Shell,这些看似完全不同的东西,最终都只是一群 syscall 的排列组合。

五、从程序继续还原

比如你写:

print("hello")

你以为只是打印一句话。

但实际上它会一路向下坍缩。

第一层:Python

Python 解释器处理:

print()

第二层:C 标准库

最终调用:

write()

第三层:系统调用

进入:

sys_write

第四层:Linux 内核

内核找到:

stdout

对应的 tty。

第五层:驱动

tty driver 开始处理字符。

第六层:硬件

CPU 开始:

  • 写寄存器
  • 操作缓冲区
  • 发送中断

第七层:电子世界

最后,一切又会还原成电压变化、晶体管开关、电子流动。

六、抽象与还原,是同一个过程

计算机最神奇的地方就在这里:

人类不断向上抽象,计算机不断向下还原。

七、真正的复杂,不在规则

最后你会发现:

计算机世界真正复杂的,从来不是基础规则。

因为基础规则少得惊人。

真正复杂的是规模。

就像:

  • DNA 规则不复杂
  • 神经元规则不复杂
  • 晶体管规则不复杂

但当数量巨大后,复杂性就涌现出来了。

所以很多真正学懂计算机的人,最后都会有一种感觉:

整个数字世界,本质上只是极少数简单规则,在无穷递归地组合自己。