这是系列文章第三篇。
对于计算机的第一印象
大家还记得小时候第一次接触小霸王或者游戏机是什么感受?
我小时候非常沉迷于此,坦克大战啊,魂斗罗啊之类的,都是人生美妙的体验。
我从小就用小霸王学习机、计算机去学习(笑)。其实是玩游戏。玩这些游戏的时候会觉得不可思议。但这个时候其实是迷惑的,
信息——消除不确定性
莫尔斯码
我们想一个场景。10岁的时候,你朋友住在隔壁楼。深夜了,你还想和他聊天交流。假使当时没手机、没电话、没电脑。怎么办?这时你拿出一个手电筒。
你通过手电筒的长亮、短亮,表达你的想法。你们会约定一些长亮、短亮的组合,以及它们背后所指代的关系。
这套方法,也有人实现了,它就是著名的“莫尔斯码”。它的两个要素,一个是“点、划”,另一个是“映射表”。
我们再考虑一个问题,点划的数目,能表示多少信息。
1个bit的信息量,就是1个空格上,1个点或1个划的选择。是在2种可能中选择确定的一个。
2个bit的信息量,是在4种可能中选择确定的一个。
……
10个bit的信息量,是在1024中可能中选择确定的一个。
通过莫尔斯码,我们很好地理解了1bit信息能表达的内容。
布莱叶盲文
我们再看另一个例子。以下是布莱叶盲文,用6六个或轻或重的点来表示。
那么”you and me“的表示:
但是感觉比较低效是不是。所以,有了二级布莱叶盲文,当码字单独出现时,就不是表达一个字母,而是一个单词。这也是一种“约定”。
那么"you and me”可进一步简化地表示为:
一个6位的布莱叶盲文可以表示多少不同的码字?参考上节莫尔斯码,不难想到是2^6=64。
当然,还有没用到的编码,也不要去浪费。于是针对“高频”的字幕组合,有以下表达。这也是一种“空间换时间的思想”。
于是"about”表示为:
结束了吗?其实还有一些优化,比如我们仍然没用全64种信息。不过对于理解已经够了。
这是我们学的第二套编码,通过6bit的信息,灵活组合,可以表达所有内容。
计算机中用的编码
- 英文ASCII码,8位,实际使用7位,2^7=128种字符
- 汉字GBK,16位,实际使用15位
- UNICODE、UTF-16、UTF-8,将全世界的文字收录
- 等等
所有这些编码,都是对信息的不同表达。各自的目标不同,解决的问题背景不同,就出现了不同的编码。我们看到的一些趋势是,后一代的编码总会在前一代的基础上做一些改进,或是能表达的信息更广了,或是用更精简的方式表达更多的内容。这也是解决问题范式,所有产品都是解决了某个问题,慢慢演化来的。世上没有初诞生就最好的设计,也无需。有的是不断出现的新问题,和不断出现的解决方案。
小结
本篇内容来自《编码:隐匿在计算机软硬件背后的语言》一书。强烈推荐给大家。
从0学编程,为什么要专门单独拎出一节课讲它?
我们看到的最多的,是偏业务层的数据结构,也会看到一些不好的设计,有时候冗余,有时候歧义,有时候缺失。其实这就源于对“信息”这个概念模模糊糊的理解。
通过学习莫尔斯码和布莱叶盲文,我们知道信息的表达要做到这两个要求:
- 准确
- 高效
信息,和数据结构,其实是非常相近的概念,共享“准确、高效”这两个核心要求。我们也许不会和二进制打交道,但是,我们所学所写,都是广义的“信息”。除了在编程,在其他领域,也应该以“准确、高效”要求自己。
网友评论