《好學的C++》“小知識”選摘(一):計算機是如何翻譯程式的

丁曉昀發表於2011-12-05

編者注:《好學的C++》一書中穿插介紹了一些在C++領域裡發生的,但卻波及到全世界的事件,內容涉及電腦科學、程式設計技術發展史、數學、哲學以及人工智慧等許多領域。學累了可以稍微放鬆一下,讀一讀這些小文章。

一些有關程式設計的教科書告訴我們:計算機根本不懂C++語言,所有的C++語句都必須先被翻譯成機器碼才能拿到計算機上去執行。可是這種翻譯又是由誰完成的呢?

“噢,這沒什麼可奇怪的,”那些教科書說,“這種翻譯是由編譯器(它本身也是一個計算機程式)完成的。至於編譯器本身,它是由計算機翻譯出來的。”

在我剛開始學習如何程式設計的時候,這在我看來就是一個解不開的死結。CPU(位於計算機中心的“大腦”)連一個C++單詞都不懂,卻能在C++和它自己的內部語言之間扮演翻譯官的角色,這不是自相矛盾嗎?

這個問題的答案隱藏在這個事實的背後:C++原始碼被儲存在一個文字檔案裡,就像你儲存一篇論文或一份備忘錄那樣。正如我剛才指出的,文字字元是以數值形式儲存的。於是,當計算機來處理這種資料的時候,它其實是在按照另外一套精確的規則進行另一種形式的數值運算、資料求值和決策判斷。

如果你還沒有徹底明白,再來想象一下:一位只懂日語但不懂任何英語的老兄給你寫了一封信,可你本人只懂英語,對日語是一竅不通。(我要對行為學家John Searle表示感謝,是他在他的“中文房間”思想實驗裡最先提出這個點子的。 )

現在,假設你手裡有一本告訴你如何把日語字元翻譯成英語單詞的說明書。這本說明書本身是用英語寫的,所以你用起來毫無問題。

好了,儘管你不懂日語,但只要你肯認真地查說明書,就有能力把日語如願翻譯成英語。 從某種意義上講,一個計算機程式就是一本給CPU看的說明書。每一個計算機程式都是一個由指令和資料構成的序列,各種各樣的計算機程式匯聚成了計算機裡的“知識”。程式使得計算機有能力做任何事情——包括翻譯一個內容為C++原始碼的文字檔案。

應該承認,編譯器是一種非常特殊的程式,但它做的事情並不是不可能實現的天方夜譚。作為計算機程式,編譯器就是一本我們剛才描述的“說明書”,它告訴計算機應該如何讀取一個內容為C++原始碼的文字檔案和輸出另外一本“說明書”:這份輸出就是程式的可執行程式碼。

最開始的第一版編譯器只能用機器碼來編寫。然後,老編譯器又可以用來編寫新編譯器,隨著這步步為營的過程的發展,甚至連那些高階程式設計師也越來越不需要編寫機器碼了。

相關文章