• 2007-04-10

    合并Runtime

    终于将New Runtime的代码合并到XRuby的trunk中了。

    从开始写New Runtime到现在快有半年了,时至今日,才把它的主体结构合并到trunk中。主要原因是New Runtime和原有的Runtime差异太大。虽然二者起到的作用是类似,但结构和接口上的巨大差异使得合并成了一件很困难的事情。

    如果我没有记错的话,这是第三次进行合并的尝试。yawl在我写好了New Runtime之后,就进行了第一次尝试,试图将编译器移植到New Runtime上,结果很长时间代码都不能运行。虽然这次尝试没能成功,但是从New Runtime得到的继承结构应用到了trunk中。第二次尝试是在0.1.0发布之前,我亲自操刀合并。思路同上次类似,我直接把New Runtime的主要结构合并进来,之后,修改编译器。当时的代码已经可以运行很大一部分的代码,但依然是问题多多,最终没能赶在0.1.0发布之前完成。不过,这次的尝试倒是让我对代码生成部分有了一个比较清晰的认识。

    在0.1.3发布之后,我开始了第三次尝试。谈到New Runtime,yawl给了我个建议,一点一点来,不要试图一下子就把所有内容加进来。从善如流,我没有沿袭前两次那种大刀阔斧的修改方式,而是采用了小规模重构的方法。首先是对执行性能影响较大的Method Cache。说起来很简单,就是加一个简单的缓存,但因为已经存在了大量的测试用例,所以,让所有测试都通过是一个考验。这次修改基本上只改动Runtime的内部实现,几乎不动编译器端,所以,相对来说,影响还比较小。当所有测试用例通过的时候,我长出了一口气,至少成功的迈出了第一步。这次修改同时还加入了ID替换String的实现,所有测试用例通过之后,为了能够更充分的利用ID带来的优势,我又修改了编译器,让它直接生成利用ID的代码,相对来说,这步要简单得多。

    接下来的是更为复杂的类结构,同样,我依然采用的是小规模重构的方式。在开始之前,我划分了一下需要做的几件事,大体说来,分为三个部分singleton类的支持(用于支持为对象定义方法和meta类)、include类的支持(用于支持包含模块),整体结构的支持。

    按照顺序,我开始加入singleton类的支持时,我发现如果想让singleton类很好的运作,必须有对整体结构的支持,这两个工作关联性很大。为了不让自己陷入长时间的一无所获,我放弃了正在进行的singleton类的支持,转向include类的支持。果然,include类的支持相对来说,影响要小一些,编译器部分几乎没有任何修改,所以,很快通过了测试,这样,New Runtime已经有一部分进入到trunk之中。

    再回到singleton类支持时,有一少部分代码因为include类的原因,已经进入到trunk之中。其实,单纯支持singleton其实很容易,而且也几乎不要修改编译器,但正如前面提到的,如果让singleton类能够运行起来,必须要有整体的结构与之配合,所以,在有测试未通过的情况下,我就把整个的类结构全部合并进来了。之所以会很复杂,因为除了类结构本身,还要有编译器部分与之配合。这样,在应对Runtime修改的同时,还要考虑编译器生成代码的正确性。好在二者的表现通常是截然不同,在执行时出现的各种各样错误一定属于Runtime,而编译器的错误是代码根本不能正确执行,加载时就会出校验错,所以,一般很容易知道是哪里出了问题。无论如何,长时间的测试不能通过是一件很痛苦的事情,稍感欣慰的是,总有一点点的进步。

    惊喜总是不期而至,当我还在等待下一个错误的时候,突然所有测试用例通过了,那是一种很奇妙的感觉。虽然现在的Runtime还有不少要调整的地方,但是主要的结构已经进来了。回顾前两次的合并,之所以没能成功,主要是因为目标太大,一次要完成所有任务,很难很好的把握其复杂度。失败中也有收获,如果没有前两次的尝试打下的基础,这次的合并可能会更加复杂。

    合并New Runtime可是我在0.2.0要实现的一个重要目标,实现之后,便可以继续前进了。现在New Runtime不复存在,只有XRuby Runtime。
  • 在这个万物开始复苏的季节里,BJUG的活动也重新开张了。

    之前的一天,突然接到冰云的电话:
    “哥们,准备个topic吧?”
    “明天活动,今天让我准备啊?”
    “就这么定了!”
    就这样,没等我争辩,就被按在那里了。

    答应人家就得做到,讲什么呢?XRuby是我最近投入最多的东西,自然成了当前的最佳选择,趁机宣传一下XRuby也不错。于是,晚上加第二天上午的时间全部投入的讲稿的准备之中,其间还拉了几个XRuby的成员帮我审稿,终于在出门之前把讲稿准备好。

    按照BJUG现在的活动习惯,每次活动之前,都要对各个话题进行投票。还好XRuby引起了一些人的兴趣,不致于让我辛辛苦苦准备的讲稿没有用武之地。

    其实,我最担心的并不是我讲不出来,而是担心不对各位听众的胃口,并不是每个人都对编译器这些东西感兴趣的,我所能做的只是竭尽所能,分享XRuby中一些有趣的东西。所幸,在我讲完之后,还有人提出一些问题,这至少证明我讲的内容有人听明白了,努力没有白费。后来,我觉得自己有些过虑,程序员对这些看似神秘的东西还是有一定的好奇心,本来,我愿意做程序员也是因为喜欢这种解惑的感觉。从讲到回答问题,前前后后大约耗时一个小时,说得有些口干。这次算是开了不错的头,希望今后有机会,与大家分享更加深入的内容。

    为了与更多人分享,我已经把这次稿子上传,如果有兴趣下来看看。
    http://xruby.com/Documents/XRuby_Overview.ppt

    有疑问,提出来;有兴趣,加进来。XRuby本来就是一个享受乐趣的地方,以这篇讲稿的标题结束这篇blog吧!

    XRuby: Enjoy Ruby on JVM 

  • 2007-03-03

    长假归来

    春节长假回来已经有几天了。

    如果从离开北京算起,这次的假期是我休息最长的一次,虽然中间跑到公司上了两天班。说是上了两天班,其实,主要是在和不同的人聊天。和领导谈,和同事谈,和朋友谈。很长时间没见面,见了面总是有许多话要说,无论是近况,还是发展,抑或是开玩笑。尽管大家很长时间没在一起,一旦打开话匣子,从前的感觉便会回到身边。

    这次回家,老妈准备晋升到高科技一族。从来没接触过电脑的老妈,在别人的影响下,准备在家里装宽带了,其主要计划是闲暇之时在网上打麻将。对此,我是不遗余力的支持。回到家的第二天,就把宽带的事情搞定了。趁着自己在家,先享受一下。相对而言,家里的宽带可要比北京便宜多了,4M的带宽每月才50元。看来,在这个问题上,北京有哄抬物价的嫌疑,就像手机资费一样,就像房价一样。

    年龄越大,心里就越没有过年的感觉,虽然一切依旧,亲戚朋友一个都不能少拜访,但无论如何在自己身上也找不到小时候那种过年带来的兴奋。倒是才2岁的小侄女对于新年的喜悦、对鞭炮的热情,让我看到还是有人很愿意过年的。

    对了,XRuby发布了0.1.2,修改了一些bug,增加了一些builtin库的实现。
    http://xruby.googlecode.com/files/xruby-0.1.2-src.zip

    在项目发布的blog上,还提供了一些性能测试的结果。
    XRuby 0.1.2 released

    On Ruby的Pat Eyler在年前对XRuby的团队做了一次访谈:
    Serial XRuby Interview: Episode I

    Pat是一个很有趣的人。在我回复的mail中,我提到自己要去过春节,他一定要让我给他介绍一下中国的春节,因为他对不同文化的东西很感兴趣。我们顺便讨论了一下三鲜馅饺子的做法,对我的英文是一次极大的考验。在这个过程中,我发现图对于人们交流的重要性。^_^
  • XRuby是什么?它是一个编译器。与其它编译器一样,它完成的工作是将一种格式的语言转换成另一种。与大多数编译器不同的是,它是将Ruby的代码(.rb)转换成Java的bytecode(.class)。XRuby是一个开源项目,很荣幸,我是这个项目的成员。

    提起Ruby和Java的组合,现阶段,在人们脑中率先撞线的多半是JRuby。JRuby确实在结合Ruby和Java这条路上走了很长一段时间,尤其是去年SUN吸纳了其几个开发人员,名声一下子壮大了许多。但是,JRuby只是一个用Java开发Ruby解释器,而非编译器,也就是说,它并不是将Ruby代码编译成Java的bytecode。当然,现在JRuby的开发者已经走上了编译这条路,不过,仅仅是刚刚起步。从这个意义上来说,XRuby走在前面。

    故事得从头说起。2005年中期,yawl一个人开始了XRuby的开发。项目的最初,开发的只是一个Ruby的语法解析器,所以,那时候的名字叫做RubyFront。在yawl的blog上,不难发现他在开发过程中的一些心路历程和解决的各种各样的问题。经过艰苦的努力,RubyFront发布过两个版本,0.1.20.2.0。到0.2.0的时候,RubyFront已经可以解析Ruby On Rails的1.1.2版本了。

    一个人的努力总是有限的,yawl在孤独前行了很长一段时间之后,决定把这个项目开源,吸引更多人一起努力。2006年9月8日,yawl将代码移至Google Code。此时的项目已经超出了一个Ruby语法解析器的范畴,于是,项目名也由RubyFront变成了XRuby。至此,XRuby正式诞生,也开始向一个真正的Ruby编译器迈进。

    项目是开源了,但如果还是一个人做,那和不开源是没有分别的。于是,yawl决定为XRuby打第一次广告,吸纳开发人员加入到XRuby中。

    我就是这个时候加入的。当时,刚好完成了RHG第一遍的翻译,对Ruby的构造有了初步的理解。看到这样的消息,当然是兴奋不已:自己熟悉的Java、自己喜欢的Ruby、自己想要了解编译器技术。通过与yawl的沟通,我成为了XRuby这个项目的成员,除yawl之外,第一个加入这个项目的成员。

    最初的时候,我花了大量的时间去理解yawl的代码。不过,同我之前了解C Ruby的实现有不小的差异。后来我才逐渐弄清楚,原来yawl的代码更多的是根据自己的想法在写,对C Ruby参考的不多。这样做当然有一些好处,不过,也确实遇到了一些问题。所以,后来我按照C Ruby的实现重新写了一个Runtime,但是由于与原来的实现差异很大,所以,暂时没有加入到第一个版本的发布中,希望在下一个版本的发布中可以看见它的身影。在这个过程中,加深了我对Ruby实现的理解,于是,就有了一篇篇的《管窥Ruby》。

    在XRuby的开发过程中,发生了一件有趣的事。

    有一个叫rubygrammar的项目,目的是开发一个基于Antlr的Ruby语法前端。这个项目聚集一些人气,前期的结果并不太理想,但是受到了很多人的关注。Antlr的开发者Terence Parr就在Antlr网站上上传了这个项目的前期成果,一个半成品的Ruby前端。

    JRuby的开发者Charles Nutter想替换掉JRuby中基于YACC的前端,因为它并不是一个很好的选择,于是,他找到了这个项目。一群人在邮件列表中讨论的结果是,发现现在已经有了一个可以工作的Java的Ruby前端,就是XRuby的前端(也就是最初的RubyFront)。他们建议把前端从XRuby分离出来。结果就是yawl把XRuby的前端贡献到rubygrammer中,成为了其项目的一部分。

    随着开发的进行,又有几个人加入到XRuby中。截至XRuby发布第一个版本时,除了yawl和我之外,成员还有beanworms,javachina和cpunion。每个人都为XRuby出了自己的一份力。yawl说,没有大家的共同努力,XRuby的进度会更加缓慢,我说,没有yawl,XRuby就不存在。每个人都有自己的精彩,在这里,我无法尽述大家在项目中所起到的作用,但相信大家都和我一样,通过XRuby学到了很多东西。

    我不喜欢用国界来区分技术,因为我相信技术是没有国界的。但是不得不说的一点,目前的几个项目成员都是华人,尽管他们有的身在异国他乡。虽然大家在邮件列表中的交流依然使用的是英语,但私下里的中文交流促进了彼此的了解。

    现在,XRuby已经发布了第一个版本。事实上,它还很弱小,远远无法达到我们心目中完美的境界,但它已经迈出了第一步。我们愿意看到它一点点成长。刚刚起步的XRuby需要更多人的帮助,它还在发展之中,有很多的机会可以让人发挥自己的才智。不要为编译器这么“高深”的东西所吓倒,事实上,参与这个项目之前,我对编译器也是知之甚少。XRuby为我们提供了这样一个学习提高的机会,只要拥有热情,我们可以学会那些所谓的“高深”。

    Ruby的创始人Matz总是把乐趣挂在嘴边,如果你有兴趣,就来和我们一起体验这份开发的乐趣吧!

  • 在一个非年非节的时候,辞旧迎新,我要说的是我的手机。因为不小心,已经为我服役3年有余的手机进了水,就此退出了历史舞台,而今天,新手机正式登场,顶替了它的位置。

    我拥有手机算是比较晚的,大约在工作将近一年之后,我才有自己的第一款手机,NOKIA 6610。买手机的那个日子直到今天还清楚的记得,2003年5月31日,因为第二天,也就是那年的儿童节,我就出差了,这款手机可以说是为了出差而买。那个时间让人记忆犹新,因为那时是非典时期,而我出差的地点是北京。之前,也就是我第一次出差,也是在北京,赶上非典风暴的头,这次赶上了尾,前前后后大约有一个月。后来,这段经历成了朋友们之间的谈资。

    回到手机的话题上。第一次买手机,完全没有做调查,只是知道NOKIA的手机不错。因为当时认识的很多同事都拿着NOKIA的手机,再者,因为NOKIA是部门的合作伙伴,所以,下意识的认为,NOKIA手机就是好。在完全不了解手机的情况下,只定下了一个基调,买NOKIA手机。

    一大早去买手机,在听人介绍了一下几款手机的大致情况之后,我一眼就相中了6610,我选择的标准很简单,看着舒服。其实,当时根本不了解这款手机的情况,更多的情况是买了之后才逐渐了解的。不过,就是这样一个选择,也确定了我对手机的偏好:NOKIA、直板。这个6610陪我度过了三年多的时光,虽然技术的发展让它越来越显得有些落伍,但我还是对它情有独钟。如果不是不小心进了水,我相信,它还会在一段时间内陪着我。

    辞了“旧”,再来迎“新”。

    新手机是NOKIA E50,6610为我定下的偏好是我选择这款手机的一个重要原因,甚至颜色都同我的那款6610异曲同工:银色的主体、黑色的边。选择它还有一个重要的原因,这是一款智能手机,对我而言,这意味着可以为它做些开发,说句对不起我的6610的一句话,我早就想有这么一款手机了,我一直想了解一下手机开发,这回自己的手机都支持了,有空的时候,就可以玩玩了。

    新手机,刚上路,一切都在熟悉中。