能放视频能打字的电脑,机器内部只认两个符号:0 和 1

这台会放电影、能写文档、能上网的电脑,拆到最底层看,里面并没有你的照片,也没有中文汉字和英文单词,只有海量的两个符号:0 和 1。你可能会觉得这像某种加密暗号。这一篇不是让你背名词,而是帮你把第一章《计算机科学导论(UFUG1601)》从头到尾真正想通一遍——它到底凭什么只用 0 和 1,就能演算出你屏幕上的一切。

我们沿着一条线索走:一台死板的机器,怎么变成"什么都能干的万能机器"? 从数学思想(什么是计算)讲到一节节落地到真实芯片里怎么跑,最后冲出这台机器,连上网看完一整条"打开网页"的链路。沿途凡是你要默写、要应付的考点,我都会点出来;凡是你能当场背下的定义,我也会反复帮你钉牢。


一、一台死板的机器,凭什么被叫"万能"?从什么是计算到图灵机

很多同学对"计算"的直觉是算数——算价钱、求和、解方程。这个误会如果不先拆掉,后面整章都会跑偏。看看下面这张课件里的图,它用同一行数字喂了两套不同的"过程":

图注:同一组输入数组 [4, 8, 15, 16, 23, 42],既可以做"求和"这种算术计算得到 108,也可以做"降序排序"这种非算术计算得到 [42, 23, 16, 15, 8, 4]。所谓计算并不一定是算数。只要能对输入做一次"定义良好、一步一步照规则做"的变换并产出输出,就算一次计算。

所以计算(computation)= 输入 → 一步步照规则处理 → 输出,跟是不是求加减乘除无关。这一步把"计算"的概念撑大了,后面的图灵机才能接得住。

那么问题来了:怎么造一台机器,让它能做"所有"定义良好的计算?1936 年,艾伦·图灵为了回答"计算到底意味着什么",提出了一台思想实验里的机器,今天叫图灵机。它极度简单,只有三样东西:

  • 一条无限长的纸带:被分成一格一格,每格能写一个符号(比如 0 或 1)。你可以把它想成机器的"内存"。
  • 一个读/写头:站在某一格上读符号,也能覆盖写上新符号,之后把带子向左或向右移一格。它就像机器的"处理器"。
  • 一张规则表(程序):告诉机器"遇到什么状态、读到什么符号,就写什么、往哪动、进入什么状态"。这就是机器的"程序"。

下图是来自斯坦福哲学百科的一张精确示意图。它展示的是机器在某一刻的"完整配置":

图注:纸带方格向左向右无限延伸,红指针(读写头)指在第 9 格。气泡里的记号 q_i 0 : 0Rq_i 翻译成人话就是:"假设现在我处于状态 q_i、正读到 0,就读出 0、把它覆盖成 0、把纸带向右移一格、继续保持状态 q_i。" 一台图灵机就是纸带、读写头和这么一张规则表,然后逐格地按规则机械执行。

关键就在这:机器本身对要算的具体问题一无所知,它只是死板地查规则表一步不落地走。可只要规则表设计得合适,这台死板的机器就能算"图灵可计算"的任何函数。一个系统哪怕极其简单,只要能用它去模拟图灵机、给它足够的纸带和时间就能执行任何计算,它就被称作图灵完备(Turing complete)。你日常接触的东西里,Python、Java 这类编程语言、你的手机和笔记本,甚至超出直觉的 PPT 演示和《我的世界》里的红石电路,都属于图灵完备SEP

你可能已经注意到这条伏笔:在图灵这里,"程序"已经被当成可以像数据一样随手在纸带上读写的符号串了。这个念头一旦转到"造一台真能跑的电子计算机"上,会彻底改变历史。我们下一节就讲这一跃。

一句话带走:计算不一定是算数;图灵机就是一条纸带加一个读写头加一张规则表,却能在时间与纸带充足时算出它能被设计出来的任何东西——这就是"万能"这个听起来很玄的词的真实起点。


二、让程序可变的那一步:为什么"把程序也存进内存"是划时代的

图灵机告诉我们什么叫"算得出",但它还停在纸和笔。要把概念变成能实际制造的计算机,得回答一个工程问题:这台机器怎么"换程序"?

