天天看點

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

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

像計算機科學家一樣思考c++

自然語言是指人類表達的語言,比如,英語、西班牙語和法語。自然語言不是由人類設計(盡管人類嘗試對其強加某些指令)的,而是通過自然演化的。

形式語言則是由人類為了某些特殊應用而設計的語言。例如,數學中使用的記号法就是一種特别擅長表示數字和符号間關系的形式語言。化學家使用某種形式語言來表示分子間的化學結構。而最重要的是:

程式設計語言是用于表達計算過程的形式語言。

正如我之前提到的,形式語言具有嚴格的文法規則。例如,3+3=6是一個文法正确的數學表達式,但是3=+6$就不是。同樣,h2o是一個文法正确的化學名詞,但是2zz就不是。

文法規則有兩種:與辨別有關的規則或者與結構有關的規則。辨別是語言的基本元素,如單詞、數字以及化學元素。3=+6$的問題之一是$不是數學裡合法的辨別(至少據我所知是這樣)。類似地,因為化學裡沒有縮寫為zz的元素,是以2zz也是不合法的。

第二種文法錯誤是表達式結構的問題。所謂結構,就是辨別的順序。表達式3=+6$在結構上就不合法,因為不能在等号之後直接使用加号。類似地,分子表達式需要在元素名之後添加下标而不是之前。

當你閱讀一句英文或者形式語言的一條語句,你需要找到它的結構(盡管這一行為在閱讀自然語言時是無意識的)。這一過程稱為文法分析。

舉個例子,當你聽到一句話:“另一隻鞋掉了,”你會知道“另一隻鞋”是主語而“掉”是動詞。一旦你解析了一個句子的文法,你會了解它是什麼意思,就是句子的語義。假設你知道鞋是什麼意思和掉了是什麼意思,你就會明白這句話的大緻含義。

盡管形式語言和自然語言有很多共同的特性,但是他們在辨別、結構、文法以及語義上有很多不同。

二義性:自然語言充滿了二義性,需要人們根據上下文線索和其他資訊了解。而形式語言幾乎沒有二義性,即形式語言的任何表達式都僅有一個含義,無關上下文。

備援性:為了彌補歧義和減少誤解,自然語言引入了很多備援,結果自然語言通常都很啰嗦。形式語言則更簡明扼要。

文學性:在自然語言中有很多習語和暗喻。如果我說另一隻鞋掉了,很有可能指的不是鞋,也沒有什麼東西掉了。而形式語言則精确地描述了它們表達的意思。

習慣于自然語言的人們(每個人)要适應形式語言通常都很艱難。在某些方面形式語言和自然語言的差别就像是詩歌和散文,但是更甚。

詩歌:詞彙的發音和意義都十分重要,而整首詩歌創造某種效果或者情感回應。詩歌中随處可見精心設計的雙關語。

散文:相較于詩歌,散文中文字本身的含義更為重要,同時結構也具有更大的意義。散文雖然也有二義性,但是比詩歌容易分析。

程式:計算機程式的含義是純字面且無歧義的,并且可以通過分析辨別和結構将其完整了解。

關于閱讀程式(還有其他一些形式語言)的幾條建議如下。首先,形式語言比自然語言難以了解得多,需要花費更長時間來閱讀。其次,形式語言的結構很重要。是以從頭到尾的完整閱讀并不是一個好方法。應該學會先将程式解析,識别辨別和解釋結構。最後,記住細節決定成敗。像自然語言中無關大礙的錯誤拼寫和标點符号等,在形式語言中可能産生很大的影響。

本文僅用于學習和交流目的,不代表異步社群觀點。非商業轉載請注明作譯者、出處,并保留本文的原始連結。

繼續閱讀