天天看點

《像計算機科學家一樣思考Java》—— 1.4 形式語言和自然語言

本節書摘來異步社群《像計算機科學家一樣思考java》一書中的第1章,第1.4節,作者:【美】allen b. downey,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。

像計算機科學家一樣思考java

自然語言(natural languages)指人類所說的語言,比如英語、西班牙語、法語等。自然語言并不是由人類設計的,它們是自然演化而形成的。

形式語言(formal languages)是人類為了某種應用上的需要而設計的。比如,數學中的各種記号便是一種形式語言,這種語言能夠很好地描述數字和符号之間的關系。化學家也用形式語言來表示化學分子的結構,而更重要的是:

程式設計語言是一種用來表達計算的形式語言。

形式語言對于文法有嚴格的規則。比如,“3+3=6”是一個合法的數學表達式,但“3$=”則不是。同樣,h2o是一個正确的化學名,而2zz則不是。

文法規則有兩種:記号規則和結構規則。記号是語言的基本元素,比如單詞、數字和化學元素。表達式“3$ =”的問題在于,“$”在數學上不是一個合法的記号(至少據我所知是這樣的)。類似地,“2zz”也不合法,因為沒有化學元素的簡稱為“zz”。

第二種文法規則表現在表達式的結構上,即怎麼編排程式中的記号。表達式“3$ =”在結構上是不合法的,因為等号不能出現在方程的結尾。類似地,在分子表達式中,下标隻能出現在元素之後,而不是之前。

當我們在讀英語句子或形式語言中的表達式時,我們需要搞清楚這些語句的結構(雖然對于自然語言來說,你是在潛意識裡完成這個任務的),這個過程稱為解析(parsing)。

雖然形式語言和自然語言有許多相同的特征,比如記号、結構、文法和語義等,但它們也存在不同。

多義性(ambiguity):自然語言充滿了多義性,人類可以根據所處環境和其他資訊來處理這樣的多義性。而形式語言是非歧義的,這意味着不管在什麼環境下,一條語句隻能表達一種含義。

備援性(redundancy):為了彌補多義性,同時也為了減少誤解,自然語言通常是備援的,而形式語言則更簡潔。

無修飾性(literalness):自然語言中有許多慣用語和隐喻,而形式語言則非常準确。

我們從小就在說自然語言,當轉向形式語言時,通常會有一段困難的時間去調整和适應。自然語言和形式語言之間差别在某種程度上就像詩歌和白話文之間的差别一樣:

詩歌:詞語的發音和意思都是重要的,一首詩作為一個整體營造出一種氛圍或情感效果,其中的多義性是常見的,甚至是故意而為的。

白話文:字面上的意思更重要,而結構也承載了更多的語言含義。

程式:計算機程式是非歧義的。我們通過對程式中記号和結構的分析是完全可以了解計算機程式的。

這裡有些關于閱讀程式(和其他形式語言)的建議。首先,形式語言比自然語言的資訊密度更大,由此閱讀所花的時間也越長。其次,程式中的結構是很重要的,這樣一來,從頭到尾、從左向右閱讀程式往往不是一個好主意。相反,應該試着在自己的大腦裡解析程式,識别記号并且翻譯程式中的結構。最後,細節是重要的,像拼寫錯誤和标點錯誤這樣的小錯誤,雖然在自然語言中不是什麼大問題,但是在形式語言中卻有很大的影響。