Ruby:高效的编程语言
每隔几年,计算机编程领域都会发生一些重大事件。在我看来,Ruby 计算机语言就是这样一个里程碑。
多年来,我看到程序员的生产力不断提高。这些都不是经过严格测量的计算,但我感觉每五年交付软件的速度就会翻一番。不仅如此,编写可维护软件的曲线似乎也在线性增长。这种速度的提高很大程度上可以归功于开发人员的工具,而这些工具的核心就是计算机语言。
计算机语言本质上是相似的。任何语言之间的相似之处都多于差异之处。然而,这些差异对解决问题、表达方式和人机交互产生了巨大的影响。例如,LISP 是一种在概念上非常优美和简洁的语言,它更多地反映了对计算机的忠诚,而不是对人类的忠诚。一种容易解释的语言不一定容易编程,许多学生可以证明这一点。LISP 最令人惊叹的特点是,它展示了用极少的规则就可以创建一种强大的计算机语言。
像 Pascal 和 C 这样的结构化语言显然弥合了本地汇编程序和快速、人类可读代码之间的差距。C 语言仍然广泛用于性能至关重要的地方——可以像 Linux 和 BSD 内核证明的那样,编写接近汇编程序的代码。
在九十年代初期使用 C++ 时,我个人经历了一段探索和发现的时期。类、对象、容器、运算符重载等等。阅读 Stroustrup 的经典著作对于理解 C++ 作为一种语言至关重要,我非常喜欢它。但事后看来,我意识到在 C++ 中变得高效需要付出额外的努力;它并不适合所有人。
Java 及时出现,解救了困境。作为一种更简单的语言,Java 在 OOP(面向对象编程)方面具有优雅性,但也有一些缺点,例如处理大型库时 JVM 速度较慢。语言本身也有一些缺点。许多经验丰富的 C++ 程序员使用 Java,并且会抱怨感觉就像双手被绑在背后工作一样。然而,Java 非常适合企业类型的团队编程工作。作为一种语言,它在强制结构和使用 OOP 概念方面取得了一些进展。
与此同时,另外两种语言在九十年代也留下了印记:Perl 和 Python。两者都是(解释型)脚本语言,并且在软件交付时间方面比 C++ 和 Java 具有一些真正的优势(稍后会详细介绍)。在当前计算能力水平下,对于大多数“用户级”软件而言,性能几乎不是问题。
Perl 在某种程度上是一场革命。它的大部分生产力提升都归功于引入了一种完整的编程语言,该语言具有用于正则表达式、数组,尤其是哈希的轻量级表示法。
然而,Perl 也有一些实际问题,几乎所有参与过大型 Perl 编程工作的人都会断言这一点。Perl 具有 OOP 扩展,但它们并不明显且很费力。我确实很享受学习 Perl OOP 的过程,因为它教会了我很多关于 OOP 本身以及如何在语言中作为单一技巧实现 OOP 的知识。然而,编写 Perl OOP 并不令人愉快。只有编码人员具有最高的纪律性,才能维护大型 Perl 源代码库,而语言本身并不能帮助强制执行正确的编码实践。
Python 作为一种语言更简洁,尽管它的 OOP 是事后添加的——并且显而易见。我花了一些时间研究 Python,但并没有那么喜欢它。它提供了很多,但也有不足之处,例如,对象元素都是公共的。在团队合作中,这意味着开发人员很难理解他们的类是如何被使用(或滥用)的。在这种情况下,我甚至会对自己的代码感到不信任。运算符重载很丑陋,if 语句后冒号的语法我觉得很不直观等等。缩进的想法很聪明,但不知何故它并没有提高代码的可读性。简而言之,Python 几乎成功了,但还不够。
去年年底,我拿到了(自称为)务实程序员 Dave Thomas 和 Andy Hunt 撰写的 Ruby 书籍。这本书也有一个在线版本。我一口气读完了这本书,就我而言,它进入了重要的计算机书籍名人堂,紧随 Stroustrup 之后。读完它之后,我几乎一周没睡觉,因为我对 Ruby 的含义感到非常兴奋,这是一种读起来像诗歌一样的编程语言。
Ruby 的作者 Yukihiro Matsumoto,又名 Matz,精通多种语言(LISP、Small Talk、Perl、Python 等),并旨在创建他完美的语言。Ruby 遵循最小惊讶原则,有趣的是,它非常接近。事实上,它给人的感觉完全像我一生都想设计的计算机语言(尽管我并没有真正意识到)。
Ruby 是在 1994 年之后开发的,没有 Perl 和 Python 的包袱;它是新来者。它带有广泛的库,不如 Perl 的 CPAN 丰富,但在使用 Ruby 一年后,我没有错过任何关键组件。Ruby 配备了 HTML 和 FTP 类、CGI 支持、XML 解析器、数据库库、GTK 和 Qt 绑定,甚至还有一个纯 Ruby BTree 库。连接 Ruby 和 Python 库也非常简单,这使其基础更加丰富。Ruby 在 UNIX 和 Windows 上都得到了很好的支持;在 UNIX 上开发并在 Windows 上部署可以顺利进行,包括 GUI 开发。
Lutz Prechelt 进行了一项非常有趣的关于开发者生产力的研究。结果表明,软件交付所需的时间量与必须编写的代码行数直接相关。用 C++ 和 Java 编写的项目的代码行数是用 Python 和 Perl 编写的项目的两倍,因此开发工作大约需要两倍的时间。
用 Ruby 编写代码可以进一步提高生产力,超过 Perl 和 Python。语法非常宽松且感觉自然;例如,没有分号。
if i == 15 print i end
也许我比其他开发人员更糟糕,但我发现我经常因为行尾排印错误而不得不执行编辑/编译循环。更少的中断使编程成为一种流畅的工作,并且令人惊讶的是,一段 Ruby 代码经常一次编写并运行。
由于 Ruby 定义新类的语法很简洁,因此很容易创建新类并在类级别编写测试支持
# form.rb # # Form class derived from Document class Form < Document def initialize # ---- Constructor end def mymethod s # ---- Do something with s and return s print s s end end
这导致了即时 OOP 设计,并防止编码人员懒惰地选择其他解决方案。我不得不承认,在 Perl 中,我的 OOP 会因为所涉及的工作量而退化。使用 Ruby,这种情况永远不会发生。
Ruby 提供的一些语言特性在其他语言中不可用。Ruby 支持闭包,这会将代码责任分配给适当的对象,从而产生更简洁的代码。在 Ruby 中,编写“for”和“while”循环很少见。此外,像“each”这样不易出错且更简洁的构造变得自然而然。
而不是(类似 Java)每次
Form form = forms.first(); while (form != form.last()) { if (form.valid()) { // ---- Do something } form = form.next(); }
Ruby 的方式是
class Forms < Array def each_form each do | form | yield form if form.valid end end end forms.each_form do | form | # ---- Do something end
并且适当的责任被捕获在 Forms 对象中。
对于更复杂的项目,可维护性成为一个问题。适当的 OOP 设计有助于带来结构,并使源代码逻辑清晰且透明。所有这些语言都在一定程度上支持 OOP,但 Ruby 在易用性和可预测性方面表现出色。
深入研究 Ruby 的优点超出了本文的范围。我强烈推荐 Thomas 和 Hunt 的书,以及 Matz 的Ruby in a Nutshell。后一本书只是一本参考书,不会带您领略 Programming Ruby 将带给您的耀眼高度。
人们经常会问以下问题
我为什么要学习另一种编程语言?
或者说是懒惰与热爱。每种计算机语言都有其价值,而增加的见解将使您成为一名更好的程序员。Java 教会了我如何编写更好的 C++;Ruby 教会了我很多东西,我不想再回去了。
为什么要从 Python 迁移?
如果您对 Python 感到满意,那么可以说没有充分的理由切换。Python 甚至有两个非常强大的用例:Zope WWW 框架和 Jython,两者在特定情况下都非常有吸引力。
有很多 Python 程序员已经切换到 Ruby。它可能比看起来更有价值。还记得人们质疑从 Perl 更改为 Python 的日子吗?一旦切换,似乎没有人想再回去。
ESR 在 Linux Journal 上发表了一篇非常有力的案例,主张从 Perl 或 C++ 迁移到 Python。他的所有论点都与 Ruby 相似且适用。
为什么要从 Java 迁移?
Ruby 的作用可能是加强和取代 Java。目前,Java 的优势在于中型到大型服务器端项目和分布式环境。Ruby 在部署方面和编写概念验证方面发挥作用。与此同时,Ruby 中的许多编程概念都与 Java 相关。我可以看到 Ruby 一旦绑定可用,将在这些环境中发挥作用。Matz 正在开发 Ruby 的字节码版本,而 JRuby 项目在 jruby.sourceforge.net 上启动了。
然而,Java 作为一种语言在企业环境中根深蒂固,并且这种情况将在未来一段时间内持续存在。此外,使用 Java 的工作方式有意非常冗长,但这也意味着需要花费大量时间才能获得相同的结果。
Perl6 怎么样?
Perl6 似乎有很多新功能。但大多数情况下,它仍然是空中楼阁。与此同时,即使是版本 5 的 Perl 也包含了很多包袱。即使它试图提供类似于 Ruby 的功能,它也永远不会像 Ruby 那样简洁。
我有超过五年的 Perl 经验和仅一年的 Ruby 经验。编写 Perl 代码仍然让我经常重新审视语法问题并重读有关函数的信息。使用 Ruby,我的经验是,回到手册的情况要少得多。我不期望 Perl6 会改变这一点。
对于原始性能,C/C++ 仍然是最佳选择。对于大型多平台团队工作,您最好使用 Java。但是当涉及到交付速度和概念验证时,您应该认真考虑使用 Python 或 Ruby。Perl 我会保留用于系统管理任务。
Ruby 比 Python 有一些明显的优势。它是一种更简洁的 OOP 语言,具有出色的功能,并且它支持 Perl 的正则表达式类型的简洁表示法。它在使人们能够编写简短、简洁且可维护的代码方面也得分很高。事实上,我现在大部分开发工作都在 Ruby 中完成,只有在必要时才接触 Java 和 C++。
Ruby 可能不是一种新范式,也不代表新一代,但它结合了许多编程语言的优点,并将生产力提升到了一个新的水平。我并不是第一个声明 Ruby 可能会取代 Perl 和 Python,并且会让许多 Java 程序员羡慕不已的人。
Programming Ruby,作者:David Thomas 和 Andrew Hunt,Addison-Wesley,2000 年 10 月,ISBN:0201710897。也可在线访问:www.rubycentral.com/book。
Ruby in a Nutshell,作者:Yukihiro Matsumoto,2001 年 11 月,ISBN 0-59600-214-9。有关更多信息,请访问 www.oreilly.com/catalog/ruby。
Ruby 语言网站是 www.ruby-lang.org/en/。
Ruby 应用程序存档包含许多库和绑定,可以在 www.ruby-lang.org/en/raa.html/ 找到。
务实程序员的网站是 www.pragmaticprogrammer.com/ruby/。
The C++ Programming Language,Bjarne Stroustrup,Addison-Wesley;ISBN:0201700735
Pjotr Prins 是 Causeway Technologies 的高级开发人员,并且对开发充满热情。他坚信 Linux 系统(部署约 30 台 ROCK Linux 服务器)的维护成本较低,是 EUP E-zine 的主编,也是 ROCK Linux 和其他开源项目的贡献者。
电子邮件:pjotr@thebird.nl