把编程语言看做语言

jopen 10年前

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

  译文: 《把编程语言看做语言 》 腊八粥