出於好奇,我想試試某些號稱是「真正的高階語言」的直譯式語言,初步選定的目標為Perl, Python, Ruby;但是Perl的寫作風格過於自由,Python又太死了,而且我不喜歡它的物件傳遞方式,所以最後用Ruby試著寫了一個質數表。
而開發速度的確是令我相當驚訝,即使這只是一個很簡單的程序。
而開發速度的確是令我相當驚訝,即使這只是一個很簡單的程序。
#!/usr/bin/env ruby SIZE = 100 prime = Array.new( SIZE, true ) prime[0, 1] = false, false i = 2 while i ** 2 < prime.length if prime[i] j = i while j * i < prime.length if prime[j*i] prime[j*i] = false end j += 1 end end i += 1 end i = 0 prime.length.times do if prime[i] puts i end i += 1 end
雖然在這個例子裡把Array初始化,但是其實只要讓直譯器知道該變數是屬於Array這個class就夠了,不論是大小或是型態有沒有宣告都無所謂;因為Ruby[?]是泛型語言,變數並沒有真正的固定型態,而陣列裡也不需要放置相同物件,也可以在裡面放其他的多維陣列,不需對齊。
它的動態性也值得一提,因為你可以在class定義完成後再增減它的成員[?]。
它的動態性也值得一提,因為你可以在class定義完成後再增減它的成員[?]。
但是它的執行速度也同樣地令我吃驚[?];諸君可以試著把上例的SIZE改成20000000,再跑跑看,我相信跑出來的時間會令你印象深刻。
同樣的演算法,用C或是C++來寫大約只要2.3~2.5秒左右,但是Ruby的情況,它可以用到兩分多鐘。
也許是因為直譯器經常要late binding吧,就像是C++的virtual function用多了的後果一樣。
同樣的演算法,用C或是C++來寫大約只要2.3~2.5秒左右,但是Ruby的情況,它可以用到兩分多鐘。
也許是因為直譯器經常要late binding吧,就像是C++的virtual function用多了的後果一樣。
總之,因為以上的結果,在需要複雜計算的時候Ruby並不算是個好選擇....也許哪天我會去試Python吧。
沒有留言:
張貼留言