Google SoC 系列:ANTLR v3 Ruby分析器

XRuby在努力创建一种编译器,能将Ruby编译成Java字节码。当然,编译器需要一种分析输入语言的方法,XRuby团队用流行的ANTLR分析器产生器创建了他们自己的Ruby分析器。分析器产生器的作用是接收一门语言的文法并产生代码以分析该语言。使用ANTLR意味着文法和分析器的创建工作必须从零开始,这不同于JRuby的方法。在JRuby里,Ruby分析器使用了另外一种叫做YACC的分析器产生器,而且JRuby选择复用该文法并使用Yacc的Java端口产生其分析器。

当被问到Ruby是否是一个分析起来比较困难的语言时,Wang Haofei(从事该Google Soc项目并且是XRuby团队的一员)做出了如下解释:

是的。该语言有许多模棱两可的地方。比如,“<<”可能是左位移操作,也可能是heredoc的起点。区分这两种情况需要维护状态(依赖上下文):
http://seclib.blogspot.com/2005/11/distinguish-leftshift-and-heredoc.html
其它像ID/函数的模糊性,字符串表达式替换,heredoc等等都很棘手。

当提到困难时,一个不错的问题是离目标还有多远。Wang Huofei:

XRuby第一个公开发行版已经可以处理全部ruby标准类库和Ruby on Rails(没有在对最新版做测试):
http://seclib.blogspot.com/2006/02/first-release-of-rubyfront.html
自此以后,Xue修正了一些bug,总的来说XRuby很稳定。在SoC项目进行过程中我们将编写和运行更多的测试,以帮助我们发现一些未知的问题。

Xue Yong Zhi是该SoC项目的指导者,而且也是XRuby团队的成员。

该Soc项目的一个主要部分是将现有的分析器迁移到ANTLR v3上。Wang Huofei:

1. ANTLR v3对v2进行了重写,通过LL(*)分析大大提高了分析能力,v2的分析能力不但弱很多(有限的LL(k))而且还迫使我不得不花时间去处理一些问题。基于ANTLR的分析器比别的分析器更容易维护,迁移到v3将帮助我们把分析器做得更好更清晰。
2. ANTLR v3将来应该有Ruby后端支持,所以我们可能会用Ruby编写Ruby分析器。
3. ANTLR v3的性能更好。

上面第二点十分有趣。Ruby缺少一个用Ruby写的Ruby分析器。编写处理Ruby代码的工具是一个问题。用Ruby写代码分析、重构工具和自动重构、格式程序等等甚至更多的工具并非不可能,但是很困难,因为还没有用Ruby代码分析Ruby源码的先例。有些工作,像Ryan Davis的分析树,用的是Ruby解释器的分析器(通过一个本地扩展)来获得Ruby源码的抽象语法树(AST)。AST是一颗代表Ruby源码的树,分析器工具必须了解代码的结构。然而,分析树不是一个完整的解决方案,因为当前的版本没有给出树上各个节点的源码位置。显然,像重命名一个Ruby源文件中的标识符这样的重构算法,需要知道标识符的位置在哪儿。

由于各式各样的Ruby IDE问世,这个问题在过去几年里变得更加明显了。这些带有代码分析器(用来警告代码中潜在的错误)并基于Eclipse RDT的IDE是第一个支持Ruby广泛重构特征的IDE。其他特征是支持基于Ruby的文件的,比如Rake文件——Ruby的make 或ant文件。问题是:这些工具都是用Java构建的(或其他语言)且Java IDE都使用JRuby分析器。

这意味着这些工具的功能都被那些语言禁固了,更糟的是,这些工具常常绑定到了特定的IDE上。例如,支持RDT的重构逻辑,对Ruby in Steel(建立在Visual Studio上的IDE)是不可用的。在Java界与之相比的区别是,分析器是可用的。像PMD或Findbugs这些工具都是用Java编写的,因此Java在哪里运行都可使用这些工具,更重要的是,可以用Java代码扩展这些工具。

因为该Soc项目的描述并没有100%说清楚基于Ruby的分析器的研究计划,Wang Huofei澄清了该项目计划:

这取决于我们做得有多好。即使不能满足Soc的进度表,我们也愿意做这些事情。

好消息。

制造代码工具一个必须的东西是AST,用来分析源码。前面已经提到的分析树,提供了一种表现Ruby源代码的格式。已有的基于分析树的工具,比如Ruby2Ruby可以把AST转换成Ruby源代码;如果某工具想修改AST并输出为Ruby源代码,这很有用。Rubinus,一个用Ruby实现Ruby VM的项目,也使用了分析树输出,用以把Ruby编译为Rubinius字节码,接着解释这些字节码。当被问到分析器的输出时,Wang Haofei这样解释到:

ANTLR有其自己内建的AST支持,这为我们序列化一个字符串或改变其他结构提供了很大方便。我们的分析器与分析树输出看起来很相似。在XRuby里我们把AST转换成像DOM这样的结构并使用Visitor模式产生Java字节码。

而分析树输出看起来还没有计划,很有可能把ANTLR产生的AST转化成分析树格式。一个类似的方法已经被JParseTree(JRuby的一个分析树端口)所采用,现在JRuby一部分额外软件包(JRuby Extras)提供了常用Ruby类库的JRuby端口。

从XRuby团队的blog可以得到更多关于XRuby及其分析器项目信息。

查看英文原文: Google SoC Series: ANTLR v3 Ruby Parser 译者简介:宋玮是InfoQ中文站的志愿者翻译。他有多年软件开发经验,从2002年开始就使用Java,在各个项目开发过程中先后使用过Struts、Oracle ADF、AspectJ等。最近正在使用Spring及Ruby on Rails,对敏捷方法有比较大的兴趣并做过一些尝试。他的blog为 http://www.donews.net/victorsong。与InfoQ中文站分享内容,请邮件至 [email protected]

你可能感兴趣的:(Google SoC 系列:ANTLR v3 Ruby分析器)