在冯诺依曼提出他的模型之前,早期计算机(最有名的如 ENIAC)是这样的:数据和要执行的指令,靠人把一束束电线插进面板上的插孔堵成某种"布线"来完成。你想让它跑个新任务,就得重新接线(rewiring)。这跟印刷史上的一对老兄弟几乎一模一样:

  • 雕版印刷:整页内容刻死在一块整木版上。内容变一点,就整块重新刻一遍。
  • 活字印刷(毕昇,北宋约公元 1040 年发明):把一个个独立字模排进一个框里。要印新东西,拆掉旧排版,用同一批字模换个顺序排一组新的就行。活字是数据、也是组句的积木,都收在同一个字盘里,却可以排出无限多种文字。

ENIAC 的"重新布线"就像每次都要重刻一块版;冯诺依曼想做的事,是把"指令"像字模一样变成可替换、可重排的一串数据。

于是在 1945 年 6 月 30 日冯诺依曼署名的《First Draft of a Report on the EDVAC》里,他做了一个对整个计算机工业影响至今的决定——存储程序(stored-program):把"要执行的指令"和"要处理的数据"都以同一种二进制形式、按顺序放进机器同一个存储区里,让它一个指令一个指令自动按顺序执行。要换程序,不再去拔插线板,而是把内存里的那一批指令换成另一批就行EDVAC 报告

这句话为什么"划时代"?因为它把"程序"从一台机器专用的、焊进硬件的东西,解放成跟数据一样的、随时可以抽换和重排的一串指令——这正好接上第一节图灵机给的那颗种子。此后电脑"一台机器什么都能装、什么都能跑"就成了顺理成章的事。

冯诺依曼同时把机器抽象地拆成五大部件,看这张课件示意:

图注:冯诺依曼模型的五大部分——输入(input)、输出(output),以及中央那块由三部分组成的主体:算术逻辑单元 ALU、控制单元(Control Unit)和存储(Storage)。左下这幅框图,是后面把每个抽象部件落回"真实硬件"的那张地图。

把这张框图抽象到底,拆开来只有五件事要记:输入、输出、运算(ALU)、控制(Control)、存储(Storage)EDVAC·von Neumann 报告.

需要特别提醒一句:这五大部件与"存储程序"是以冯诺依曼为代表、由他和摩尔学院的同事共同推进的设计,并非冯诺依曼一人从零"首创";"EDVAC 是不是史上第一台存储程序机"史学上也有争议(曼彻斯特 Baby 等竞争者)。所以考试或讨论时,最稳的说法是**"以冯诺依曼为代表的存储程序架构"**,别写成"冯诺依曼发明了第一台"。

一句话带走:把程序当成内存里的一串数据存着再顺序执行,机器才终于能靠"换一批指令"而不是"重新布线"来换功能——这是电脑变得"万能"的落地关键。


三、掰开机箱:CPU、内存、硬盘各管什么,存储金字塔为什么非如此不可

上一节的五大部件只是抽象构造,这一节把它们落到真实机箱。先说分工。听过"CPU 是电脑的大脑"没?在这套比喻里:

  • CPU = 你的大脑,真正在"想"(运算)、在调度,单位时间里能想的就那一点点东西。
  • 内存(RAM)≈ 你的书桌,正在处理的活儿摊开在桌面,够用、常用、够快,但一关机就清空(这就是下一段要讲的"易失")。
  • 外设(键盘、鼠标、显示器等)≈ 你的感官和双手,负责把你和机器之间互相传达信号。

关键难点在于"快、大、便宜、掉电不丢"这四件事没有任何一种单一存储都能同时做到。快的小(贵),大的就慢(便宜)。于是工程师把几种存储叠成一个金字塔:

图注:存储层次金字塔,从尖顶到底座依次是寄存器、核内 L1 缓存(SRAM)、核外 L2 缓存(SRAM)、DRAM 主存、本地磁盘、远端存储。左箭头表示越往下容量与体积越大;右箭头表示越往上速度与单位价格越高。堆起来的逻辑很直白:既想跑得快,又想要容量大还扛得住日常,靠的是"分级组合",而不是某一种"全能存储器"。

