# 18. 编码

内核恐慌 · 2015-05-31

<https://lib.pan.icu/3110c166-6a16-4a8c-a952-b7bea8a40022>

本期《内核恐慌》由吴涛独自主持，围绕计算机编码的核心概念展开，从机器语言、汇编到高级语言的演进，再到ASCII、Unicode等字符编码标准，解释了二进制如何表示文字、图像和声音。节目还包含丰富的读者反馈：一位听众回忆删除DLL导致系统崩溃的经历；另一位从力学角度比较机械键盘和薄膜键盘的压力曲线，指出机械键盘长时间使用可能更费力；还有听众推荐Data Science领域的资源和播客《Talking Machines》。结尾吴涛以幽默方式讨论“程序员如何找女朋友”，强调理解人际沟通的“编码”比技术知识更重要。

## Questions this episode answers

### 为什么电脑上有时会出现乱码？

吴涛解释乱码源于字符编码不匹配。以ASCII码为例，计算机用特定二进制数代表字符，如大写A对应1000001（十进制65），若解码时选错编码规则就会显示乱码。Unicode为所有字符分配唯一码点，再用UTF‑8等将码点转成二进制，但只要解码时编码选择错误，仍会产生乱码。

[30:46](https://lib.pan.icu/3110c166-6a16-4a8c-a952-b7bea8a40022?t=1846000)

### 机械键盘和薄膜键盘的按键手感差异大吗？

一位听众从压力曲线分析差异：机械键盘靠弹簧，压力线性上升，需持续用力，总做功较大；薄膜键盘的橡胶板突破初始压力后压力骤降，更易保持按压。他试用茶轴发现在CS等需长按的游戏中机械键盘更累，打字也稍感费力。

[13:16](https://lib.pan.icu/3110c166-6a16-4a8c-a952-b7bea8a40022?t=796000)

### 微软的Visual Studio现在支持Objective-C开发了吗？

听众来信提到，微软在Build大会上展示Visual Studio集成Clang前端与微软C2后端，可直接用Objective‑C调用Windows API，生成Windows Universal原生代码，而非iOS二进制。微软实现了部分iOS API（如UIKit、Core Animation），目标是方便开发者将iOS应用移植到Windows平台，并非替代Xcode。

[8:06](https://lib.pan.icu/3110c166-6a16-4a8c-a952-b7bea8a40022?t=486000)

## Key moments

- **[0:00] 开场**
- **[1:58] 读者来信**
  - [2:13] 听众萤火回忆童年误删Windows系统DLL文件导致无法开机，最终通过重装系统修复
  - [6:20] 马来西亚听众李先生解释微软Visual Studio编译Objective-C是生成Windows通用二进制，非提交iOS应用
  - [12:29] 听众Y.PolyDiary分析机械键盘弹簧压力曲线线性导致长时间按压比薄膜键盘更费力
  - [16:05] 吴涛回应机械键盘手感：Cherry轴压力曲线各异，部分有触发点，打游戏推荐薄膜键盘耐虐
- **[22:11] 科技新闻**
  - [22:11] Google I/O亮点：Android Studio 1.3支持NDK C++开发，并推出物联网系统Brillo及通信层Weave
  - [24:39] 吴涛对比电影《回到未来》2015年幻想与现实：飞车和聚变能源未实现，智能家居尚未普及
  - [26:43] 吴涛引用科技界名言：‘四十年前想要飞车，如今只得到140个字符’
- **[30:46] 编程语言**
  - [30:46] 吴涛开启编码话题：解释encoding与coding区别，强调编码是程序员无法回避的基础
  - [32:38] Daily WTF编码笑话：因系统无法显示ö字符，寄件人在包裹单上手绘方块
  - [40:06] 吴涛用钢琴比喻CPU指令：按键为1未按为0，各键状态组成一系列二进制指令
  - [42:12] 古早计算机CosMac Elf编程如手工打孔纸带，通过拨动面板开关输入二进制指令
  - [44:54] 汇编语言用助记符如ADD X,Y代替二进制数字，提高可读性但仍与芯片相关
  - [46:25] 因汇编跨芯片移植困难，高级语言封装底层细节，如Python最终转为虚拟CPU的二进制指令执行
- **[49:37] 文字编码**
  - [51:53] 西欧语言利用ASCII第八位扩展127个码点表示变音字符，日本加入假名，汉字需双字节
  - [53:17] Unicode统一汉字码点，‘甲’字在UTF-8编码下转为三字节二进制11001111001010010110010
- **[56:40] 找女友**
  - [57:07] 吴涛给出程序员找女友终极答案：抛开‘我是程序员’的身份认同，学会理解人际沟通的弦外之音

## Speakers

- **吴涛** (host)

## Topics

字符编码, 编程语言

## Mentioned

Apple (company), Google (company), JetBrains (company), Microsoft (company), ASCII (product), Android Studio (product), AppCode (product), Brillo (product), CLine (product), Code (product), CosMac Elf (product), DOS (product), NDK (product), OS X (product), UTF-8 (product), Unicode (product), Visual Studio (product), Weave (product), Xcode (product), iOS (product)

## Transcript

### 开场

**吴涛** [0:00]
您正在收听的是 IPN Podcast 网络旗下的 IT 技术主题节目 《 内核恐慌 》。 我们号称 "Hardcore"，但是也没有干货 ， 想听的人听 ，不想听的人就别听 。

内核恐慌的网址是 kernelpanic.fm， 我们推荐大家使用泛用型 Podcast 客户端订阅我们的节目 。 如果您不知道什么是客户端 ， 请访问 ipn.li/faq。

欢迎您为我们的节目捐款 ， 捐款地址是 ipn.li/kernelpanic/donate。 捐款金额随意 ， 捐款不会为你带来什么 ，不捐也不会让你失去什么 。OK， 呃 ， 今天是我们的第 18 期节目 ， 呃 ，不过 Rao 因为非常忙 ，不能参加本期节目的录音了 。

呃 ，不过他一定会参加明天的 IT 公论录音 ， 所以各位 ， 呃 ， 尤其是会员们 ， 可以松一口气 。 呃 ， 另外， 单纯因为迷恋 Rao 的 ， 呃 ，Rao 的声音的朋友 ， 听到这里其实就可以转台了 ，因为 ， 呃 ， 必须说有台的节目更好听 ， 呃 ， 尤其推荐上一期 《 太一来了 》， 主题是情趣用品 ， 呃 ， 请在家长缺席下收听 。

所以仍旧坚守着 《 内核恐慌 》 的朋友们 ， 你们好 。 本期没有 Rao，但是也没有嘉宾 ， 只有我一个人在这边孤独地坚守着阵地 。

呃 ， 当然这是听起来的错觉 ，因为实际情况是我的女朋友此刻正坐在旁边为我端茶倒水 ， 扇风吹背 。

嗯 ， 所以本期的主题就是 ： 程序员怎么样才能找到一个女朋友 。

但是在进入主题之前 ， 我们先来念几封读者来信 。

### 读者来信

**吴涛** [1:58]
首先是一位叫做萤火的朋友 ， 呃 ， 她说第 17 期的后面提到 ， 呃 ， 吴涛说不知道 DLL 的图标是什么意思 ， 所以不知道可不可以删 。

呃 ，而我小时候呢 ， 试过将系统的 DLL 文件删除了 。 那个时候我玩表哥家的电脑 ，他们出去了 ， 剩我一个人在玩合金弹头 。

玩了一会儿觉得无聊 ， 就用鼠标乱点 ， 黄黄绿绿的图标可以点开 ，有齿轮的图标都点不开 。 我就理所当然地认为点不开是没有用的 ， 没有用的就应该被删掉 。

所以我将所有能看到的点不开的文件都删除了 。 后来要吃饭就心满意足地关了机 。 到晚上表哥回来 ， 发现电脑启动不了 。

我以为弄烂的电脑很害怕 ，因为那个时候电脑比电视机和摩托车都贵 ， 赔不起 。 后来表哥打电话叫了个同学过来 ， 那个同学在一个黑乎乎的窗口里面打字 ， 折腾了半个钟头 ， 电脑就重新可以用了 。

小小的我觉得那个人是大大的高手 。 很久以后我才醒悟过来 ， 那个时候删掉的文件是 DLL， 那个高手所做的叫做重装系统 。

完了 。 唉 ， 这让我想起 DOS 时代 ， 呃 ， 好像没有这样的疑惑 ，因为 DOS 时代 。 而如果你不区分可执行文件和不可执行文件的话 ， 呃 ，是很难知道哪个文件有用 ， 哪个文件没有用的 。

呃 ， 你只能看扩展名 ，而如果你不懂扩展名的意义的话 ， 你是不会莫名其妙就删它的 。 呃 ， 这可能这也是另外一个命令行比较安全的因素吧 。

或者说早期的图形化界面没有默认 。 用户有可能不知道自己在干什么 。 呃 ， 现在的操作性都做得很好了 ， 把比较容易弄坏的部分都隐藏了起来 。

呃 ， 这也让我想起 DOS 时代重装系统好像只需要格式化一下系统盘就可以了 。 好像一条命令吧 ，sys 还是什么 ， 还是斜杠 sys， 就可以把 DOS 传播到一个 ， 呃 ， 软盘或者硬盘上， 让它变成可可以 boot 的 。

对 ， 如果各位 90 后听众没有经历过那个时代的话 ， 那个时代的重装系统没有光盘可以用 ， 当然更可能有网络可以用 。

就是基本上就是你有 10 张软盘 ， 甚至更多 。 我现在已经不记得那个时候第一版 Windows 3.2 或者是 ， 我相信 Windows 95 都出过软盘吧 。

对 ， 你要把一张一张软盘依次插入 ， 呃 ， 软盘驱动器 ， 天哪 ， 软盘驱动器 ， 我有多久没说过这个词了 。

然后， 呃 ， 每张软盘可能能装个 10%、5% 左右 。 然后你要耐心地在那坐着 ， 一张一张手动地去换软盘 ， 哪像现在 。

科技昌明 ， 只需要写一个文本文件告诉电脑你需要一台什么样的虚拟机 ， 电脑很快就可以在一瞬间帮你竖起来一台具有完整的操作系统和程序开发环境的虚拟机 。

哎呦 ， 真是老了 。 呃 ，不过其实我从很小的时候就建立起一个信念 ： 只要你不去拆机箱 ， 电脑就是弄不坏 。

嗯 ， 我不知道现在学编程的朋友们是不是还有这个疑惑 ， 就是有时候会很担心把电脑弄坏 。

但 ， 呃 ， 实际情况就是 ， 只要你好好做备份 ， 呃 ， 数据别弄丢 ， 呃 ， 操作系统本身基本上是非常耐操的 。

哪怕你删掉所有的 DLL， 且不论你现在你是否能够安全地删除一堆 DLL，而不被电脑发现 ， 或者被电脑补救回来 。

呃 ， 即便你删掉了 ， 电脑也是永远可以恢复的 ， 只要你不拆机箱 。OK， 接下来念下一封读者来信 。

呃 ， 一位叫做陶弃红的朋友说 ， 第 17 期提到飞机重启的时候 ， 要是听到的 ， 呃 ， 提示音是 " 小霸王骑了无穷啊 "， 那才是整个人不好 。

哈哈哈 。 来自马来西亚的听众李先生写了一封读者来信说 ， 呃 ， 您们说了在 Windows 平台上现在可以开发 Objective-C 的事情 。

虽然我还没有用过微软这款新的开发工具 ，但是我是这样理解的 ： 微软的 Visual Studio 是主要让您编译 Objective-C 的源代码 ，但并不会生成 iOS、OS X 平台上的 Binary Code，而是生成 Windows 平台的 Universal Binary Code。

所以并不存在你们所说的 ， 呃 ， 如何在 Windows 上提交 iOS App 到 App Store 的问题 ，因为微软并没有想要以 Visual Studio 取代 Xcode 的想法 。

呃 ， 括号插个话题 ， 吴涛还是 Rao 有提到说 Xcode 的 Alternative 开发工具 ， 那应该是 JetBrains 的 AppCode 吧 。 呃 ，不过这款工具是用你们讨厌的 Java 所开发的 。

笑脸 ， 括号完毕 。 嗯 ， 这插一句就是 ， 后来我也我也想起来了那个 JetBrains 的 AppCode。 呃 ， 对 ，JetBrains 的 AppCode 是用 Java 开发的 ，不过这并不妨碍它是一款优秀的 IDE。

嗯 ，Java 是可以做出好东西的 ， 这个我从来没有否认过 ，但是只是你用 Java 做东西的过程比较蛋疼 ， 取决于你是比较注重结果还是比较注重过程啊 。

我觉得过程还是挺重要的 。 嗯 ，anyway， 回到这个李先生的来信 。 呃 ，他接着说微软主要想要借此新版的 Visual Studio 来让许多只为 Apple 开发软件的开发者提供一个快速从 iOS 移植到 Windows 的工具 。

我认为这是一个比较聪明的手段来拉拢 iOS 和 Android 开发者 。 呃 ，Apple 早期在推出 OS X 的时候也用过这一招 ，他们当时使用 Rosetta 来 ， 呃 ， 这位朋友这边可能写错了 ， 我记得那个东西叫做 Rosetta， 就是罗塞塔石碑的那个词 。

呃 ， 来帮助开发者过渡从 OS 9 到 ， 呃 ， 过渡到 OS X， 同时也在 Xcode 里面提供了多语言的编译 ， 比如 Objective-C，C 和 C++。

呃 ， 来以这种方式让 Adobe 或者是微软这些用 C 或者 C++ 的 ， 呃 ， 开发软件的公司也可以顺利地将 Photoshop、Office 等旗舰级别的软件顺利移植到 OS X。

嗯 ， 如果您有兴趣知道详情 ，以下的视频是 Visual Studio Compiler team 在 Build 大会上的展示 ， 请从 27 分 20 秒开始看 。 然后他给了一个 channel 9 的 link， 这个 link 我们会贴在 shownotes 里面 。

我会贴在 shownotes 里面 ， 我怎么停不了说我们呢 。 哎呀 ， 好孤单啊 。 这里简述视频里的一些重点 。 嗯 ， 编辑器采用 CLang，也就是 C、C++、Objective-C 的编辑器的 frontend， 和 C2，也就是微软编辑器的 backend。

呃 ，在 Visual Studio 里面可以使用 Objective-C 直接调用 Windows API。 嗯哼 。 呃 ， 然后编译后的代码并不是在 emulator 上运行的 ，而是 Windows Universal 的原生代码 。

微软实现了 iOS 上的一部分 API，他们称之为 subset of iOS API。 计划实现的 API 包括 OpenGL、OpenAL、Sensor、UIKit、Cora Animation 等等。 最后视频里面有个小花絮 ， 当台上的微软产品经理问台下有多少人在为 Apple 开发产品的时候 ， 台下来了一半人举手 。

哈哈哈 。 好 ， 非常感谢这位李先生的来信啊 。 嗯 ， 干活相当多 。 呃 ，他提到了这个 Apple 早期在推出 OS X 的时候使用 Rosetta 来帮助开发者从 OS 9 过渡到 OS X。

呃 ， 我记得那个时候给 Apple 开发程序是要用 ， 嗯 ， 除了 Xcode 还有一个东西叫什么 ，Code Warrior， 好像是 Boland 公司出的吧 。

我好像又信口开河了 ， 就是没有做调查就是这样 。 呃 ， 如果 Code Warrior 不是 Boland 做的话 ， 那是谁做的 ？

这不重要 。 总之那个时候为 OS 9 开发程序是要用到 C， 那个时候还没有 Objective-C 嘛 。 天哪 ， 那是一个多么洪荒的时代 。

呃 ，不过那个时候好像也是可以用 Java 为 OS 9 开发程序的吧 ？ 我没有记错的话 。 我还是比较年轻的 ， 没有经历过那个时代 。

如果我们听众里面有经历过那个时代的话 ，也就是怎样为 OS 9 或者是 OS， 乃至 OS 8， 呃 ， 开发程序的听众的话 ，也欢迎你来信提供一下， 呃 ， 这个经验 。

就那个时代的 ， 呃 ， 苹果电脑是怎样开发程序的 。 因为

， 虽然目前我们都是已经皈依苹果教的铁杆儿果粉 ，但是早期我们开发程序的经历就真的只有 Windows 乃至 Linux。

嗯 ， 好像我跟 Rao 都没有做过 OS 9 时代的 。 至少是给图形界面编程的经历 。 对 ， 欢迎各位提供宝贵经验 。

然后他提到说 ，在 Visual Studio 里面可以直接以 Objective-C 调用 Windows API， 这个听起来非常的不太齐 。 就是所以言下之意就是我可以用 Objective-C 在 Windows 上面写 Windows 程序了 。

嗯 ，有意思 。 谁能想到今天呢 。 呃 ， 接下来是一位叫做 Y.PolyDiary 的朋友 ， 朋友给我们寄来的 ， 呃 ， 听众来信 。他说 Rao 吴涛你们好 ， 呃 ， 还是给两位发个邮件吧 ， 之前总是在微博留言 ， 担心写信会写得太长 ， 浪费两位的时间 。

关于 V2 的问题我就不多说了 ， 两位只是偶尔谈到 ，并没有把它当做一个正式的题目来讲 ，而我也是仅仅怀有热情 ，并不是相关项目的参与者 。

所以我今天的反馈是关于很早的一期 ， 呃 ， 关于机械键盘的 。 呃 ， 那是我们的第二期吧 ， 好像迄今也是 ， 呃 ， 人气最高的一期 。

当然我相信慕瑶和肖集锦的那两期早晚会超过这一期 ，不过目前来看 ， 键盘这一期的下载量是非常高 。

呃 ， 我是从那一期开始才知道机械键盘是怎么回事 ， 然后就多了解了一些 。 但是有一个很大的遗憾就是 ， 没有人谈到机械键盘压力克数的问题 ，而我觉得这是一个很大的问题 。

我的意思是 ， 没有把机械键盘的压力曲线和薄膜键盘的压力曲线进行计算比较 。 这个问题重要吗 ？

我觉得很重要 ， 请看后面 。 嗯 ， 我这里就不画图了 ， 简单地说一下就是 ， 机械键盘的弹力结构是弹簧 ， 暂时没有见到其他结构 。

弹簧的压力曲线是从小到大 ，而且压力曲线基本上是平直的 。 这就导致了一个问题 ， 就是按压的过程中要不断地施加压力 ，而薄膜键盘的弹力结构是橡胶板 ， 这种结构初始压力比较大 ，但是一旦突破之后就很轻松了 。

实际表现出来的结果就是 ， 机械键盘要保持按压状态需要一直用力按住 。 呃 ， 这里先不谈各种轴和差异影响 ，而薄膜键盘一旦按下之后就很容易保持按压的状态 ，不需要很大的力 。

还有就是 ， 每次按压所需要付出的力 ， 机械键盘也要比薄膜键盘大 。 关于力的多少可以通过计算压力曲线获得 ， 我没有专业的工具没法测量计算 ，但是参考对工件势能的计算方式 ， 可以知道压力曲线越平直收集的能量就越大 。

呃 ，其实我能想到这个问题是因为我对工件感兴趣 ， 之前看过一些研究资料 ， 比如反曲弓为什么效能更高 。

当然为了验证我的猜想 ， 我专门订了一个机械键盘试用一下 。 呃 ， 我只是为了体验一下就退货 ，有点不道德 。

我试用的是茶轴 ，因为听说你们听你们说茶轴比较轻 。 体验的结果就是 ，在 Counter Strike 这种需要长时间按住几个键的游戏里面非常的累 ， 打字的话也比也感觉要比我用的薄膜键盘要累一点 。

机械键盘的初始压力很小 ， 给人一个很轻的错觉 ，但是实际上通过前面的计算就知道 ， 每次按压需要的力实际上很大 。

这也许从理论上说明了机械键盘不适合长时间操作 。 呃 ， 当然我只是想说明压力曲线这一个问题 ，不涉及对机械键盘优劣的评论 。

好吧 ，其实有点担心让喜欢机械键盘的两位大神反感 。 另外， 我个人因为身体原因对轻重比较敏感 ， 所以我的手 ， 呃 ， 所以我的感受可能不代表大多数人。

我一直用的是明基海贝键盘 ，是薄膜键盘 ，但是支撑组件是笔记本的 X 形结构 ， 手感介于笔记本和普通电脑之间 。

这是我用的第二个键盘 。 呃 ，不好意思 ， 这一期又写长了 ， 好不容易找到一个自己能谈的话题 。OK， 这位听众的来信就念完了 。

呃 ， 怎么说呢 ， 就是 ， 呃 ， 首先前面他说 ， 呃 ， 机械键盘压力克数的问题 。 呃 ，他认为机械键盘的弹力结构是弹簧 ， 呃 ，而弹簧的压力曲线是线性的 。

呃 ， 按压过程中需要不断地施加压力等等。 呃 ， 这个怎么说呢 ， 就是压力曲线每一个轴 ， 就如果你用 CHERRY 的轴来判断的话 ， 每个轴其实不一样的 。

有些轴是 ， 呃 ， 的确是线性的 ，但是另外一些轴是你按到一半的时候它会有一个触发点 ， 你只要把键按到这个触发点之后， 呃 ， 就可以松开 。

就就这位朋友提到一个应用场景就是 Counter Strike。其实我个人觉得打 Counter Strike 的话 ， 还是用薄膜键盘比较好 。

原因倒不是薄膜键盘响应比较好 ，而是因为怎么说呢 ， 就薄膜键盘比较比较便宜吧 。 就是你打 Counter Strike 是非常对键盘非常凌虐的一种方式 。

嗯 ， 我个人还是会只会用机械键盘打字吧 。 我也不知道 ， 反正现在我大部分时候打这个 ， 比如说 ， 嗯 ， 暴雪的风暴英雄或者是 War Thunder， 就是一个二战的坦克仿真游戏的时候 ， 基本上都是在用笔记本的薄膜键盘在打 。

嗯 ， 手感这个东西是非常主观的一件事情 。 嗯 ，其实如果你单纯的从手感上来说的话 ， 机械键盘里面很多东西都是玄学 。

但是 ， 嗯 ， 打字比较累这个可能是可能的确是这样 。 有时候我现在也会觉得 ， 用机械键盘打字会稍微累一点 。

怎么说呢 ， 就是打字累的这么一点点可能跟你每天多走几步路的能量消耗都差不多 ， 基本上可以忽略不计的 。

各位想靠打字减肥的朋友们就可以醒醒了 。 呃 ， 最后一封读者来信 ， 一位来自叫做萧志博 ， 我不知道念对了没有 。

呃 ， 的博士先生 ， 对 ，他的 email 里面就是 Dr. 头衔 ， 这个跟德国很像啊 ， 德国人都喜欢把自己的 Dr. 头衔写出来 。

嗨 ， 两位主播好 ， 呃 ， 听了第 15 期的 Criminal Panic， 听众来信中有人讨论 Data Science， 我又坐不住了 。 之前我买了本书 The Data Science Handbook，是 Cora 的 Data Scientist William Chen 联合一众 Data Scientist 做了回馈大众的一件大好事 。

我觉得大家都可以买来看一下 。 虽然现在还没有看完 ，不过写的真的挺好的 。 对于想要入行 Data Science 已经在这个行业中的同学 ， 都会有所帮助 。

呃 ， 来信中的那位同学说 ， 现在 Azure 和

Amazon 这样的大公司把机器学习算法当成服务推出来了 ， 可以让大家不用编程就能用起来 ， 这的确是好事 。

不过说到自然语言处理 ，其实还是有很多很难的事情要做的 。 而其实这些很难的工作都是人可以轻而易举的做到了 。

比如说 ， 从一个句子里面准确的识别出日期和时间 ， 这个听起来非常简单 。 呃 ， 现有的 Stanford NLP，也就是斯坦福的自然语言处理技术 ， 用基于 Conditional Random Field 的实体命名算法也可以用 ，但是达到非常精确的效果还是有很长的路要走 。

再说另一个 ， 从数据集中让算法自动识别出变量的值 ，是连续型的还是离散型的都很难 。 剑桥大学的 Zobin Gaharmani 教授在 2014 年的 NIPS， 呃 ， 这是一个 Neural Information Processing System， 它是一个年会 ， 应该是对 ， 跟这个神经信息处理系统有关 。

呃 ， 这个这位教授在 2014 年的 NIPS 会议上面就这个问题发表了一篇论文 ， 然后顺便再推一下另外一个 Podcast Talking Machine， 呃 ， 网址是 http://www.talkingmachines.com， 然后其中一个主持人就是哈佛大学的 Ryan Proskote Adams 教授 。他利用他的关系几乎在每一期都请来了一听名字就让我心跳加速的嘉宾 。

不过 Adams 教授在节目里面的一个保留项目 ， 就是用人类可以听懂的非常简单的语言解释非常复杂的算法 ， 比如推荐系统里面的 Collaborative Filtering， 啊 ， 怎么翻译 ， 协同过滤 。

呃 ， 再比如非参数贝叶斯推断中的非常难的 Chinese Restaurant Process， 中餐馆过程 。 有意思 ， 我查了一下这个中餐馆过程是模拟一个有无限张圆桌 ， 每张圆桌能坐无限个人的中餐馆里面做客人的随机过程 。

呃 ， 为什么叫这个名字 ， 大概是在洋人眼里面只有中餐馆才会有圆桌吧 。 呃 ，以上是这位听众所推荐的 ， 应该是关于自然语言处理的一个 Podcast。

呃 ，有兴趣的听众们不妨去听听 。 呃 ， 最后他说 PS， 虽然吴涛说了不让再推荐嘉宾了 ，但是 please please， 能试着请一下 Cora 的 William Chen 吗 ？

我想如果是要做一期有关 Data Science 的话题 ， 呃 ， 请来这样一个 Data Scientist 才好才好吧 。 我也知道请一个陌生陌生人上节目还是挺难的 。Anyway, please keep up the good, please keep up the good work。

啊 ， 感谢这位听众 。 嗯 ， 对 ， 我们的确是想要请一位货真价实的 Data Scientist 来来聊 Data Science 的话题 。 不过 ， 呃 ， 目前还没有合适的人选 。

呃 ， 我记我去看一下这位 William Chen 是不是 ，是不是首先是不是一个适合接近的人吧 。 啊 ， 感谢这位听众 。

### 科技新闻

**吴涛** [22:11]
呃 ， 接下来我想要提到的一些新闻就是 ，其实有这有一条 ， 就是 Google I/O。 啊 ， 我不知道明天的 IT 工人会怎样聊这个话题 。

我我希望他们会聊这个话题吧 。 但是从开发者层面上来说 ， 这一次 Google I/O， 呃 ， 大会让我印象比较深的 ， 当然我没有完全看这个大会啊 ， 我只是事后去看了一下 summary。

呃 ，因为要上班 。 就这次 Google I/O 的在我看来的亮点就是 ， 首先是 Android 的 Studio IDE， 呃 ， 应该是 1.3 版吧 ， 呃 ， 增加了 NDK 的支持 ， 就是 Native Developer Kit。

就你可以在 ， 啊 ， 它应该是使用了 JetBrains 的 CLine 来支持 ， 呃 ， 用 C++ 写 Android App。其次就是 Google I/O 此次出现了一个专门为 Internet of Things， 呃 ， 所开发的操作系统 ， 叫做 Brillo。

名字有点奇怪 ，Brillo 就是一个 ， 怎么说呢 ， 是一个比较被 stripped down 的 Android 系统 ， 然后你可以把它装在一些智能家电上， 甚至都不一定是家电 ， 就是一些电器 ， 比如说电灯啊 ， 电扇啊之类的东西上面 ， 或者烟雾管器啊之类的 。

呃 ， 你在上面插一个芯片 ， 然后装上这个装置系统 ， 然后， 呃 ，automatically 这个东西就变成了一个智能家电 ， 你可以用你的 ， 呃 ，Android 设备去操纵它 。

然后， 呃 ， 配套推出的也就是这个

， 呃 ， 这种小芯片互相通信的一种 ， 啊 ， 怎么说呢 ，Communication Layer。 对 ， 应该叫做 Communication Layer， 就是一个通信层 。 它的名字叫做 WEA，也就是 W-E-A-V-E。

啊 ， 这让我想起那个 Google Wave， 就是那个已经正式胎死腹中， 呃 ， 理念超前 ， 害怕无比 ，但是最后， 对 ， 就这么默默的消失掉了 Google Wave。

我我我其实我希望 Brillo 和 Wave 可以早点推广开来 ，因为这样的话可能 ， 嗯 ， 智能家电会比较提前进入我们的生活 。

对 ， 我其实已经妄想过智能家电无处不在的场景了 。 嗯 ， 未来怎么还不到 。 有一部电影叫做 《 回到未来 》， 嗯 ，Back to the Future， 呃 ， 应该是拍摄于 85 年及之后的三部关于时空旅行的电影 。

呃 ，其中主角在 1985 年所前进 30 年去到了那个 2015 年， 也就是今年，incidentally， 啊 ， 的 10 月 15 号吧 ， 还是 20 号 ， 没记错的话 。

呃 ， 那一天离我们离我录节目的今天大概也只有 150 天左右 。 然后电影里面的那个 2015 年， 嗯 ，在有些地方是不如现在的 2015 年， 但是在很多其他地方是远远超越今天的科技水准的 。

就是智能家电就不说了 ， 就比如说它里面有个叫做 Mister Fusion 的能源装置 ， 可以装在车上， 然后你只需要往里面扔一些垃圾 ， 它就可以通过聚变来产生非常非常多的能量 。

这能量足以支持让一辆车产生 ， 呃 ， 时空旅行 。 然后还有一些非常神奇的其他的东西 ， 比如说 ， 嗯 ， 漂浮滑板 ， 对 ， 漂浮滑板这个东西在我们的 2015 年还是没有被实现出来 。

啊 ， 对 ， 最重要的一点是里面的车都是能飞的 。 我记得前一阵子在知乎上有个问题 ， 就是为什么 ， 为什么说我们在 40 年前想要的是飞车 ，而现在我们得到的只是 140 个字符 。

当然说这个话的人是 ， 没记错的话是 Tesla 的投资人之一吧 ，不是 Elon Musk 他自己 ，但是这个人也是一个科技界的推手人士了 。他说这些话的原因其实本质上是励志的 ，但是当然有些人把它当成一句吐槽来看 。

呃 ， 重点就是我们对于未来的想象很有可能是偏差非常大的 ，但是这并不应该妨碍我们去想象未来 。

对 ， 我就是希望智能家居可以早一天铺点 ， 呃 ， 铺开来 ， 呃 ， 应用 ， 让我们的今天能够在某种程度上 ，在比较方便方便的部分 ， 能够超越那个时候对于未来的想象 。

嗯

， 关于飞车这个东西 ， 我觉得就是我之前在知乎上看到这个问题的时候 ， 里面有人说 ， 呃 ， 里面有人通过各种例子来论证了为什么 140 个字符比飞车更重要 ， 说 ， 呃 ， 如果你可以更便捷的和离你很远的人通讯 ， 那你就不需要去到那个人身边了 。

如果你可以开 ， 呃 ，teleconference 的话 ， 那你就不需要亲自跑到那个地方去了 。 嗯 ， 所以有 140 个字符的便捷的交流方式其实是要比飞车重要的 。

我承认它有一定的道理啊 ，但是我总觉得如果飞车这个东西真的可以出现的话 ， 呃 ， 或者说一个比较 ， 我对飞车其实已经出现了 ， 就是 ， 呃 ， 现在已经有可以飞起来的汽车 ，但是最大的问题是这个这个汽车它首先它需要专门的跑道 ， 第二它 ， 呃 ， 飞的时候其实不是非常的灵活 ， 呃 ， 第三就是能耗非常高 。

当然如果有 Mister Fusion 出现的话 ， 能耗不是问题 ， 呃 ，但最大的问题是我们想要的飞车其实是像 Back to the Future 里面那样 ， 只需要把四个轮子朝下， 然后就可以直接悬浮起来的飞车 ， 或者像什么第五元素里面那种飞车 ， 那才是真正实用的飞车 ， 对吧 。

嗯 ， 这样的飞车解决了一个什么样的问题呢 ？ 就是你不再需要坐飞机了 ， 你不再需要坐 ， 呃 ， 越洋飞机了 ， 就是点对点的直线交通变得非常的简单 ， 单一模式化 。

就是 ， 呃 ， 比如说在 Back to the Future 里面 ，他们里面设想说整个美洲乃至于跨洲的这个航路 ， 就有点像 ， 呃 ， 高速公路一样 ，是已经预先画好了 。

比如说如果你想从中国到美国的话 ， 你只需要 ， 呃 ， 开上自己的飞车 ， 从自己家的门前出发 ， 然后飞到高速公路上， 然后就沿着 ， 我相信一定有什么导航技术 ， 就是你只要坐在车里面 ， 然后等这个车就会把你带到你在美国要去的那个地方的路旁 。

这是一个非常点对点的服务 ， 就是你不像现在我们需要先从家里面坐车到机场 ， 然后托运行李 ， 然后 check in， 然后过安检 ， 然后 blah blah blah， 跟几百个不知道是不是恐怖分子的人坐在一起 ， 然后把自己的生命交在机长手里 。

如果有飞车的话 ， 这一切都不需要了 ， 就我们可以单独的 ， 呃 ， 坐在属于自己这样一个一个封闭空间里面 ， 呃 ， 自己想带什么就带什么 ， 想带多少带多少 ， 只要你只要你能 。

如果有 ，again, 如果有 Mister Fusion 的话 ， 那能源不是问题 。 就这样的技术带给我们的自由度其实是要远远高于飞机或者是现有的任何交通工具 。

对 ， 所以我觉得飞车仍旧是一个非常重要值得梦想的事情 。 不过有生之年应该是看不到了 ， 我觉得 。

而且更不用提在 Back to the Future 里面 ， 呃 ， 主角其实不是主角 ， 就是未来 2015 年其实根本就没有不需要飞车 ，而是所谓的飞车改装服务 ， 就是你只需要装四个轮子就可以让自己的车飞起来 。

就永远不是像现在这样 ， 嗯 ， 你需要把整个汽车的构造都改了 。 嗯 ，OK，在进入主题之前呢 ， 为了填充节目时间 ， 我们先来讨论一下， 呃 ， 计算机的编码 。

这是一个压箱底的话题 ， 对 ， 就是为了专门应付今天这种 ， 嗯 ， 为了保证节目不断档 ，但是又有可能 ， 呃 ，有人缺席的情况准备的 。

### 编程语言

**吴涛** [30:59]
编码或者说 encoding 是一个非常常见的 ， 又非常复杂的概念 。 首先 ，encoding 和 coding 是不一样的 ， 就我们口语里面一般会用写写代码来指代写程序这件事情 ，但是有时候人们也会口误或者说无心的说编码来 ， 用编码这个词来指代写程序 。

但实际上编码在比较 ， 呃 ， 当你比较严格的区分自己的措辞的时候 ， 编码指的是 encoding。encoding 是一个非常常见的 ， 又非常复杂的概念 。

常见是因为每时每刻我们每时每刻都在接触 ， 尤其是如果要 coding 的话 ， 几乎完全是绕不开 encoding 的 。

尤其是如果你不是一个专职的程序员 ， 你可以不懂算法 ， 可以不懂数据结构 。 你你比如说你是一个搞 Web 的 ， 你可能 ，sorry， 我又黑 Web， 你是一个搞 Web 前端的 ， 呃 ， 你可能完全不需要去接触算法或者数据结构 ， 你照样可以活得很好 。

但是 encoding 这个问题你是不有没有可能绕开 。 如果如果你像回避算法和数据结构一样去回避 encoding，有很有可能会摔得很惨 。

呃 ，而即便是不写程序的人， 懂一些 encoding 也是一个也是一件非常有有有意义的事情 。 比如说我记得 ， 呃 ， 很久以前大概是 ， 天呐 ， 那个时候我还在读研究生 ， 呃 ， 那个时候有一个网站叫做 ， 啊 ， 现在也有那个网站 ， 叫做 Daily What the Fuck，Daily WTF， 当然它的官方名字叫做 Daily Worse Than Failure，但是我们都知道 WTF 是什么意思 。

然后在这个网站上面有这样一则 ， 当时应该是一堆图片新闻里面的一条 ， 我记得是有人拍了一个包裹单 ， 这个包裹单是贴在一个包裹上面的 ， 然后这个包裹是寄在寄给德国某个地址的 。

这个地址里面有一个有一个地方被寄件人， 呃 ， 画成了一个方块 ， 就是比如说有一个德国的地址叫做 GR 方块 ， 然后 blah blah，STR， 然后多少多少号 。

就是原因是什么呢 ？ 就是这个人他显然在显示这个德国的地址的时候没能正确的把 O 上面加两点 ， 就是 O umlaut 这个这个字母显示出来 。他的计算机系统就把那个地方显示成了一个方块 ， 然后他就非常忠诚的在那个地方画了一个方块 。

如果这位寄件人懂一点 encoding 的知识的话 ， 这样的这样的笑话就不会发生了 。 另一方面 ， 比如说 ， 呃 ，有时候各位在看网页的时候会发现网页上面有问号或者是 ， 嗯 ， 莫名其妙的一些符号 ， 我们会说这个时候有乱码了 。

那这个时候应该怎么解决呢 ？ 知道的人可能会去去 ， 嗯 ， 我忘了 Chrome 是在哪了 ，Chrome 好像是在 tools 里面 。 对 ， 你要去一个地方选择说这个网页是用什么样的 encoding 来 encoding 的 ， 来这个网页是用什么标准来 encoding 的 ， 你选对了那个标准 ， 然后你就可以看到正确准确无误的信息了 。

呃 ， 又比如以前我们玩一些很有意思的日文游戏的时候 ， 啊 ， 为什么在简体中文操作系统里面的人跑起来是乱码 。

对 ， 呃 ， 这一切的原因其实都是因为 encoding。 那为什么会有 encoding 的问题呢 ？ 答案是因为二进制 ，也就是所谓计算机是一个二进制的东西 ， 这句话我们多多少少都听过 。

但是就比如说 ， 呃 ， 我们都明白计算机在内部只懂得 0 和 1， 呃 ， 具体来说就是芯片上面有一个地方是高电平 ， 它就是 1， 低电平就是 0。

然后磁盘上面有一个地方 ， 比如说它的北磁极朝上就是 1， 呃 ， 北磁极朝下就是 0。 我不确定这个说法正不正确 ，是带磁是 1，不带磁是 0， 还是北磁极是 1， 南磁极是 0。

对 ， 啊 ， 欢迎大家指正 。 然后比如说光盘上面 ， 呃 ，有坑就是 1， 没坑就是 0， 诸如此类 。 然后， 嗯 ， 反过来平时使用电脑的时候 ， 你跟我却明明没有直接在跟 0 和 1 打交道 ，不是吗 ？

我们能 ， 比如说我们能看到文字 ， 呃 ， 我们能听到声音 ， 比如说各位现在在听的 podcast， 嗯 ， 我们能看到图片以及一些 ， 嗯 ， 高雅的小电影 ， 呃 ， 这些东西都不是 0 和 1，不是吗 ？

就是在我们的观感来说 ， 这些东西都是切切实实的一些模拟信号 ，不是 。 那么具体来讲那些 0 和 1 在哪呢 ？

呃 ， 这个就要扯到比较古早的历史 ， 才能让大家有一个比较清晰的认识 ， 乃至于包括程序本身其实也都是 0 和 1。

但是 ， 呃 ， 写过程序的各位都知道 ， 我们写程序的时候并不是直接写下 0 和 1。 呃 ，以下内容部分摘字我在知乎上的一个答案 ， 所以如果各位读过的话 ， 基本上就可以跳过了 ， 就可以直接拉到最后来听这个本期的主题 ， 就是程序员怎样泡到女朋友 。

啊 ， 用泡这个词是不太正确的 ， 就你首先要抛弃泡这个概念 。Anyway，在计算机还都是一些庞然大物的石器时代 ， 我们写程序是靠机器语言 ， 嗯 ， 虽然名字叫做机器语言 ，但实际上用到的只有两个数字而已 ， 就是 0 和 1。

呃 ， 当然前提是你不去考虑三进制计算机 。 对 ， 三进制计算机实际上是一个非常有意思的话题 ， 呃 ， 准确来说是平衡三进制计算机 。

就是 ， 嗯 ， 各位应该可以比较容易的想象什么是三进制 ， 就是纯粹的三进制 ， 就是只用 012 这三个数字 ， 呃 ，0 是 0，1 是 1，2 是 2，3 是 10， 对吧 。

那么什么是平衡三进制呢 ？ 平衡三进制是说用 10 和 -1 这三个数字来代表一切 ，其来代表一切数字 ， 来组合成为一切数字 。

呃 ，也就是说在每一个 ，在比如说在个位上是 0， 就是 0， 然后在个位上是 1， 就是 1，在个位上是 -1， 就是 -1。

那么 2 怎么表示呢 ？ 很有意思 ，因为 10 的话在三进 ，在平衡三进制里面是代表 ， 呃 ，3。 所以如果你要想要凑出一个 2 来的话 ， 你必须先在 ， 呃 ， 个位上面写上一个 -1，也就是三进制 ， 平衡三进制的 0 是 0，1 是 1，2 则是 1-1， 就是平衡三进制里面通常会把 -1 这个数字写成 t，也就是 2 会变成 1t。

呃 ， 写成 t 是因为负号 ， 如果你把负号放在 1 上面的话 ， 它就看起来像一个 t。 对 ， 这是一个 ， 这是一个非常特别 ，但是对于计算机来说比较好实现的一种一种进制方法 ， 就是 ， 呃 ， 如果你维持一个中等电位的话 ， 它是 0， 一个比较高的电位的话是 1， 然后一个比较低的电位的话是 -1。

平衡三进制有一些比较特别的 ， 呃 ， 数学特性 ， 比如说在平衡三进制里面 ，有时候一些数字的表示方法有两个 ， 比如说 1/2 可以表示为 0.11 无限循环 ， 或者是 1.-1 无限循环 。

然后有时候也会有一些比较特别的特性 ， 比如说在乘法的时候 ，有时候你会明明是两个多位数相乘 ， 最后你得出的结果的位数反而要比两个 ， 要比两原来你用来乘的两个数字的位数要短 。

呃 ， 对 ，但是三进制计算机最终是没有能乘 7 的 。 我相信如果 ， 呃 ， 三体人或者是比较正儿八经的科幻里面 ， 就 ， 呃 ，有一部科幻叫做 《 与拉玛相会 》， 如果各位没有看过的话 ， 非常欢迎去看一看 ， 要比三体不知道高到哪里去了 。

哈哈 ， 呃 ，也许三体人会使用三进制计算机了 。 呃 ，但是呢 ，在我们地球上面 ， 目前占主流的 ， 绝对主流的 ， 压倒性主流的是二进制计算机 。

所以 ， 嗯 ， 早期的写程序也就是使用特定的二进制的组合 ， 呃 ， 来给计算机下命令 ，因为一些特定的数字组合对于计算机来说有特定的意义 ， 会让计算机做出一些特定的动作 。

呃 ，其实我们甚至不应该叫这些二进制的数字数字 ，因为它们其实并不代表任何数量 ， 它们所代表的只是一种一种模式 。

对 ， 这是一个什么概念呢 ？ 嗯 ， 各位可以想象一台钢琴 ， 假设一台钢琴上所有的键都被拉平了 ， 就是它的黑键不是嵌在白键之间 ， 呃 ，而是就是很简单的 do re mi fa sol la si do， 加上中间所有的半音 ， 这样拉在一个直线上 。

啊 ， 我们可以这样描述怎样弹钢琴 ， 就是每次把按下去的钢琴记作 1， 呃 ， 没有按下去的钢琴键记作 0， 然后我们可以在每一个时刻得到一系列的 1 和 0。

呃 ， 这些 1 和 0 你可以把它换算成为一个十进制的数字 ，但是本质上它只是一种 ， 它只是代表这个按下钢琴的状态 。

我们在使用 CPU 的时候 ， 呃 ， 情况跟这个钢琴是类似的 ， 就是我们把一个 01010101 这样的指令输入一小块芯片的时候 ， 真实做的事情其实是在这个芯片上面的不同引脚上面输入高或者低的电压 ， 然后芯片里面会有 ， 呃 ， 很多坨这个小小的晶体管组成的小装置被我们按下了 。

然后这个组合呢 ， 会继而引发更多的由芯片工程师预先设计的一系列的连锁反应 ， 然后无数这样的模式数字一个接一个的被输入芯片里面 ， 最终你的屏幕上就会出现一些能够被人理解的图案 。

然后给计算机输入这种相当于命令的数字 ， 呃 ， 称作指令的东西 ， 让它来做一些事情 ， 啊 ， 包括但不限于处理其他那些数字 ，其实就是编程的本质活动 。

比如有一台古早的计算机叫做 CosMac Elf， 呃 ， 它的面板上有一排开关 ， 呃 ， 应该是有 8 个还是 10 个开关 ， 这些开关可以拨上或者拨下 。

那给这台计算机编程的方法就是把你想要输入的数字 ， 或者说把你想要按下的琴键 ， 啊 ，在这排开关上面搬好 ， 比如说搬上去就是上， 呃 ， 搬上去就是 1， 搬下去就是 0。

搬好一排之后， 你按一下右上角 ， 它有一个按钮 ， 呃 ， 你就可以输入下一条指令 。 对 ， 这就好像你在怎么说呢 ，有那种早期的打孔钢琴 ， 嗯 ， 你输入一条这个上面布满了小雅的纸带 ， 啊 ， 每一个眼都代表这个地方应该有个琴键被按下去 。

那给这台计算机编程的过程就有点像你在手工去攥一个纸带 ， 对 ， 或者是你在你在手工做一个八音盒 。

如果你看过八音盒是怎么工作的话 ， 你一定明白我是什么意思 。 问题在于就是你在这一台计算机上面输入一系列 0 和 1 和在那台计算机上面输入一系列 0 和 1， 你得到的反应可能是完全不一样的 。

呃 ， 这是从最开始就有一个差异的 ， 呃 ， 问题 。 对 ，因为各个各家计算机厂商会自己去研发自己的芯片 ， 呃 ， 同样那种数字对于不同型号的计算机来说 ，有可能是完全代表不同的指令的 。

而这一点直到今天都没有改变 。 嗯 ， 那些通过金属引脚受到 0 和 1 输入的 CPU， 所谓有这样一个指令集的概念 ， 啊 ， 本质上指令集其实就是由芯片制造厂商给出的数字组合的定义 。

对 ， 如果你去查什么 AMD 或者是 Intel 的手册的话 ， 啊 ， 你会发现他们的指令集里面会给出一组数字 ， 这组数字其实上其实就是真正的 CPU 所会接触到的那些高低电平组合 。

对 ， 嗯 ，由于芯片设计结构的不同 ， 每种芯片的指令集也就不同 。 比如常见于台式计算机的 Intel 芯片指令集 ， 就与常见于手持设备的 ARM 芯片的指令集不一样 。

嗯 ， 计算机语言在这个层面开始 ， 呃 ， 就已经产生了区别 。 不过用纯数字的计算机语言编程的难度可想而知 ， 所以从数字到助记符号的转译很快就随之出现了 。

啊 ， 我们把这个东西叫做汇编语言 ， 比如说 ， 呃 ， 一组数字 00100000 可以让芯片把内部的一个存储单位 ， 啊 ， 我们叫它存储器 ， 寄存器 X， 加上一个值 Y。

那么不妨就把这组数字和助记符 add 对应起来 ， 比如说上面的指令就可以写成 add X 逗号 Y， 这样一条条类似的指令写成一串 ， 就是一个对于程序的描述 ， 对吧 ？

呃 ， 相对于纯数字来说 ， 这也是一个质的飞跃 ，因为你终于不用去手动搬那个开关了 ，不是吗 ？ 然后这样的一串数 ， 这样的一串字符呢 ， 就是这些 add X Y 或者是 move， 呃 ，X Y 这样的字符串 ， 可以由专门的小程序来翻译成那些 0101 的二进制代码 ，也就是真正可以被输入处理器去按下那些晶体管的 ， 呃 ， 开关的电子信号 。

当然每种处理器的汇编语言终究是不一样的 。 嗯 ， 机器语言或者说汇编语言的优点是呢 ， 每一条指令几乎都对应于芯片能做的一件事情 ， 比如说有一条指令可以把一个数字从内存里面转到计算器里面 ， 呃 ， 另一条指令呢 ， 可以把这个被转入计算器的值加上 1， 呃 ， 第三条指令又把它放回内存去 。

嗯 ， 直接对一块芯片下命令效率非常高 ，但是对应的缺点就是 ， 如果你只是想要把一个数字加上 1 的话 ， 每次都要写三条指令 ， 时间一长是非常痛苦的一件事情 。

而且还有一个问题就是 ， 呃 ，因为不同的芯片所支持的指令集是不一样的 ， 呃 ，也就意味着你在这一块芯片上需要三条指令能完成的事情 ，在另外一块芯片上可能需要五条指令 。

呃 ， 所以如果我们能够将一部分固定出现的操作像连续记一样一次性释放 ， 每次只需要打一个指令 ， 却能够在不同结构的芯片上都做同样的事情 ， 该有多好呢 ？

换句话说 ， 如果能有一种更倾向于描述那些需要解决的问题 ， 比如说给一个数字加上 1，而不是手把手的告诉计算机说 ， 呃 ， 你读一个数字 ， 加上一个数字 ， 再写一个数字 ，有这样一种比较高级的语言来封装这些比较不需要我们去操心的细节 ， 呃 ， 该有多好啊 ？

对吧 ？ 然后所谓的高级语言 ，也就是各位学编程的时候学到的那种语言 ， 就是做这件事情 。 比如说最古老的高级语言有 Fortune，有 Algo、Cobol， 呃 ， 乃至于比较同样古老但是来源迥异的 Lisp， 啊 ， 我觉得我们应该专门找一期来说 Lisp。

所有这些语言呢 ， 它们都会最终被转化为二进制的形式 ， 呃 ， 包括现在大家比较喜欢的动态语言 ， 比如说 ， 呃 ，Python 啊 ，Ruby 啊 ，Lua 啊 ， 它们归根结底都是会被转化为二进制代码输入到 CPU 执行 。

它们和这个比较低端的或者说比较原始的语言 ， 比如说 C 或者是 Fortune 的区别就在于它们 ， 呃 ， 单一一条指令里面所包括所涵盖的那些二进制指令要多很多 。

呃 ， 然后它们完成这件这个特点的手段就是 ， 它们的底层其实又是利用你的实体 CPU 去模拟一个 ， 呃 ， 只在逻辑意义上存在的虚拟的 CPU。

呃 ， 对 ， 这个就不展开讲了 ， 就 。 有兴趣的同学可以自己去找一些 ， 呃 ， 这个方面的书看 。 啊 ， 我会推荐一本 Code， 我相信之前我已经 Code 过了 ， 我已经推荐过了 ，sorry， 呃 ， 可能是在某一期的 IT 工作日上面 ， 我说这本书是奇书 ， 推荐大家去看一看 。

嗯 ，以上大概讲了这个编程语言是怎么样

利用 0 和 1， 或者说编程语言是怎样转化为 0 和 1 的 ，但是真正就没有解释我们一开始提出那个问题 ， 就是 ， 呃 ， 我们看到的图像 ， 看到的文字是怎样转化为 0 和 1 的 。

### 文字编码

**吴涛** [49:37]
嗯 ，其实道理是类似的 ， 就是我们约定说在计算机里面某一些特定的 0 和 1 的组合代表一个特定的数字 ， 或者代表一个特定的字符 ， 或者代表一个特定的图像 。

呃 ，以我们最常见的 ASCII 码 ，也就是国家美国国家标准局的代码 ASCII 代码来看的话 ， 它的方法是挑出一个 7 位的 ， 注意是 7 位的二进制数字 ， 把它第一位标成 1， 呃 ， 最后一位标成 1，也就是 1000001， 这样一个数字 ， 让它来代表大写字母 A。

对 ， 然后这个数字被转化成十进制就是 65， 然后 65 就代表 A。 所以如果你从十进制的角度去看这个数字的话 ， 你会觉得很奇怪 ， 为什么要用 65 来代表 A 呢 ？

但是当你把 65 转化成一个 7 位的二进制数字的时候 ， 呃 ， 就会发现它其实是一个相对来说比较有规律的码点 ， 比较有意义的码点 。

对 ， 所以码点就是 ， 呃 ， 一个字符相对应于它的

二进制数字所在的位置 ， 叫做码点 。 那么在 65 这个码点上面是 A， 那么符合逻辑的方式就是把 B 放在 66 上， 然后依次类推 ， 对吧 ？

啊 ， 大写完了 ， 大写字母完了之后是一堆标点符号 ， 然后是小写字母 。 那 ， 呃 ，有一个问题就是

，7 位的二进制数字可以表示 120 个 ， 啊 ，127 个字符 ， 啊 ， 对于英语来说是够了 ， 甚至可以表示大写小写 ， 呃 ， 加上数字等等。

那么为什么要选用 7 位这个数字 ？ 也是因为 ， 呃 ， 如果你把第八第八位也用上的话 ， 就可以让其他人去定义一些比较 ， 啊 ， 额外的东西 ， 比如说西欧语言会用到用到各种各样的 diatric， 呃 ， 就是在字母上面加点啊 ， 打撇啊等等诸如此类非常愚蠢的事情 。

嗯 ， 那么它们所使用的方法就是 ， 呃 ， 把这个 7 位数字扩展到 8 位 ， 或者说利用这个 ASCII 编码标准刻意将第八位永远设为 0 的特点 ， 呃 ， 规定了当第八位变成 1 的时候 ， 多出来的那 127 个码点应该具体代表什么 。

那么在这个标准上， 呃 ， 西欧多了很多自己的字符标准 ， 啊 ， 每个国家都不一样 。 然后我记得 CGK 也是 ， 呃 ，sorry，在日本也是 ， 呃 ，他们利用这多出来的 127 个码点加入了平假名 、 片假名等等。

嗯 ， 所以有了日本的一套自己的规则 。 当然那个时候这个编码只能表示假名。 但是 ， 呃 ， 我们都知道这个汉字的数量繁多 ， 呃 ，256 个显然是不够用的 。

那早期的一个解决方案就是用两个二进制的八位数来代表一个汉字 ， 呃 ， 所以你就有 256 乘 256 个 ， 啊 ，256 乘 256 种可能性 。

那问题在于由于政治原因 ， 呃 ， 早期的中国 、 台湾和香港对于汉字的编码规定是不一样的 。 呃 ， 日本还有一套自己的体系 ，不过好在后来出现了一种叫做 Unicode 的东西 。

啊 ，Unicode 首先它规定了一个序列 ，在这个序列里面就是一一一 ， 怎么说呢 ， 就是一系列的码点 ，在每个码点上规定了这个码点对应哪个汉字 ， 呃 ，不管这个汉字是采用什么样的字形 ， 呃 ， 来自于哪个国家

， 呃 ， 全都会归在这个 Unicode 的序列里面 。 然后 Unicode 指定了一个编码的方法 ，也就是在某一个特定码点上的汉字 ， 比如说 ， 呃 ，30002 码点上面的汉字是甲乙丙的甲 ， 呃 ， 它规定说当你把这个甲字以二进制形式表示的时候 ， 呃 ， 你有很多种选择 。

最常见的一种选择我们现在叫做 UTF-8，UTF-8， 呃 ，在 UTF-8 的表示之下， 位于码点 30002 的甲这个字会被转化为有点长 ， 是一个 3 乘 8 位的二进制数字 ，是 11001111001010010110010。

我我是我是这个世界上唯一一个把甲的汉字转化为语音形式的二进制代码的人吧 ， 太搞笑了 。Anyway， 呃 ， 本质上来讲 ， 或者说对于计算机来讲 ， 呃 ， 你告诉它 1000001 也好 ， 还是你告诉它我刚才说的是 24 个 ， 呃 ， 二进制的数字也好 ，在它看来都是一样的 。

但是对于人类来说 ，其解读方式是不一样的 。 那么无论音频文件还是视频文件 ， 啊 ， 归根结底基本上都可以这样类推 ， 只不过里面还包含了更多其他的因素 ， 比如说 ， 呃 ， 你可以把一个点上面的颜色 ， 嗯 ， 划分为红 、 绿 、 蓝三个分量 ， 然后每个分量用一个 0 到 256 的数字表示 ， 啊 ，0 到 255 的数字表示 。

那么你就可以规定每个 ， 你就可以得到每个点上的学生要的 RGB 的值 。 但是如果你要记载每一 ， 呃 ， 如果你要记载一部电影里面的每一帧的每一个点上的这个数字 ，其代价会是非常高昂的 。

呃 ，因为我们目前的科技手段还没有办法保证说能够完全不去考虑 ， 嗯 ， 存储或者说传输过程之中的空间乃至于时间的损耗 。

所以人们又想出了另外一个方法就是 ， 呃 ， 找出所有这些数字里面的重复部分 ， 用一个更短的数字去代替 。

对 ， 这就是压缩的本质 。 所以我们可以把它理解为对于编码的再编码 ， 这就是一层另外一层 encoding。

嗯 ， 对 ，其实这期的提纲里面还述了一些其他话题 ， 包括 Unicode 本来都是打算再展开讲的 ， 呃 ， 还有很多历史之类的 。

但是目前的状况是 ， 呃 ， 我这边录音的时间刚刚突破了一个小时的 mark， 当然最后剪出来可能没有一个小时 ，不过此时的我已经觉得嗓子非常疼了 ，而且 ， 呃 ， 很不幸过敏性鼻炎又开始犯了 ， 所以这一期只能 ， 啊 ，wait a second， 我们还没有进入正题是吧 ？OK， 那我们来赶紧进入一下正题好了 。

### 找女友

**吴涛** [57:07]
正题就是程序员怎样才能找到女朋友呢 ？ 问号 。 答案很简单 ， 就是除非你的女朋友候选人就是 How 这一口 ， 那么单纯以程序员的身份对于找到女朋友来说没有任何意义 。True story， 只有抛开我是程序员这一个自我认同之后， 找女朋友才会变得比较容易 。

呃 ， 比如你要弄明白人和人之间沟通的编码 ， 这个编码体系 ， 呃 ， 一方面要比计算机系统我们刚才所说的这些编码简单得多 ， 呃 ， 另一方面又比它复杂得多 。

你要去学会理解不同性别之间的心理差异 ，不管这种差异是怎么来的 ， 你都必须了解它 。 呃 ， 你要去了解什么是弦外之音 ， 你要弄明白女孩子说话有时候是话里有话的 ， 对吧 ？

我女朋友在点头 。 好吧 ， 呃 ， 您正在您刚刚收听完的是 ITM Podcast 网络旗下的 IT 技术主节目 《 内核恐慌 》。

啊 ，也欢迎你收听 ITM 旗下的其他六档 Podcast， 包括 ， 呃 ， 同样是技术主题节目 《IT 公问 》， 啊 ， 医疗主题节目 《 太医来了 》， 美食主题节目 《 未知道 》， 艺术主题节目 《 流星通信 》， 无主题节目 《 无次元 》， 故事主题节目 《Hi Story》，以及 ， 呃 ， 影像主题节目 《 硬影像 》。

感谢大家的收听 。 哎 。

---

本节目库由 PodHood（https://podhood.com）提供支持——播客网站平台。
