Kirjoittaja: kayttaja-2791 (04.12.2009)
Kehittäjälähtöinen, joustava, ennustettava, aloittelijaystävällinen... Nämä asiat olivat japanilaisen Yukihiro Matsumoton mielessä kun hän alkoi kaavailla uutta, oliopohjaista skriptikieltä vuonna 1993. Ensimmäisestä onnistuneesti ajetusta Ruby-koodista 1994 on alkanut tämän uuden skriptikielen nousu kohti komentosarjakielien kärkikastia.
Ykihiro kirjoitti:
I want to solve problems I meet in the daily life by using computers, so I need to write programs. By using Ruby, I want to concentrate the things I do, not the magical rules of the language, like starting with public void something something something to say, "print hello world." I just want to say, "print this!" I don't want all the surrounding magic keywords.
-Yukihiro Matsumoto, Ruby-ohjelmointikielen luoja
Ruby on noussut hyvin suosituksi eritoten Japanissa, missä kieli on joidenkin arvioiden mukaan jopa suositumpi kuin Python. Lokalisoituminen juuri Japaniin onkin toisaalta haitannut kielen leviämistä muualle, pitkään dokumentaatio oli pelkästään japaniksi ja kehittäjäyhteisö keskittyi vahvasti juuri tälle seudulle. 1998 kuitenkin Rubylle julkaistiin ensimmäinen englanninkielinen sähköpostilista, ja dokumentaatio ja kehittäjäyhteisö muutenkin on laajentunut yhä vahvemmin myös muualle.
Ruby on hyvin puhdas oliopohjainen kieli. Skriptikielelle tyypillisesti se käyttää muuttujien dynaamista tyypitystä ja muistinkäytöstä huolehtii roskienkeruu. Rubylle on ominaista että halutun toiminnon voi toteuttaa helposti useilla eri tavoilla. Esimerkiksi laskeminen yhdestä kymmeneen:
#TAPA1 10.times do |i| print i+1 end #TAPA2 1.upto(10) { |i| print i } #TAPA3 (1..10).step(1) { |i| print i } #TAPA4 Range.new(1, 10).each { |i| print i }
Oliopohjaisuus näkyy helposti, kaikki arvot (mukaanlukien myös true ja false) ovat olioita.
Kielen syntaksi muistuttaa monintavoin pseudo-koodia, ja kielen pääkehittäjä Matsumoto onkin pitänyt yhtenä pääteemanaan kielen tekemistä juuri ihmisiä silmälläpitäen. Tämä näkyy helposti esimerkiksi ylläolevista koodiesimerkeistä, ne eivät paljoa selitystä tarvinne.
Tulostus:
print "Terve Ohjelmointiputka!"
Fibonacci:
fib = 0 fibNext = 1 iterations = Integer(ARGV[0]) rescue 10 #Iteratiivinen ratkaisu, algoritmisesti hyvä iterations.times do |x| puts fib if x + 1 < iterations #Ei lasketa viimeisellä kierroksella enään seuraavaa tmp = fibNext fibNext = fib + fibNext fib = tmp else puts fibNext end end #Taulukkoa käyttävä ratkaisu, muistinkäytöllisesti huono fib = Array[0, 1] puts fib.join("\n") #Tulostetaan kaksi ensimmäistä Range.new(0, iterations-2).to_a.each { |x| fib[x] = fib[x-1] + fib[x-2] puts fib[x] } #Rekursiivinen, algoritminen painajainen def fibonacci(n) n < 2 ? return n : return fibonacci(n-1) + fibonacci(n-2) end puts fibonacci(iterations)