看图就能读出一条铁律:越靠近金字塔顶(越贴近 CPU),越快、越贵、越小;越往下,越大、越便宜、越慢OpenStax · 存储层次

那为什么会"既想快又想要大"能同时成立?靠的是缓存(cache)与局部性。CPU 要的数据大都集中在一小片相近区域(比如顺序扫数组、循环反复用同一段指令),于是在 CPU 片内贴近它的地方先藏一小块极快的缓存,把最常用的一小撮数据摞在眼皮底下。CPU 每次"取料"先在缓存找,找不到才逐级往下到更大的层去搬。更真实一点的画面是 CPU 内部的 L1→L2→L3 一串缓存链:

图注:处理器在一颗 Chip 内先连 L1、L2、L3 三级缓存,再接到 Chip 外的主存 Memory。CPU 需要被不停喂数据,所以把最快的那点空间放在离它最近的片上,一级缓存 miss 了才往更靠外的层去取,主存最慢、放在最远。

顺带解答两个高频考点:为什么拔掉电源、内存里正在处理的东西就没了?因为金字塔顶这几层(寄存器、缓存、DRAM)都是易失的(volatile),靠持续供电维持电荷,一断电内容就丢;而普通情况下你的文件放在金字塔底的**磁盘/SSD(非易失、可持久保存)**里,关机还在OpenStax · 存储层次

一句话带走:记忆不是一整块,而是一座金字塔——靠 cache 把最快又常用的东西放在 CPU 眼皮底下,机器才能"既大又快",也才有"哪些掉电丢、哪些掉电还在"的区别。


四、0 和 1 怎么装下数字、文字、照片?二进制不是密码,是编码积木

这一节先戳破最多人背错的误会。二进制不是密码——它不是"0 代表某个字母、1 代表另一个字母"那种一对一暗号。它是一套管用的编码系统:把所有信息先翻译成机器能听懂的统一语言(0/1),再按编码规则一块块拼起来,像把乐高全拆成同一规格的积木。你写下的汉字"好",在机器里不是"某种神秘的 0/1 表示"——它先被分配一个编码值(比如 UTF-8 或 GBK 里某个数字码点),再把这个数字用二进制写出来存进内存。

二进制是"逢二进一",跟十进制"逢十进一"同一个道理。下面 0–15 的对照表背下来,第一章就够用了:

十进制二进制十进制二进制
0000081000
1000191001
20010101010
30011111011
40100121100
50101131101
60110141110
70111151111

单位换算也要默写:1 位叫 bit,8 bit = 1 byte,再往上按 1024 递进:KB → MB → GB → TB → PB……因为计算机里的一切——数字、文字码点、图片里每个像素的颜色值、录音里每个时刻采样的取值——归根到底都变成一串 0/1 存进去。

讲到二进制,课件还讲过一个《易经》与二进制的呼应。请看白晋寄给莱布尼茨的那页手稿:

图注:白晋(Bouvet)致莱布尼茨(Leibniz)的信稿,做了一张"两仪 → 四象 → 八卦"的层级图——实线阳爻、断线阴爻,从一层爻组合到两层再到三层的卦,旁边还标着 11、10、01、00 等数字,看上去和"两个符号层层拼出更多"的二进制结构神似。

德国哲学家莱布尼茨在 1703 年撰写了用 0 和 1 两个字符的《二进制算术的解释》,其中正是借他与白晋的通信、用"整线即 1、断线即 0"去读《易经》的卦象与数序Leibniz ·《二进制算术的解释》.

但这里有一个非常重要的边界,别当考点背错:《易经》本身是"用两个符号的两仪、四象、八卦表达万物"的哲学框架,课件拿它做的是文化交流的类比;"卦象经二进制排序 ↔ 0–63 计数"这条符号对照确实精确,可要说"中国古代就发明了二进制"并没有史料支持。莱布尼茨这套"0/1 与卦象"的对应,是他本人带神学立场的互文解读,不是中国古人怎么读卦的原话Leibniz ·《二进制算术的解释》.所以考试里最稳的说法是:这算"文化类比",不是"CS 史实结论",课件把它当作趣味由来,不是让你背它当发明史。

