天天看點

《像計算機科學家一樣思考Python(第2版)》——1.6 形式語言和自然語言

本節書摘來自異步社群《像計算機科學家一樣思考python(第2版)》一書中的第1章,第1.6節,作者[美] allen b. downey,趙普明 譯,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。

自然語言是指人們所說的語言,如英語、西班牙語和法語。它們不是由人設計而來的(雖然人們會嘗試加以文法限制),而是自然演化而來的。

形式語言則是人們為了特殊用途設計的語言。例如,數學上使用的符号體系是一種特别擅于表示數字和符号之間關系的形式語言;化學家則使用另一種形式語言來表示分子的化學結構。而最重要的是:

程式設計語言是人們為了表達計算過程而設計出來的形式語言。

形式語言傾向于對文法做出嚴格的限制。例如,3 + 3 = 6是文法正确的數學表達式,但3+ = 3$6則不是。h2o是文法正确的化學方程式,而2zz則不是。

文法規則有兩種,分别适用于記号(token)和結構(structure)。記号是語言的基本元素,如詞、數字和化學元素。3+ = 3$6的一個問題就是$在數學表達式中(至少就我所知)不是合法記号。相似地,2zz不合法是因為并不存在縮寫為zz的化學元素。

第二種文法規則指定記号所組合的方式。數學等式3+ = 3不合法,因為雖然+和=是合法記号,但不能将它們連續放置。相似地,在化學表達式裡,下标數字應該出現在元素名稱之後,而不是之前。

“this is @ well-structured engli$h sentence with invalid t*kens in it.”是一個結構良好,但包含非法記号的英語語句。“this sentence all valid tokens has, but invalid structure with.”這句話所有的記号都合法,但是語句結構不合法。

當你閱讀英語的句子或形式語言的語句時,需要弄清句子的結構是什麼(雖然在自然語言中這個過程是下意識完成的)。這個過程稱為文法分析。

雖然形式語言和自然語言有很多共同的特點—記号、結構、文法以及語義,但它們也有一些差別。

歧義性:自然語言充滿了歧義,人們通過上下文線索和其他資訊來處理這些歧義。形式語言通常設計為幾乎或者完全沒有歧義,即不論上下文環境如何,任何表達式都隻有一個含義。

備援性:為了彌補歧義,減少誤解,自然語言采用大量的備援。是以,自然語言往往很啰嗦。形式語言則相對不那麼備援,更加簡潔。

字面性:自然語言充滿了習慣用語和比喻。例如,有人說,“硬币掉了”(the penny dropped[1]),并不一定是硬币,也不一定是有什麼掉了。形式語言則嚴格按照它的字面意思表達含義。

因為我們都說着自然語言長大,有時候很難适應形式語言。在某種意義上,形式語言和自然語言的差別與詩詞和散文的差別類似,而且程度更甚。

詩詞:字詞的使用,既考慮它們的音韻,也考慮到它們的意義,而整首詩合起來表達某種意境或情緒反應。歧義不僅常見,而且常常是刻意為之。

散文:字詞的意義更加重要,而且句子的結構也提供更多的意義。散文比詩詞更容易分析,但仍然有不少歧義。

程式:計算機程式的意義不含歧義,直接如字面所指。完全可以通過它的記号和結構了解其意義。

形式語言的密度遠遠大于自然語言,是以閱讀起來需要花費更多的時間。還有,結構非常重要,是以直接自頂向下、從左至右的閱讀順序并不一定是最好的。相反,要試着學會在頭腦中解析程式,辨識出記号并解析出結構。最後,細節很重要。在自然語言中常常可以忽略的小錯誤,如拼寫錯誤或者标點符号錯誤,在形式語言中往往會造成很大的差别。