【编者按】全球 Ruby 社区是友善与支持的代名词,人们用“Matz 人很好,所以我们也很友好”来形容它。多年来 Ruby 语言一直很流行,特别是那些需要处理大量繁重工作的初创公司。今年2 月份的时候,Ruby 举行了 25 周年庆,而Ruby 已经发展成熟,Ruby 的流行部分来自 Ruby on Rails(RoR)Web 应用框架的成功,但RoR 不再是超级明星了,它面临着激烈的竞争,大家怀疑它是否能够再活 25 年。
以下为译文:
软件是如何诞生的?这也许不是大家希望在编程大会上听到的主题演讲者所提出的第一个问题,但这是来自日本的,Ruby 编程语言的创始人,和蔼可亲的松本行弘(Yukihiro Matsumoto,被称为 Matz),在为期两天的年度 Bath Ruby 大会上,与 500 多位 Ruby 开发者交谈时提出的第一个问题。
2 月份的时候,Ruby 举行了 25 周年庆,尽管 Ruby 的第一个版本 0.95 是于 1995 年 12 月正式发布的。针对自己的哲学问题,Matz 建议说软件在命名时诞生。在 Ruby 诞生两年前的 1993 年 2 月 24 日,东京和社交媒体举行了盛大的庆祝活动。 Matz 说他想用一个宝石命名,他很风趣地说:“Ruby 很短,Ruby 很漂亮而且昂贵,所以我给自己的语言起名叫做 Ruby。”
然而,Matz 近五年来第一次来到英国,并不仅仅是为了吃个生日蛋糕。Ruby 可能已经发展成熟了,但是大家仍然怀疑它是否能够再活 25 年。就像它的创造者一样,Ruby 语言非常讨人喜欢,拥有忠实的追随者。比如,它的语法可读性非常高,但是表达方式非常简洁,且是一种动态的、反射式的、面向对象的通用编程语言,它直观且易于学习。Ruby 不想限制使用者,或者引用 Matz 经常说的一句话:“Ruby 旨在让程序员开心。”
但并非每个人都很开心。由于 Ruby on Rails(RoR)Web 应用程序框架的成功,多年来 Ruby 语言一直很流行,特别是那些需要处理大量繁重工作的初创公司。这一显著的优势使得 Ruby 在 2012 年的 RedMonk 语言排行榜上飙升至第五位,该排行榜结合了 GitHub 和 Stack Overflow 上语言的排名来评估语言的流行度,后来 Ruby 的排名下降到了第八位。
RoR 虽然很受欢迎,但并不是它的巨星,它面临着激烈的竞争,因为规模伸缩等问题已成为互联网公司更为关注的问题。例如,Java 的框架 Node.js 变得很流行,因为它的回调函数可以用更少的内存来处理大量的连接。
自2012年以来,在RedMonk排名中,Ruby在排名前十的编程语言中缓慢下滑。且一直在第十名上下摆动,这反映了Ruby已经发展成熟以及Ruby on Rails Web应用程序框架优势的减弱。
很明显,Matz 知道任何编程语言的使用都是由语言社区以及生态系统(RoR 是一个令人惊讶的例子)发展而来的项目和框架推动的,而通常不是语言本身。Ruby 也不例外,即使 Ruby 赢得了很多用户的喜爱。因此,在 Bath Ruby 大会上,尽管对于在自己的语言中犯下的错误他表达了遗憾,同时他也想明确前进的方向,解决那些造成开发人员放弃 Ruby 的性能和规模问题。
Matz 解决关键问题的方法也表达了他看到的两个关键趋势:可扩展性,以及他所称的更聪明的伙伴。
为了解决可扩展性并创造更高的生产力,Matz 认为:“更快的执行速度,更少的代码,更小的团队是提高生产力的关键。”
尽管计算机的运行速度越来越快,但这还不够,Matz 说:“我们需要更快的执行速度,因为我们需要处理更多的数据和更多的访问。我们很接近内核性能的极限了。这就是为什么 Ruby 3.0 的目标是比 Ruby 2.0 快三倍”,Matz 称之为“Ruby3x3”。“说起来简单,”Matz 承认 Ruby 1.8“太慢”,这是一个错误。
笹田耕一在 YARV(Ruby 的另外一个虚拟机)上的工作改进了 Ruby 1.9 的性能,Matz 说:“从那时起,我们一直在努力提高虚拟机的性能,但这还不够。”
JIT 时代
为了进一步提高性能,Ruby 进一步引入了 JIT(即时编译)技术,该技术已为 JVM 和其他语言使用。Matz 确认说:“我们已经创建了这个 JIT 编译器的原型,Ruby 2.6 可能会在圣诞节那天发布。”
2.6 预览版本 1 中可以看到 MJIT 的初步实现。目前已经可以利用–jit 选项检查并将 Ruby 程序编译成本地代码,但 Matz 说该选项还“未经优化”,不过至少“对于 CPU 密集型任务来说它的运行速度比 Ruby 2.0 加快两倍”,他认为这“十分有希望,且 JIT 编译器的性能提高还有很大的空间。”特别是对于 CPU 密集型的任务,Matz 相信他们能够将性能提高三倍。
根据 John Hawthorn 在 MJIT 代码中评论,目前的 JIT 编译器原型使用了一个非同寻常的方法:利用 C 编译器、GCC 和 LLVM Clang 来实现,尽管 Ruby 代码是单线程的,但 MJIT 是在第二个线程内编译的。
Shannon Skipper 提供了关于 MJIT 工作原理的最清晰的概括:
- “通过 MJIT,某些 Ruby YARV 指令被转换为 C 代码并放入一个.c 文件,该文件由 GCC 或 Clang 编译为.so 动态库文件。然后在下一次 RubyVM 看到相同的 YARV 指令时,可以使用这个缓存的根据动态库预编译好的本地代码。”
Matz 还认为,可扩展性应该意味着创造更少的代码,他风趣地说,因为“更多的代码意味着更多的维护、更多的调试、更多的时间、更低的生产力,以及更多的噩梦。”
然而,更少的 Ruby 代码并不意味着语言的语法将会发生重大变化。很大程度上是因为 Ruby 几乎没有改变的余地,Matz 说:“我们使用了所有字符。所有字符都被用到了。”
作为自由发展的代表者,他也不打算为了自尊心而改变语法,并看到现有的 Ruby 程序遭到破坏,所以他很谨慎地说:“我们不会对 Ruby 语法做出太多改动。”
根据 Matz 的说法,处理可扩展性并提高生产力的工作应该由小团队来担任。引用亚马逊 CEO Jeff Bezos 的“两个披萨原则”:“如果团队人数众多,两个比萨都不够吃,那么说明你的团队太大了。”坦白说,这可能要看团队里都有谁,以及他们爱不爱吃披萨(开个玩笑)。但是 Matz 说这个原则是经验之谈,“团队越大,所需要的沟通就越多,而沟通本身就是成本。”
更多抽象
近年来,人们一直在激烈的争论,关于需要更多的 Ruby 抽象来为开发人员提供服务,以便他们构建适合不同领域的应用程序,所以很高兴听到 Matz 说 Ruby 需要“更多抽象”,并提到 Ruby on Rails 以模型-视图-控制器(MVC)抽象为例。Ruby 的创始人并不认为它们是完美的,“但它们提供了对未来生产力至关重要的抽象。”
Matz 详细阐述的一个关键抽象是关于一个名叫 Guild 的并发抽象项目。
Matz 承认:“我对 Ruby 的设计感到遗憾的一件事是线程……它太简陋了。”但是 Ruby 的成功也有坏处:太多人使用该语言,所以 Matz 认为已经来不及删除线程了。
他说,“我认为可以包含一个新的抽象概念,并且阻止更多人使用线程。”Matz 还告诉 Bath 的与会者:“Guild 是 Ruby 的一次实验,可以提供更好的方法,Guild 完全是独立的。”
“基本上 Guilds 之间没有共享的状态。这意味着我们不必担心状态分享,所以我们不必关心锁或互斥。Guild 之间通过通道或队列进行沟通。”
Matz 预计将在 Ruby 2.7 或 2.8 中发布 Guild 的并发抽象。
Ruby 的另一个代码项目是 Steep。这是对 Ruby 的静态类型分析的尝试,Matz 解释说:“分析 Ruby 的类型信息很困难,因为 Ruby 是一种动态语言,所以你可以随意使用所有类型。”Ruby 的某些子集可以是静态类的,所以 Matz 说他们可以添加这些静态类型的检查,这“有点像 Type 的用户定义的类型信息。我们将尽可能推断类型,并从外部类型定义文件或运行时的配置文件类型分析中获取信息……”
Matz 表示,通过这种分析,开发人员可以在编译时检测到更多的错误,“我们无法实现 100%的安全检测,Ruby 不可能做到,但是我们可以检测到 20-40%的错误,”Matz 说与完全不检测相比这是个巨大的进步。
松本还谈到了 Ruby 要成为“聪明的伙伴”以及程序员最好的朋友。“现在我们已经开始使用智能计算机了,比如 RuboCop [静态代码分析器]就是一种可以帮助你的方式,”不过,Matz 对许多放声大笑的观众说,他也“不是很喜欢 RuboCop 的默认规则。”Matz 建议,将来在编译成功程序的时候,“Ruby 可以建议‘你给这个方法传递了个字符串,但是其实它期待一个整数。’”在主题演讲结束后,Matz 详细阐述了他对编程互动的期望,他同意这些听起来很像 Tony Stark 的 Jarvis。Matz 说他很想看看“人工智能与我互动,帮助我建立更好的软件。”
注意版本变更的幅度
版本变更可能使得软件无法按照预期工作。过去的错误让 Matz 很担心,他说:“过去我们的版本变更很大,例如在 1.8 和 1.9 之间的变更很大,并且引入很多破坏性的变更,所以在五年中我们的社区分裂成了两个。”
尽管以往发生过这样的事情,比如 Python 2 和 Python 3 就是典型的例子,Matz 认为这是一个悲剧:“我们不会再犯这种错误,所以我们会不断改进。我们会在 2.6 中加入 JIT 编译器,而不是等到 Ruby 3.0。将来我们会在 Ruby 2.7-2.8 中加入一些并发抽象类型,但是不会出现有破坏性的变更……我们将保证每个 Ruby 2 的程序都可以在 Ruby 3 中运行。”
一改 Ruby 目前逐步衰落的情况不是一件易事,Matz 似乎也明白这一点。在发表主题演讲的早上,当看到最近 Stack Overflow 的开发者调查结果时,他的微笑一下消失了,“Go 和 Rust 是最受欢迎的语言,不幸的是 Ruby 不在其中。我相信 Ruby 会在将来重振雄风。人们喜欢新技术。十年前在 Rails 的带动下 Ruby 炙手可热。现在 Ruby 虽然不算热门,但它很稳定。”
然而,Ruby 已经跨越了鸿沟进入了成熟阶段,Matz 不会放弃:“Ruby 是一种很好的语言,可以帮助你提高工作效率,我希望 Ruby 可以永远如此。这意味着我们不断改进,所以我们不能停下来。”
在日本外举行首届 Ruby Hack Challenge 大会正是我们前进的一步,此次会议上周在 Cookpad(一家以分享菜谱为主的网站,广泛使用了 Ruby 开发的平台)新的国际总部 Bristol 举行。这些挑战是让有抱负的代码提交者学习如何扩展 Ruby 的功能、修改 bug 和提高 Ruby 性能的机会。
Cookpad 的 CTO,Bath Ruby 大会的主办方 Miles Bathroffe 说,此次会议主要是为了 Ruby 解释器,该解释器说明了计算机是如何运行 Ruby 编写的程序的。
此次会议的目标之一是允许参与者直接为下一版本的 Ruby 解释器贡献代码。
随着 Ruby 3 的发布日益临近,非官方计划是在 2020 年,很明显 Matz 希望继续提供一种工具,帮助程序员专注于编程有趣和令人愉快的方面。
与松本行弘(Matz)谈话的时候,我注意到两件事情。首先,他会尽一切努力让 Ruby 存活下来并发展;其次,他非常享受自己在做的事情。他对 Ruby 及其社区充满热情,而他的外表看起来很简朴:编程是一件有趣的事情,在过去的 25 年中他玩的很开心,现在他已经 52 岁了,他希望在未来的 25 年中,可以继续快乐地为这门语言工作,这个他梦寐以求并在 17 岁时在一个笔记本上写下的语言。