一句话带走:二进制不是密码,而是一套"用两种符号编码一切"的规则——数字、文字、图片、声音全靠它表示;那串 0/1 是电脑唯一听得懂的语言,不是什么神秘暗号。


五、几行代码到一百行的秘密:程序为什么要分层,还要编译/解释

前面说"程序不过是一串按顺序存储在内存里的指令",那这一串是怎么来的?想象三套渐细的写法:

  • 高级语言(Python/C++/Java):像一份讲人话的菜谱,你写"打印 2 到 100 里的素数",宏观、好懂。
  • 汇编语言:把每步拆成机器指令级别的"厨房操作单"——把某数存进寄存器、取出来乘一下……仍然靠近人,但已经得管寄存器和每条底层动作。
  • 机器语言(机器码):CPU 唯一能直接执行的层,说白了就是一条条的 0/1 位串。

人的代码不能直接被 CPU 吃下去,中间要经过"翻译"。看课件这个例子,怎么从一行算式变成 CPU 认的二进制:

图注:2 × (3 + 4) 先被翻译成汇编指令(add r0, 3, 4;mul r0, r0, 2;return r0),再一层层落到右侧那一串由 0 和 1 组成的机器码。人写得爽的高级语言,最终都要沦为一串 CPU 才认得的 0/1 位串。

于是你看到"Python 只写 6 行、汇编要写 100 多行"的对比。别去背死这个行数——课件的本意是提醒你:同任务的代码行数,取决于你的语言离硬件有多远。高级语言把寄存器和底层细节一揽子打包成易读语法,所以你几行就讲完一件事;汇编离机器最近,每个底层动作都得你自己写,行数自然爆炸。这并不是说汇编"很蠢",恰恰是它能精细操控硬件、性能可预期,才在某些场景被保留(OpenStax 教材也以同一任务多语言对照来说明这个 trade-off,而不是死记几个固定数)OpenStax · 语言基础。

那高级语言到底怎么变成机器码?两条路线:

  • 编译(compiler):把整份源代码先一次性翻译成机器码目标程序(生成一个 .exe 一样的可执行文件),然后才去跑。好处是整体编译完性能好、能在编译期就查出类型错误;代价是平台相关的产物、改一行也要整包重新编译。
  • 解释(interpreter):逐行边翻译边执行,不用先整包编译。改一行立刻见效、便于调试;代价是每条都要现场翻译,运行时更慢。

课件那幅编译流程图,用一句大白话就能讲完:编译器把整份源码"翻译"成旁边的二进制目标码(object code),存成一个能执行的文件。至于这个文件怎么被装进内存、由谁装,就是下一章的主角了。

一句话带走:人写的代码要先沿翻译链变成 CPU 只认的那串 0/1;编译是"整包翻好再跑",解释是"边跑边翻"。写代码行数是多还是少,看的其实是离硬件有多远。


六、双击一个 .exe 之后:装载、取指-译码-执行,以及为什么 Chrome 读不到 Word 的内存

好,代码编译成了磁盘上的一个可执行文件,现在你双击它,机器到底做了什么?很多人以为"双击"这一步是程序自己跑起来的——其实你只是告诉那位"管家"操作系统(OS):帮我把磁盘上这一串 0/1 装进内存,然后启动。

把 OS 放进整幅画面里的位置是这张四层堆栈:

图注:User(用户)在最顶,下面依次是 Application(应用,如浏览器/Word)、Operating System(操作系统)和 Hardware(硬件)。应用不直接碰硬件,都隔着操作系统这一层单向往下请求。

操作系统的身份非常特殊:它是唯一能直接访问硬件的软件,其余程序都必须经由它、通过调度进程的方式在硬件上"以安全的方式"执行任务OpenStax · OS 定位。

看这个"程序一生"的七步流程图,能把"双击"瞬间掰开:

图注:你双击一个 .exe,先是给操作系统一个"信号";操作系统叫文件系统(File System)读出这个文件的内容;随后系统分配一段内存、把读到的程序写进内存;CPU 这才一条条把指令取出来"跑",得到执行结果,最后再经操作系统把结果显示到屏幕上。OpenStax · 程序的一生

