這是系列文章第三篇。
對于計算機的第一印象
大家還記得小時候第一次接觸小霸王或者游戲機是什么感受?
我小時候非常沉迷于此,坦克大戰啊,魂斗羅啊之類的,都是人生美妙的體驗。
我從小就用小霸王學習機、計算機去學習(笑)。其實是玩游戲。玩這些游戲的時候會覺得不可思議。但這個時候其實是迷惑的,
信息——消除不確定性
莫爾斯碼
我們想一個場景。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學編程,為什么要專門單獨拎出一節課講它?
我們看到的最多的,是偏業務層的數據結構,也會看到一些不好的設計,有時候冗余,有時候歧義,有時候缺失。其實這就源于對“信息”這個概念模模糊糊的理解。
通過學習莫爾斯碼和布萊葉盲文,我們知道信息的表達要做到這兩個要求:
- 準確
- 高效
信息,和數據結構,其實是非常相近的概念,共享“準確、高效”這兩個核心要求。我們也許不會和二進制打交道,但是,我們所學所寫,都是廣義的“信息”。除了在編程,在其他領域,也應該以“準確、高效”要求自己。