18th Jul, 2007

Matz, Koichi访谈(一): Ruby虚拟机

这是一个系列访谈 ,采访者为James Gray,内容涉及Ruby虚拟机,多线程以及国际化等方面,接受采访的Matz为Ruby语言的创造者,Koichi(以下简称ko1)是YARV项目 的主导者,YARV项目的目标是为Ruby开发高效的虚拟机(Yet Another Ruby VM),YARV目前已合并入Ruby1.9,并将作为Ruby新核心在下一个版本中发布。采访采用了邮件方式进行,由于不是一开始就准备好了所有的问 题,所以整个访谈的时间跨度相当大,第一篇与最新的一篇相隔大约有5个月,访谈共有4部分,这里是第一部分 (发表于07年2月16日),主要是Matz和koichi的自我介绍以及他们的Ruby虚拟机的看法。

问:非常感谢两位接受我的提问,在开始之前,两位能不能先介绍下自己以及你们在Ruby开发中所担当的角色?

Matz:我是Ruby语言的设计者以及第一个实现者,我的真名是Yukihiro Matsumoto,英语的读音类似于You-Key-Hero Matz-Motor,但这个名字实在太长了,所以你们还是叫我Matz好了,

我从1993年开始开发Ruby,但是现在Ruby已经变得十分的复杂,并且存在严重的性能问题,其实,从很久以前我就动过重写Ruby解释器的念头,但我总是没法下定决心完全抛弃现在的实现,而从头实现一个新的。

直 到后来,我遇到了Koichi,我发现他的YARV项目比我的老古董实现要更有前途一些,于是我邀请他加入了Ruby的核心团队。尽管我非常喜欢同时充当 设计者和实现者的双重角色,但我发现我在语言的实现方面实在是没有多少才华,所以,当我发现YARV后,我想现在是时候将我的全部精力投入到Ruby语言 的实现上了。

Ko1:非常感谢你对YARV和我产生兴趣,顺便说一下,我最近正在思考YARV的具体含义,有人说YARV不是另一个(Yet Another),而是指”YARV ain’t Ruby VM“,如果YARV不是一个Ruby VM,那它是什么呢?

下 面开始自我介绍,我叫Koichi Sasada,因为ichi在日语中是一的意思,所以我用了ko1作为我的昵称,我是东京大学的一名助教,我的主要研究方向是系统软件,包括操作系统,编 程语言,并行系统等等。我还是日本Ruby协会的成员,我曾经策划过一些Ruby活动(比如 RubyKaigi2007),我还是 Rubyist Magazine的一名编辑,同时,我还开发了Nadoka, Rava, Rucheme以及一些其它小项目,当然,我还是YARV的开发者:Yet Another RubyVM。

至于我在Ruby开发中的角色?其实我一直在从Matz那窃取Ruby Hack的乐趣?

问:这次采访的主要目的是探讨Ruby解释器的未来,所以你们能详细讲讲YARV/Rite吗?它们在设计上和老的Ruby解释器有何不同?

Matz:事 实上,我对设计的兴趣远远大于实现,所以Ruby解释器离它应该有的性能还相去甚远,但是随着Ruby语言的日益复杂,我发现要想让Ruby解释器的性能 取得大的突破,必须重新实现解释器的核心(core),所以在2001年的时候,我计划发起一个新的Ruby解释器项目,它的代码名称就是Rite,但可 能是我太忙了,也或许是太懒了,这个项目一直没有启动。

后来,koichi出现了,他向我们展示了YARV,那时候有许多人想要实现 Ruby解释器,但是只有koichi完整的实现了整个特性集(当然,现在我们有了JRuby和RubyCLR,但那个时候只有YARV),所以我请求他 加入到Ruby新核心(Rite)的开发中来,他答应了。

2007年1月1日,koichi提交了YARV到Ruby的主干上,现在它已经是Ruby1.9的官方核心了,原有的Ruby实现被转移到了matzruby分支下,目前我还在这个老的分支下工作,主要是实现一些语言的新特性,但是最终我会转移到新引擎上来。

关于YARV的细节,请koichi作答。

问:这是不是说,Rite将退居幕后,改而使用YARV,还是说YARV终有一天将更名为Rite?

Matz:除非koichi要求,否则将不会再使用Rite这个名字,我不确定koichi是否还会继续维护YARV,因为事实上,它已经是一个独立的Ruby虚拟机了。

Ko1: YARV已经不存在了。

事实上,我已经将YARV从结构体,函数以及文件的命名中全部删除掉了,YARV仅仅只是用来同matzruby进行区分的代码名称,现在,YARV不再指另一个Ruby VM,我在后续的文字中将使用YARV来指代Ruby官方代码库的主干。

首先,YARV是一个简单的运行伪顺序指令(pseudo sequential instructions)的堆栈机器(stack machine),而老的解释器(matzruby)需要遍历整个AST(虚拟语法树),这样明显很慢,YARV选择将AST编译成字节码然后再运行。

第二,YARV使用了原生线程(native thread)来实现Ruby Thread,这意味着你可以在扩展库中运行阻塞任务(*blocking* task)(遵照Ruby spec,阻塞任务应当被Thread#raise中断,更多细节,请参看[ruby-core:10252].), 由于在线程创建方面YARV要比matzruby慢,所以你不应该一次创建多个线程,并且支持原生线程也不意味着你的应用可以在多核机器上得到并发执行, 目前的实现采用了一个大的全局VM锁来避免同步问题(因为许多扩展库并不关心线程安全,比如array.c,string.c等等)。

第三,我针对一些特殊指令做了大量的优化,这些特色正是我开发YARV的目的,由于这些优化,至少基准测试显示它比matzruby快了不少。

不过YARV并没有对解释器/语法/规范(Matz的工作),GC(垃圾收集及内存管理)以及扩展库array/string/regexp等等进行改动,因此,如果你程序的瓶颈在于字符串处理,那么YARV恐怕帮不了多上忙。

问:祝贺你们完成了Ruby/YARV的合并工作,我想工作量一定很大吧?现在整个Ruby社区都为此感到兴奋,不过,随着合并的进行,你认为它会对Ruby核心的开发产生怎样的影响呢?

Matz:这应该主要归功于Koichi,他完成了大部分的工作,我目前正在从matzruby分支迁移到主干上来,最近,我已经在主干上实现了一些新的功能,比如class local instance variables以及新的local variable scope,迁移将在近期完成。

由于目前的主干主要是koichi的工作,所以我需要些时间来熟悉新的代码,我对老的解释器相当熟悉,但是新代码的某些部分对我来说还很神秘,不过我对它很满意,因为它很清晰,组织的也很好,并且很快。

ko1: 谢谢,事实上我还是个Ruby开发新手(我还没有CVS帐号,因此目前还无法递交代码),所以我对这个问题就不发表看法了。

问:那么基于YARV的Ruby版本会在什么时候正式发布呢?

Matz:简单的说:就是现在。

具体点说:现在你就可以从我们的SVN仓库中抽取(check out)YARV代码并使用它,但是我们的正式发布版本预计要到07年的圣诞节左右,当然前提是我们能像我们设想的那样勤奋。

评论

最后一句话很有意思:)

留条评论?

Your response:

Categories