可执行文件存磁盘很慢,所以要先由 OS 搬进更快的主存里,CPU 才开始逐条吃。CPU 到底怎么"吃"?它走的是**取指(fetch)→ 译码(decode)→ 执行(execute)**的循环,配合五个寄存器各司其职OpenStax · 程序的一生:

  • PC(program counter,程序计数器):记着"下一条要取的内存地址"。
  • MAR(memory address register):记着"当前正要取的那条指令的地址"。
  • MDR(memory data register):装着 MAR 那个地址里取回来的内容(即取到的指令)。
  • CIR(current instruction register):装着"正在被译码和执行的那一条"。
  • ACC(accumulator,累加器):存运算得到的结果。

七步可默写流程:把 PC 里的地址拷进 MAR → PC 自增指向下一条 → 沿地址总线把该地址发给内存 → 内存把该地址里存的指令经数据总线送回 MDR → MDR 内容再拷进 CIR → 译码并执行,结果存入 ACC → 回到第一步接着取下一条BBC 取指循环.你可能会好奇:那程序会做"如果/循环"跳来跳去,岂不是根本不按地址顺序一步步走?答案是——当遇到 jump(跳转) 指令时,它把"新一条的地址"直接写进 PC,于是循环返回第一步走向别处。正是 PC 可以被改写,程序才能做出选择与循环,而不是永远笔直跑到底。

再回到最初那道送分题:同时开着 Chrome 和 Word,为什么 Chrome 读不到 Word 内存里的数据?因为这两个是两个不同的进程(process)。操作系统给每个程序各调度一个进程、各自分配并管辖一块内存,把进程彼此隔离开,谁也不能越界去读别人的数据——这层进程隔离正是 OS 提供的安全服务OpenStax · OS 定位。这也顺带解释了为什么程序太多机器会卡——资源要由 OS 调度分配,谁也不许独占。

一句话带走:你双击的不是程序本身,是叫 OS 帮你在内存里装好一段 0/1,再由 CPU 逐条"取指-译码-执行";同机的不同程序靠 OS 的进程隔离住,谁都无法顺手读到别人内存里的数据。


七、点开一个网页背后:单机连成网,DNS、TCP/IP 与路由器接力把域名变成内容

最后一站,把刚才那台会算、会隔离的单机接上网。你敲下网址(域名),到页面出来,中间其实是一连串披着人名的搬运工在接力——你只需要把它们当成"帮你把一次点击变成另一台电脑回传内容"的环节,就自动串成一张图了。

先给这些名词一个个安上直觉位置。设想你在寄一封快递:

  • 域名(比如 baidu.com) = 收件人的名字。名字好记、人认得,但快递系统不靠名字定位。
  • IP 地址 = 收件地址的门牌号。接入网络的每台设备都有一个数字标签,且在其网内唯一。IPv4 地址通常写成点分十进制,比如 192.168.43.241——别看它像四个短数,拆开放大就是四个"八位段"拼起来共 32 bit,这正是"机器能认的 0/1"对人类做的一次友好展示。
  • 路由器 = 各大转运中心,负责把包裹(数据包)从一个网络送到下一个网络的网关。
  • 协议(TCP/IP 等) = 寄件规范,保证两端能互相听懂并保证顺序。
  • DNS = 互联网的电话簿:帮你把"baidu.com"翻成它对应的那一串 "IP 门牌号"。

打开网页的第一步就是查这本电话簿。这个过程叫 DNS(Domain Name System):浏览器并不知道 baidu.com 的服务器的门牌号,于是去问 DNS——DNS 把域名翻译成 IP 返回给浏览器,浏览器这才拿 IP 去访问服务器:

图注:用户输入域名 → 计算机向"DNS Server"发出 Enquiry 查询 → DNS 返回一个形如 xxx.xxx.xxx.xxx 的 IP 地址 → 浏览器再拿这个 IP 去访问网站服务器。这就是"网址→电话号码→拨号访问"的翻译一步。

