把編程語言看做語言

jopen 10年前發布 | 9K 次閱讀 編程語言

  英文原文: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

  — END —

  譯文: 《把編程語言看做語言 》 臘八粥

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!