Ruby受欢迎的三十七个理由(上)

Ruby,一种为简单快捷的面向对象编程(面向对象程序设计)而创的脚本语言,在20世纪90年代由日本人松本行弘(まつもとゆきひろ/Yukihiro Matsumoto)开发,遵守GPL协议和Ruby License。

一、Ruby 是面向对象语言。

这意味着什么呢?的确,关于“什么是 OOP”,每十位程序员当中恐怕就有十二种看法。这个问题我留待您自己判断。而就特征而言,Ruby 提供了机制,将数据和方法封装到对象里,实现了一个类到另一个类的继承机制,还提供对象多态机制。与某些语言(C++、Perl 5 等等)不同的是,Ruby 从一开始的时候就是以面向对象为目标来设计的。

二、Ruby 是“纯正”的 OOP 语言。

我说重复了么?我可不这么认为。说“纯正”,这就意味着,所有的一切——包括字符串或整型之类的基本数据类型——都是以对象的形态来表达的。在 Ruby 中用不着 Java 里面提供的那种 wrapper class(包裹类)(译注:wrapper class 用来将基本类型包装成对象类型)。而且,甚至连常量都被当作对象来对待,因此方法可以由——比如数字常量——来唤起。

三、Ruby 是动态语言。

对于只熟悉诸如 C++、Java 等静态语言的人而言,这就是个新概念。所谓动态意味着,可以在运行期动态地追加或者重新定义方法和变量。这种动态机制免除了对 C 语言中条件编译(#ifdef)这类功能的需要,并且使构建复杂的 reflection(内省机制)API 成为可能。

复杂的 reflection 机制又进而使得程序可以变得更为“自知(self-aware)”——从而为如下诸多功能开启了方便之门:运行期类型信息、丢失方法的侦测、能够侦测新追加的方法的钩子技术,等等。从这个方面来看,Ruby 与 Lisp 和 Smalltalk 有些许亲缘关系。

四、Ruby 是解释型语言。

这是个复杂问题,值得多说几句。有人可以争论说,从性能方面来考量,语言采用解释型机制弊大于利。对于这种想法,我用下面的斟酌予以回应:

1. 首先最为显著的是,快速开发周期(rapid development cycle)颇有效益可得,Ruby 的解释型语言本质助长这种效益。

2. 太慢到底是多慢呢?说慢之前请先做一些性能测试。

3. 尽管会有人因此而批评我,但我还是要这么说:处理器每年都在持续提速。

4. 如果您着实需要速度,您可以用 C 语言撰写需要速度的那部分代码。

5. 最后,从某种意义上说,有一种值得商榷的观点:鉴于没有哪种语言是从骨子里就被解释,因此并不能说不可能撰写出 Ruby 编译器。

五、Ruby 能够处理正则表达式。

多年以来,正则表达式一直被认为是属于 UNIX 领域的雕虫小技,涉及诸如 grep 和 sed 之类的阳春工具,或是在 vi 里面做一些讨巧的“查找-替换”操作。Perl 语言帮助人们改变了这种看法,而现在 Ruby 也对此有所帮助。越来越多的人认识到这种超高级的字符串和文本操纵技巧中所蕴含的无比威力。对此持怀疑态度者,应该去读一读 Jeffrey Friedl 的书 Mastering Regular Expressions 。非怀疑论者也应该读。

六、Ruby 是支持多种平台的语言。

Ruby 可以运行在 Linux 及其他 UNIX 变体、各种版本 Windows 平台、BeOS,甚至 MS-DOS 上。如果我没记错的话,还有 Amiga 版本的。

七、Ruby 借鉴了前辈语言。

这是好事儿吗?在文学领域之外,是的,这是好事儿。牛顿说,“若我看得比别人远,乃是因为我站在了巨人的肩上”。Ruby 确实是站在了巨人的肩上。Ruby 引借了来自 Smalltalk, CLU, Lisp, C, C++, Perl, Kornshell,以及其他语言的特性。

我看到其中的原则是:

1. 不要重新发明轮子;

2. 不要修补没有问题的部分;

3. 特别重要的是,充分利用人们现有的知识。

您掌握 UNIX 里面的文件和管道(pipes)吗?没问题,您可以在 Ruby 中运用到那些知识。您花了两年时间研习 printf 的各种格式符号?别担心,您在 Ruby 里面还可以使用 printf。您了解 Perl 的 regex handling 技术?好的,那么您几乎也就立刻学会了 Ruby 的 regex handling 技术。

八、Ruby 具创新性。

这一条与第7条有些矛盾吧?唔……是有一点;每个硬币都有两面嘛。Ruby 有一些特征极具创新性,比如非常有用的 mix-in 概念。或许这些创新型特征将来会被新的语言借鉴。(注:一位读者向我指出,LISP 至少早在 1979 年就有 mix-in 了。这一点我倒是完全没有注意到;我当另寻一个更好的例证,保证其真确性。)

九、Ruby 是特高级语言(Very High-Level Language,VHLL)。

这个问题有待商榷,因为术语 VHLL 还未被广泛使用,而其含义更是比 OOP 的含义更具争议性。我说“特高级”指的是,Ruby 可以通过相对较少的指令掌控复杂的数据结构并对其进行复杂的操作,符合了被一些人称为“最少投入”的原则(Principle of Least Effort)。

十、Ruby 有智能垃圾收集器。

诸如 malloc 和 free 之类的函数现在只是已然过去的昨夜噩梦。您连析构函数都不需要调用。仅此足矣。

十一、Ruby 是脚本语言。

不要以为 Ruby 是脚本语言所以就不强大。Ruby 可不是玩具。Ruby 是全功能的程序设计语言,只不过 Ruby 让传统的脚本操作变得更容易撰写,比如运行外部程序、检查系统资源、使用 pipe(管道)、截获输出等等。

十二、Ruby 用处多样。

Ruby 可以完成好 Kornshell 能够完成好的事情,也可以完成好 C 语言能够完成好的事情。想快速写一个十行的 hack 程序来完成一次性的任务,或者为遗留代码写个 wrapper 吗?用 Ruby 没问题。想写一个 Web 服务器、CGI,或者棋类游戏吗?用 Ruby 也没问题。

十三、Ruby 对线程予以支持。

您可以使用简单的 API 撰写多线程应用程序。是的,即使是在 MS-DOS 上撰写也可以。

十四、Ruby 是开源的。

想看 Ruby 的源代码了?想提供一个补丁建议了?只管去吧!想与智慧云集、乐于助人、包括语言设计者在内的用户社区进行联络吗?可以的!

十五、Ruby 具有直观性(直觉性)。

学习曲线平滑不陡。一旦入了门,您是否就开始“猜测” Ruby 的使用方式了呢?您的猜测通常是正确的(译注:因为 Ruby 很直观,符合了人们惯常期待的方式)。Ruby 致力于符合“最少诧异或惊讶”之原则(Principle of Least Astonishment (or Surprise)).

十六、Ruby 具有异常(exception)机制。

同 Java 和 C++ 一样,Ruby 能处理异常。这意味着少与返回代码纠缠,更少的嵌套 if 语句,更少的意大利面式逻辑(spaghetti logic,贬义,指的是复杂混乱的代码设计,比如大量使用GOTO语句等等),更好的错误处理机能。

十七、Ruby 有高级的 Array class 。

数组是动态的;您不必像在 Pascal 等语言当中那样在编译期声明数组大小。您不必像在 C/C++/Java 当中那样为数组分配内存空间。Ruby 的数组是对象,因此您不必时刻警惕其长度;原则上,您不可能像在 C 语言当中那样“越出数组的长度大限”。想以索引、元素,或者反向处理数组吗?想打印整个数组吗?Ruby 为所有这些事情提供了对应的方法。想把数组当作集合(set)、堆栈(stack),或队列(queue)来对待吗?Ruby 也为此提供了对应的方法。想把数组当作查找表(lookup table)来使用吗?这是个问题问得巧——您不必这样用,因为 Ruby 提供了哈希表专门处理这个问题。

十八、Ruby 是可扩展的。

您可以用 Ruby 或者 C 语言编写外部程序库。另外,您还可以随心所欲地就地修改现存的类和对象。

十九、Ruby 鼓励 literate programming(字面编程方式)。

您可以将注释嵌入到代码中,Ruby 的文档工具可以从中抽取和操纵这些注释。(Literate programming 的铁杆儿支持者或许会认为这是很基础的东西吧。)

二十、Ruby 以创新的方式使用分隔符和大小写。

返回 Boolean(尽管 Ruby 不这样称呼它)的方法通常都以问号结尾,而且,修改数据的方法的名称带有惊叹号。一切都简单、明了、直观。包括 class 名称在内的所有常量都以大写字母开头。所有对象的 attributes 都以 @ 标记开头。这种方案既有老式的“匈牙利表示法(Hungarian notation)”的务实性,又避免了龌龊刺眼的表现形式。

二十一、Ruby 的保留字不保留。

使用被称为“保留字(reserved word)”的标识符是完全没有问题的,只要保证别让语法分析器遇到歧义的情况就行。这可真是畅快。

二十二、Ruby 支持迭代器(iterator)。

Ruby 的迭代器使得“传递代码区块到对象中”这种操作可以经由这样的方式来完成,即对于数组、列表(list)、树(tree)等诸多结构中的每一个元素都能够调用指定的代码区块。这是个值得深入探究,威力强大的技巧。

二十三、Ruby 具有安全性特性。

Ruby 借用了 Perl 的“点缀(tainting)”概念,通过 $SAFE 变量实现了多种控制级别(揪心级别?)。此特性对于“为了攻破 web 服务器而被利用”的 CGI 程序而言,特别有好处。

二十四、Ruby 没有指针。

相关推荐