递归到一个层级看,DNS 是靠若干级"问路"完成的(可缓存,第二次开通常更快)。它本身常驻后台、对用户透明,所以课件直接把它总结成一句可背的话:DNS = 互联网的电话簿(把域名翻译成 IP 地址)Cloudflare · DNS。

拿到了 IP,接力棒就交给网络本身。你的请求是一整条长得不像话的消息,网络第一步就是把它拆成一小片一小片的数据包(packet),让它们各自经最合适的路径被路由器送到对端再重组Cloudflare · 互联网如何工作。而不同层的协议各管一件事:Ethernet 管同网内发、IP 管网到网寻址、TCP 保证按顺序可靠到达、HTTP 给网页数据定格式。至于那些名词怎么归类——局域网(LAN)连的是主机(你办公室/宿舍那几台机器),广域网(WAN)连的是路由器、交换机这类连接设备(常由运营商建设再租给组织),而互联网(Internet)就是"网络的网络":一堆 LAN/WAN 用统一协议连通全球。

一条动作链把整章收个尾,你可以顺着背下来:

一句话带走:联网的本质,是程序与数据以 0/1 拆成包,从一个网络接力搬到另一个网络。域名、IP、协议、路由器这些词,只要你想清"它们在帮你把一次点击的电信号变成另一台电脑回传的内容",就自然连成一片,不再是孤立名词。


结语:一整章的回顾地图

回头看,主线其实只有一条:一台只认 0 和 1 的机器,凭什么什么都能干? 思维的起点是"计算不必是算术",图灵把它形式化成一步一格的纸带机器;冯诺依曼把"程序"当数据放进内存,机器才能自动换程序;真实机器里,CPU 靠金字塔式的存储层次和取指-译码-执行的循环,把磁盘上那段 0/1 一条条吃掉;程序是人类写得懂的语言,经过编译/解释变成机器码;同机靠 OS 隔离各个进程;再把单机接上网,用 DNS、TCP/IP 和路由器搬移那些 0/1 的数据包,就能打开一个网页。

哪一个考点你觉得背了就忘,多半是还没看清它在主线上的位置。回到线上想一次,比硬记一串名词要牢得多。祝你考试顺利,也祝你真正弄懂了这台只认 0 和 1 的机器。


参考文献

本专题引用的核心资料如下,建议深入学习时翻阅原文:

  1. Turing Machines(Stanford Encyclopedia of Philosophy, 2025 修订版) — https://plato.stanford.edu/entries/turing-machine/
  2. von Neumann, First Draft of a Report on the EDVAC(1945-06-30) — https://people.csail.mit.edu/brooks/idocs/firstdraft.pdf
  3. Von Neumann stored program concept & fetch-decode-execute cycle(BBC Bitesize / Edexcel GCSE) — https://www.bbc.co.uk/bitesize/guides/zkrr97h/revision/2
  4. OpenStax Introduction to Computer Science, §5.5 Memory Hierarchy — https://openstax.org/books/introduction-computer-science/pages/5-5-memory-hierarchy
  5. Leibniz, Explication de l'arithmétique binaire(1703, Mémoires de l'Académie Royale des Sciences, pp. 85–89) — 所附档案聚合页(https://divinity.interactivelion.com/sources/explication-de-larithmetique-binaire)当前已移除失效(404),需凭档案缓存/重建核验后使用
  6. OpenStax Introduction to Computer Science, §7.1 Programming Language Foundations — https://openstax.org/books/introduction-computer-science/pages/7-1-programming-language-foundations
  7. How does the Internet work?(Cloudflare Learning Center) — https://www.cloudflare.com/learning/network-layer/how-does-the-internet-work/
  8. What is DNS?(Cloudflare Learning Center) — https://www.cloudflare.com/learning/dns/what-is-dns/
  9. OpenStax Introduction to Computer Science, Ch.5 Summary(OS 角色) — https://openstax.org/books/introduction-computer-science/pages/5-summary
  10. OpenStax Introduction to Computer Science, §5.1 Computer Systems Organization(程序的一生) — https://openstax.org/books/introduction-computer-science/pages/5-1-computer-systems-organization
CS导论复习:能放视频能打字的电脑,机器内部只认两个符号 0 和 1