What have you found for these years?

2008-11-29

awesome! rubinius

既然答應要講 rubinius, 只好趕快來惡補一下。
不過或許這是一個讓自己心安理得去 trace source code 的藉口也說不定...
但總之呢,越深入看 rubinius, 越覺得 rubinius 要是不成功,就太可惜了。

Ruby 1.9 YARV 是效能,還有新玩意兒的代表。
JRuby 是與 Java 溝通的代表,而 Rubinius 我想就是其他的代表了...

之前一直嫌他跑得實在有夠慢,後來發現預設是沒有 build llvm 的!
打開 llvm 之後,重新 compile, 啟動 bin/rbx, 嚇了一跳!
執行效能可能增加五倍以上吧?本來要等好幾秒才能啟動,現在應該不用一秒。
真奇怪,那為什麼預設不打開?

跑了一下 benchmark, 雖然執行速度還是遠遠遜於 1.9, 而且也跟 1.8
有不小的距離。不過速度倒是接近 jruby 了,這種效果我想還可以接受了。
jruby 不也是後來才越跑越快?現在的 rubinius + llvm 應該比當時的
jruby 跑得還要快了。

不過其實這些不是重點。雖然發現文件大部份都過期了,google 到很多東西
都在講 shotgun 而不是新的 c++ vm, 但 source code 翻來翻去,
程式寫得很漂亮啊!雖然有些地方不明白為什麼 new 了之後沒有 delete,
或許是 bug 也說不定,但總之整體而言品質是非常高的。

像是,幾乎每個檔案的行數都在 150 行以內。短的根本不到 100 行,
長一點的,頂多 200 行。只有少數比較特殊的地方才會超過 500 行。
例如類似 config 需要列舉的東西。還有為了跟 MRI 相容的 C 介面。
我猜的啦,因為命名方式完全相同,看起來是 rubinius 的 mri wrapper.

這樣做當然有好處,可以直接拿其他 ruby extension 來用,
例如 hpricot, mongrel, thin, 等等,說不定拿過來就能 compile.
這點實在比 jruby 有利太多了,jruby 這些大概都註定要重寫。
當然啦,jruby 的好處就是可以直接連結 java 程式,各有利弊。
(不過對我而言,可以連結 java 程式的好處接近於零)

*

總之看來看去,rubinius 確實是把能夠搬到 ruby 去寫的東西,
通通搬過去了。entrance 就是 runtime/loader.rbc,
在這裡面處理各種 start-up 的東西。compiler/code generator,
等等也都是用 ruby 寫成。大概只有 bootstrap 裡的 primitive 會
呼叫到 c++ 的程式吧。不過這樣反倒讓我很困惑,那一堆 c++ 程式是在幹嘛?
又為什麼裡面還有 parser? 又為什麼這 parser 用到 bision,
看起來確實是完整的 ruby parser?

雖然程式非常容易讀懂,但數量實在很多,架構也很龐大,一時三刻真的是看不完。

另一方面,Squeak 是連 vm 都用 Smalltalk 寫哩。rubinius 還不是。
照這樣想的話,squeak 的架構可能更龐大,或是更慢吧...
推測可能比 rubinius 多一層,要用 vm (interpreter) 再跑一個 vm.



但總之漂亮的程式/架構/模型才是王道! XD

4 retries:

jserv said...

Squeak 有一整套 self-bootstrapping 的機制,最後都是 retargetable image 了,效能仍是相當好的 :)

godfat 真常 said...

我後來翻來翻去 Squeak 的一些介紹,
雖然沒有實際跑過,也有聽到說效能非常非常好,
不是 Rubinius 可以比擬的。也就是說,
我猜 Rubinius 一開始想仿造 Squeak,
但發現有技術上或時程上的困難,所以....

短時間內大概很難有 Squeak 的成就吧 XD

Plumm said...

我之前用 Squeak 我覺得它 GUI 蠻慢的,常常會 LAG 停住,不過我那邊 Windows 版,也許 Unix/Mac 版會好一些。此外,Squeak 目前只有簡中的版本,似乎沒有繁中的版本。

godfat 真常 said...

GUI 要快應該有難度,連 Qt 都不夠快了...
感覺是只有最 native 的東西刻出來的 GUI 才會快。

Post a Comment

All texts are licensed under CC Attribution 3.0