欣欣向榮的 Ruby 家族

jopen 11年前發布 | 13K 次閱讀 Ruby

誕生于1993年的Ruby即將迎來自己的20歲生日,估計松本行弘(Matz)先生20年前也沒有想到Ruby能成為一門流行的語言,長期出現在TIOBE編程語言排行榜前20之列,并且有逐步上升之勢。Ruby的愛好者遍布世界各地,在中國也有龐大的RubyChina社區。而且,除了Matz的MRI Ruby之外,還誕生了很多與其兼容的Ruby實現,有的旨在提升性能,而有的則是為了充分利用其他平臺提供的資源,還出現了專門針對移動設備和嵌入式設備的版本。

更好的性能

早期的Ruby雖然受到很多人的追捧,但是性能并不理想,很多人都質疑Ruby的性能,建議系統中的關鍵部分用C來寫。而且Ruby的GC也存在很多問題,打不打MBARI補丁,差異巨大。出于性能的考慮,很多人開始從動手實現性能更好的虛擬機,正是他們的努力,讓Ruby的性能獲得了質的飛躍。

首當其沖的是Koichi Sasada開發的YARV(Yet Another Ruby VM),該項目的唯一目的就是要打造世界上最快的Ruby虛擬機。從早期的一些評測來看,YARV為Ruby帶來了巨大的性能提升,而它也成為了后來Ruby 1.9的官方解釋器,自然不必多說了。

其次是Rubinius,在它的首頁最上方有著這么一句話:

An environment for the Ruby programming language providing performance, accessibility, and improved programmer productivity.

可見它的關注點是性能、可訪問性以及開發者的生產效率。Rubinius擁有自己的字節碼虛擬機,運行時,Ruby代碼會先變為字節碼,隨后再通過LLVM將字節碼編譯為編譯為高效的字節碼。而且,它還有一套精確的、帶壓縮的分代垃圾收集器,進一步提升了GC效率。

除此之外,Rubinius還為我們帶來了另一個重要的貢獻,它創建了RubySpec,為其他Ruby實現提供了一套可以參考的實現規范,后續很多組織也參與其中,添磚加瓦,貢獻了很多測試。

第三個登場的是Phusion出品的REE(Ruby Enterprise Edition),REE的焦點更多地集中在服務端的Rails應用上,與Phusion Passenger結合在一起,可以極大程度上降低Rails應用的內存開銷,并且提升服務響應速度。REE的主頁上提供了一套官方的對比,Apache (worker MPM) + Ruby Enterprise Edition + Phusion Passenger的組合在這兩方面要明顯優于其他組合。

REE還集成了很多第三方的補丁,比如之前提到的MBARI、RailsBench等等,可惜它僅兼容到Ruby 1.8.7,有點跟不上時代的節奏。

在性能上表現出眾的還有JRuby,考慮到它是運行于Java平臺之上的,因此會在后續小結中進行重點介紹。

更多的平臺

JRuby是運行于Java平臺之上Ruby實現,最近剛剛發布了1.7.2版本,能很好地兼容Ruby 1.8.7和1.9.2(JRuby從1.7.0開始默認使用1.9模式,之前一直默認1.8模式)。JRuby讓Ruby程序能夠充分利用Java的龐大資源,同時還提供了更好的性能。如今的Ruby擁有龐大的類庫,但在Rails剛剛讓Ruby成為眾人焦點之時,Ruby的資源并沒有這么充分,即使是現在,能夠借助Java的力量還是非常有優勢的。

在JRuby誕生初期,開發者的主要精力集中在對MRI的兼容性上,但在兼容性不再是個問題時,他們就努力提升性能,他們做到了,還越做越好。例如,借助Java的力量,JRuby能真正做到多線程,而不是“Green Thread”;Java 7中新增的invokedynamic,能夠為基于JVM的腳本語言帶來不小的性能提升,JRuby 1.7就開始支持該特性了。JRuby的核心開發者Charles Oliver Nutter經常會在博客上發表一些文章,介紹JRuby的優化方法和經驗,從最近的一篇文章表明,JRuby 1.7.2在很多方面的性能要遠好于尚未正式發布的Ruby 2.0。

有不少Ruby開發者之前都是Java開發者(Bruce A. Tate就寫過一本很出名的《From Java to Ruby》),因此如果能夠充分利用之前Java的各種經驗,也不失為一件好事。一個有著豐富Java經驗的開發者,知道怎么對JVM進行調優,那他也一定能把JRuby的程序調校得很好。

Android上運行的是Java程序,那么應該也能運行JRuby,于是就誕生了Ruboto——這是一個用來開發原生Android應用的框架及工具鏈。此外,將Ruby代碼編譯為Java字節碼后交付給用戶,還能在一定程度上保護源代碼,這也算是個額外的收獲吧。

講完了運行在Java平臺上的Ruby,再來看看.NET平臺上的Ruby——IronRuby。與JRuby類似,IronRuby讓Ruby能利用.NET Framework上的資源,.NET開發者也能夠使用Ruby快速地完成很多任務。可惜IronRuby在2011年3月之后就再也沒有更新過,因此這里就不再闡述了。

Mac OS自帶了MRI Ruby,但其實也有構建于Mac OS X核心技術(例如Objective-C運行時)之上的Ruby 1.9實現,即MacRuby。它的目標是在不犧牲性能的前提下享受Ruby的樂趣,用它來創建完善的Mac OS X應用程序。從官方的入門教程來看,能夠很方便地使用MacRuby構建帶GUI的Mac應用。

除了Mac應用,你一定也很想知道能否用MacRuby來開發iOS端的應用,到目前為止Objective-C仍然是官方的首選,也有人潑過MacRuby的冷水,但MacRuby的開發者并沒有放棄,他們開發了RubyMotion,讓開發者能方便地使用Ruby來開發iPhone和iPad的原生iOS應用,且得到眾多好評

上面提到了Ruboto和RubyMotion,就不得不提另一個讓開發者能夠使用Ruby來開發移動應用的MobiRuby了。MobiRuby使用了松本行弘開發的mruby,這是一個輕量級的Ruby實現,可以運行Ruby程序,但主要的目的是嵌入其他程序,并且運行在內存受限的小型設備上,比如松本先生介紹過的Sakura Board。MobiRuby旨在替代移動平臺上的Objective-C/C和Java,目前已經能夠編寫iOS應用,更重要的是已經有MobiRuby的程序被AppStore接受了。開發團隊承諾,后續也會有針對Android的MobiRuby出現。

最后再來看看MagLev,它是構建于VMware GemStone/S上的64位Ruby實現,讓開發者能充分發揮GemStone/S的優勢,比如有更好的性能、分布式共享緩存、企業級NoSQL數據管理能力等等。更重要的是它能透明地管理遠大于內存上限的TB級別的數據和代碼,出于這個原因,也許可以將MagLev看成一個能夠運行Ruby、存儲 Ruby原生對象的分布式數據庫。

在看了這么多Ruby家族的成員之后,不知您有何感想?一定覺得這是個充滿活力的語言吧。如果您一直在使用官方的Ruby實現,那么不妨試試其他的實現,也許會有別樣的感覺。

來自:InfoQ

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!