大家中学的时候大概就都知道了二进制是怎么回事,也基本能粗略理解内存和硬盘的区别。今天聊两件事:操作系统是什么,编程语言又是什么。
这两件事放在一起说,是因为它们刚好搭成了一个完整的逻辑:操作系统管着电脑的硬件,编程语言让你跟操作系统说话,告诉它你要干什么。
操作系统是个翻译官
你有一台电脑,里面有 CPU、内存、硬盘、键盘、鼠标、屏幕。这些东西怎么协同工作呢?CPU 只能执行机器指令——就是一串一串的 0 和 1。你不可能直接写 0 和 1 来让它干活。硬盘上存着文件,但谁来管这些文件放在哪个位置、怎么读怎么写?鼠标点一下屏幕上的按钮,谁来判断你点到了哪里、应该触发什么反应?
这些东西都需要一个中间人。这个中间人就是操作系统。
你可以把操作系统想象成一个翻译官,或者一个大管家。你(用户)说人话——点一下鼠标、敲一下键盘、拖一下文件。应用软件(比如浏览器、Word)说自己想干什么——我想打开这个文件、我想往屏幕上画一行字。底层的硬件(CPU、内存、硬盘)说你得给我 0 和 1 我才能动。
操作系统就站在中间,把用户的操作翻译给软件,把软件的请求翻译给硬件,把硬件的执行结果翻译回来给你看。
你往硬盘里存一个文件,你不用管这个文件存在硬盘的第几个扇区、磁头要怎么移动。你告诉操作系统"把这个文件存到桌面",操作系统自己去管底下的事。你打开一个浏览器,你不会关心它被分配了哪一段内存、CPU 调度它跑了多少个时间片——也是操作系统在管。
常见的操作系统你可能都听过:Windows、macOS、Linux、iOS、Android。它们各自有不同的设计哲学和界面风格,但干的活大同小异——管硬件、跑软件、给你一个操作界面。
编程语言是你跟电脑说话的方式
好,你有了操作系统,它能管硬件了。但你怎么让它做一件具体的事情呢?
比如你想算一下 1 到 100 加起来是多少。你觉得很简单,心算也行,但你如果偏要电脑来做,你怎么告诉它?
你跟一个完全不懂中文的人说"把一到一百加起来",他听不懂。你得用一种他懂的语言。电脑也听不懂中文,它只能听懂机器指令——0 和 1。但直接写 0 和 1 太反人类了。于是人们发明了编程语言。
编程语言就是你和电脑之间的一种约定好的沟通方式。它不像 0 和 1 那么底层,也不像日常语言那么模糊。它足够精确,能让计算机理解,也足够接近人的思维方式,让你能写出来。
Python 是现在最流行的一种编程语言。它长什么样呢?比如你想把 1 到 100 加起来,用 Python 写就是:
total = 0
for i in range(1, 101):
total = total + i
print(total)
就这么几行。你不需要知道 CPU 的寄存器怎么用,不需要知道内存地址怎么分配。你只需要告诉电脑你要干什么,至于怎么干、硬件怎么配合,操作系统和 Python 的解释器帮你去处理。
操作系统和编程语言搭在一起
你现在可以想象一下这个完整的链条了。
你写了一段 Python 代码。Python 的解释器把你的代码翻译成操作系统能理解的系统调用。操作系统拿到这些调用,去指挥 CPU 运算、指挥内存读写、指挥硬盘存储数据。算完之后,结果从操作系统返回到 Python,Python 再返回到你的屏幕上。
这个链条里,每一层都有自己的职责:硬件负责执行,操作系统负责调度和管理,编程语言负责让你表达你的想法。你只需要学最上面那一层——用编程语言把你的想法写出来就行。底下两层是工具,你不用每次都去碰它们,但知道它们在做什么会让你心里更有底。
你已经在用操作系统了
其实你在看这篇文章的时候,就已经在通过操作系统和硬件打交道了。浏览器是一个应用软件,它请求操作系统在屏幕上画字、从网络接收数据。操作系统把浏览器的请求转换成硬件操作,硬件执行完之后,结果一层一层传回来,变成你眼前的这篇文章。
每一次点鼠标、每一次敲键盘、每一次打开文件,都是这套流程在运转。知道了这一点,你可能会意识到——电脑并不是一个神秘的黑箱,它只是分了很多层,每一层都有人在用,每一层都可以被理解和学习。
你不需要一上来就学操作系统是怎么写的,也不需要知道 Python 是怎么实现的。你只需要知道它们各自负责什么,然后从你最方便入手的那一层开始学。
编程语言就是最好入手的那一层。它离你的想法最近,离硬件最远。写两行代码,运行一下,看到结果——这个正反馈的循环很快。一旦你习惯了用代码说清楚一件事,你就会发现之前觉得复杂的东西其实都可以被拆成一件件小事,一件件地用代码表达出来。