抽象黑箱
“抽象”是一个在不同领域都常常被提及的概念。生活上,它与“具体”相对,说明某物或者某事不那么容易感知。哲学上说,“抽象”就是将复杂物体的一个或几个特性“抽”出去,而只注意其他特性的行动或者过程。在计算机科学领域,抽象是一种简化复杂问题的途径。
“黑箱”则是一种广为人知的理论——黑箱理论。在应用中,我们把实现一定功能的系统看成一个黑箱子,我们只知道如何去操作它,知道按某种方式对其进行操作就可以得到我们需要的结果 / 答案 / 效果,而不去研究这个黑箱子内部的原理。
我们不难发现,黑箱是进行抽象的结果,抽象是实现黑箱的过程。我们从计算机(广义的计算机,不仅仅是我们所说的“电脑”,手机、路由器、汽车、智能电视等有着类似体系的设备都认为是计算机)的世界开始,探索这个充满抽象和黑箱的世界。
最底层的 CPU、内存等硬件设备,是由无数的电容电阻电感,以及二极管、三极管、MOS 管等组成集成电路构成的,对它们的物理上的操作——无非是“上电”和“掉电”两种——被抽象成了一组组由“0”和“1”组成的“指令”组成的集合。在这一层,我们对计算机硬件的操作,不再需要了解与那些集成电路有关的技术细节,只需要记忆若干指令——举个例子,我们可以定义 11001010
可以用于计算加法,11001111
则将数值存到内存中。
使用机器指令操作硬件实在繁琐,于是在那之上,人们开发了操作系统,来实现对底层指令的抽象。首先是操作系统的内核(Kernel)——例如 Linux Kernel、Windows NT 或者 XNU/Darwin。内核是操作系统的核心部分,与底层指令紧紧相关。它将指令进行打包封装,抽象成一系列系统调用,例如“打开文件”“写入磁盘”“创建进程”等。从此往后,只要使用这些系统调用,即可实现对硬件的控制。
除了内核之外,操作系统还提供了一系列系统软件。它们实现对系统调用的抽象——毕竟用户想轻松地使用电脑,不想去记各种系统调用的名字、功能和用法。这些系统软件一面面向内核,另一面则有些面向用户,有些面向其他应用软件。系统软件为它们的上层提供了内核各种功能的抽象。例如,在 Windows 中,我们只需要右键→新建→新建文件
就可以创建一个文件、更改它的名字,对于这个操作具体干了些什么,我们无需了解。
而我们熟悉的应用软件,则是对系统软件和稍微基础一些的其他应用软件的抽象。例如 QQ,便是对信息处理、编码解码、网络通信,以及磁盘读写,摄像头 / 麦克风控制等等许多功能模块的抽象。应用软件另一面面向用户,以人性化的方式给予用户信息,从用户那里得到指令。到这一层,用户以极低的学习成本便可以使用机器了。
一层一层的抽象,带来了一层一层的黑箱:一般的 QQ 用户,对实现其功能的技术细节不甚了解;对于在操作系统之上层面进行开发的工程师来说,操作系统本身成为了一个黑箱……每进行一次抽象,抽象前的诸多细节被隐藏起来,只留下一系列“接口”,供外部按规则使用。
放眼我们的生活,容易发现几乎我们接触到的一切,都是黑箱——智能手机、电脑等不必赘述,我们接触着这个世界的每一件事物,却可能不了解其内部的原理和规律。事实上,我们人类自身,也是一个黑箱:我们利用自己的身体去实现每一项功能,却或许对我们身体的结构、对我们体内的“技术细节”一无所知。但这并不妨碍我们生存——我们只需要按照自然界给我们的“手册”,利用好暴露给我们的“接口”即可。