1. 程式人生 > >【轉】什麽是語義學

【轉】什麽是語義學

alc 發現 languages 進制 產生 inner infer 掌握 OS

什麽是語義學

技術分享圖片

很多人問我如何在掌握基本的程序語言技能之後進入“語義學”的學習。現在我就簡單介紹一下什麽是“語義”,然後推薦一本入門的書。這裏我說的“語義”主要是針對程序語言,不過自然語言裏的語義,其實本質上也是一樣的。

一個程序的“語義”通常是由另一個程序決定的,這另一個程序叫做“解釋器”(interpreter)。程序只是一個數據結構,通常表示為語法樹(abstract syntax tree)或者指令序列。這個數據結構本身其實沒有意義,是解釋器讓它產生了意義。對同一個程序可以有不同的解釋,就像上面這幅圖,對畫面元素的不同解釋,可以看到不同的內容(少女或者老婦)。

解釋器接受一個“程序”(program),輸出一個“值”(value)。用圖形的方法表示,解釋器看起來就像一個箭頭:程序 ===> 值。這個所謂的“值”可以具有非常廣泛的含義。它可能是一個整數,一個字符串,也有可能是更加奇妙的東西。

其實解釋器不止存在於計算機中,它是一個很廣泛的概念。其中好些你可能還沒有意識到。寫 Python 程序,需要 Python 解釋器,它的輸入是 Python 代碼,輸出是一個 Python 裏面的數據,比如 42 或者“foo”。CPU 其實也是一個解釋器,它的輸入是以二進制表示的機器指令,輸出是一些電信號。人腦也是一個解釋器,它的輸入是圖像或者聲音,輸出是神經元之間產生的“概念”。如果你了解類型推導系統 (type inference),就會發現類型推導的過程也是一個解釋器,它的輸入是一個程序,輸出是一個“類型”。類型也是一種值,不過它是一種抽象的值。比如,42 對應的類型是 int,我們說 42 被抽象為 int。

所以“語義學”,基本上就是研究各種解釋器。解釋器的原理其實很簡單,但是結構非常精巧微妙,如果你從復雜的語言入手,恐怕永遠也學不會。最好的起步方式是寫一個基本的 lambda calculus 的解釋器。lambda calculus 只有三種元素,卻可以表達所有程序語言的復雜結構。

專門講語義的書很少,現在推薦一本我覺得深入淺出的:《Programming Languages and Lambda Calculi》。只需要看完前半部分(Part I 和 II,100來頁)就可以了。這書好在什麽地方呢?它是從非常簡單的布爾表達式(而不是 lambda calculus)開始講解什麽是遞歸定義,什麽是解釋,什麽是 Church-Rosser,什麽是上下文 (evaluation context)。在讓你理解了這種簡單語言的語義,有了足夠的信心之後,才告訴你更多的東西。比如 lambda calculus 和 CEK,SECD 等抽象機 (abstract machine)。理解了這些概念之後,你就會發現所有的程序語言都可以比較容易的理解了。

【轉】什麽是語義學