把程式語言看做語言

TP_funny發表於2014-12-02
英文原文:On Programming Languages as Languages

當你查詢字典裡的詞語“語言”時,你將找到一些相似定義的版本。我信賴的 Chrome 外掛“Google Dictionary”,提供了第一個相當明顯的定義,然而:
人類溝通的方式,交談或書寫,用結構化的、約定俗成的方式來組織詞語的使用。
第二個定義更有意思,因為它讓我為程式語言提出了觀點。它是這樣說的:
被特定社群或國家使用的、交流的系統。
怎麼樣,說得不好嗎?讓我們省去“國家”,簡寫成,“被特定社群使用的、交流的系統”。你能說,這不是對程式語言的、精闢的定義嗎?

我們能夠用兩種可能的方式看待程式語言。它們可以是我們命令計算機的一種方式,偶爾與其他程式設計師交流,或者它們支援我們與其他程式設計師就最終可執行的術語進行交流。
第一種解釋在技術上更加精確。或者,更加具體地說,是最糟糕的一種精確。

我喜歡把程式語言當做語言,因為在瑣碎的程式設計之外,當解決問題或者完成特定任務的時候,它們讓程式設計師彼此交流,不經意地產生通過“翻譯”(比如編譯器和直譯器)而被計算機理解的程式碼。
根據第二種解釋來考慮程式設計可以衍生出很多好處。

當你從這個角度看待程式設計的時候,你開始考慮註釋的價值,它們表達了“為什麼”、程式碼表達了“怎麼做”。測試變成了與其他程式設計師【注1】交流的方式——對程式碼庫的改動違反了既定要求。最重要的是,編寫符合習慣的程式碼變得重要了。

記住 Google 字典的定義。“特定社群交流的系統”。事實上,不管是為了更好、還是更壞,社群為具體的程式語言設定了規範和風格。

由於我們在某種交流系統裡運作,程式設計就與駕駛稍微類似了:可預判是重要的。在 Ruby 社群我們有最小驚奇原則(the principle of least surprise),在 Python 社群,可以找到關於”完成一件事,應該有一種——最好是僅僅一種——-明顯的方法“的頌歌。

當你把程式語言看做是被社群採用的一系列約定俗成、偶爾被計算機理解,你就會避免因為方便就提供了魯莽的猴子補丁類【注2】。因為你明白,這樣做會導致不可預期的結果,給其他程式設計師帶來錯誤傳達。

你也要避免在語言裡技術上是合法的特性,但是可能讓其他有經驗的程式設計師感到困惑。這種情況的例子,請參看 Ruby 裡的 Flip-Flop(Perl 遺產的回憶)。技術上合法的 Ruby,甚至經常有用的,然而,你不應該使用,因為只有一小撮 Rubyist 才能理解你在做什麼。還有更糟糕的,如果你不熟悉它的名字,是很難 Google 到答案的。

當你首次學習一門人類語言時,你學到了普通詞語的意思。然後你使用從書本、身邊人、歌曲、電影和電視節目中記住的、簡單的句子。然後你儘量模仿母語講話者所用到的慣用法。最初你常常使用不當,導致比較接近滑稽的變種,只是對於那些本地人而言,有些不太準確。

對於程式語言來說,情況沒有什麼不同。這說明了閱讀其他人的程式碼、寫程式碼、接收程式碼評審裡的反饋、結對程式設計、參與開源並貢獻程式碼,參加程式碼固有的、其它形式的社互動動是多麼地重要。這對於你真正掌握一種程式語言是相當重要的。

社群定義了語言的風格、慣用法和方言,你和其他程式設計師通過這種共用的、精確的語言交流,這裡需要強調的是,你應該慎重選擇社群。

選擇社群優先考慮什麼?如果社群不愛漂亮的、清晰的、優雅的、易於理解的程式碼,請三思。

做為一名不得不學習英語的成年人,很多地方都要從零開始,我能對你說的,就是我發現學習一門新語言和學習一門新的程式語言之間是有很多相似之處的。

即使兩者不是完美地匹配——把程式語言看做人類語言是一個有瑕疵的比喻——我也覺得,就這些方面來思考,讓我快速地掌握了程式語言中的重要技巧,這是我需要、或我想學到的。
  • 注1:更多的時候,“其他程式設計師”恰恰指你自己。
  • 注2:猴子補丁可以解釋為,不改變原始碼而對功能進行追加和變更。軟體開發過程中,有一個著名的開放-封閉原則(open-closed principle):對模組擴充套件必須開放,對修改必須封閉。模組是可以擴充套件的,比如追加新的資料結構或者功能,能夠滿足未來的需求。修改是封閉的,指被引用的模組內部細節發生變化時,對外介面應當是穩定的。猴子補丁能夠遵循該原則,它的主要目的包括追加和變更功能、修補程式錯誤等。Ruby 這樣的語言提供了開放類,也就是說類定義之後也能任意的追加新內容,不僅如此,Ruby 還提供了若干類操作方法,undef 可以取消之前本類或者父類定義的方法,alias 可以給方法起一個別名,開發人員可以在重新定義的方法中用別名來呼叫原來的方法,從而給原來的方法增加新功能,include 可以把其他模組的功能包含進來。Ruby 提供的這些方法使猴子補丁的實現過程更容易,對比 Java 等靜態語言,讀者可以發現 Ruby 語言在這方面處理靈活,開發效率更高。http://www.infoq.com/cn/articles/ck-art-of-language-design
來自:部落格園
相關閱讀
評論(1)

相關文章