TAG

首都機能移轉 (2) 歌詞 (2) 靠北文 (40) 戲言 (30) 糟糕 (7) ACG (23) Assembly (2) Boost (2) C (31) C++ (69) CMake (4) CSIE (67) Debian (34) Design_Pattern (2) Django (1) Eclipse (1) en_US (13) FFmpeg (3) FoolproofProject (26) FreeBSD (2) Git (4) GNU_Linux (65) IDE (5) Java (11) JavaScript (19) KDE (15) Khopper (16) KomiX (3) Kubuntu (18) Life (1) Lighttpd (2) Mac_OS_X (2) Opera (1) PHP (2) PicKing (2) Programing (21) Prolog (1) Python (7) QSnapshot (2) Qt (30) Qt_Jambi (1) Regular_Expression (1) Shell_Script (7) Talk (98) VirtualBox (7) Visual_Studio (13) Windows (18) zh_TW (36)

2007年7月29日 星期日

初試啼聲 on Ruby

出於好奇,我想試試某些號稱是「真正的高階語言」的直譯式語言,初步選定的目標為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定義完成後再增減它的成員[?]
但是它的執行速度也同樣地令我吃驚[?];諸君可以試著把上例的SIZE改成20000000,再跑跑看,我相信跑出來的時間會令你印象深刻。
同樣的演算法,用C或是C++來寫大約只要2.3~2.5秒左右,但是Ruby的情況,它可以用到兩分多鐘。
也許是因為直譯器經常要late binding吧,就像是C++的virtual function用多了的後果一樣。
總之,因為以上的結果,在需要複雜計算的時候Ruby並不算是個好選擇....也許哪天我會去試Python吧。

沒有留言:

張貼留言