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端口。