Zastanawiasz się dlaczego Ruby jest tak popularny? Jego fani nazywają go pięknym, pełnym sztuki językiem. Mimo to, twierdzą, że jest poręczny i praktyczny. O co chodzi ?

Ideały twórcy języka Ruby

Ruby jest językiem starannie dobranej równowagi. Jego twórca, Yukihiro “matz” Matsumoto, połączył części jego ulubionych języków (Perl’a, Smalltalk’a, Eiffel’a, Ada, i Lisp’a) by uformować nowy język, który zbalansował programowanie funkcjonalne wraz z programowanie imperatywnym.

Matz często mówi, że chce uczynić ten język naturalnym – nie prostym – w sposób w sposób odzwierciedlający życie. Później dodaje:

Ruby jest prosty z wyglądu, ale bardzo skomplikowany w środku, tak jak ciało ludzkie1.

O rozwoju Ruby

Począwszy od publicznego wydania w 1995, Ruby zwrócił na siebie uwagę wielu programistów na całym świecie. W 2006 Ruby uzyskał masową akceptację, co objawiło sie w postaci dużej ilości aktywnych grup uzytkowników powstających w największych miastach świata oraz salach konferencyjnych wypełnionych po brzegi.

Graph courtesy of Gmane.

Ruby-Talk, główna lista mailingowa na tematy związane z Rubim, osiągnęła średnio ruch 200 wiadomości dziennie.

Wskaźnik TIOBE, który mierzy rozwój języków programowania, umieszcza Rubiego na 10 miejscu. Wiele owego wzrostu zawdzięcza Ruby popularności software napisanego przy jego użyciu, szczególnie frameworkowi Ruby on Rails2.

Ruby jest także zupełnie darmowy. Darmowe jest nie tylko korzystanie, ale również kopiowanie, modyfikowanie i rozprowadzanie tego języka.

Postrzeganie Wszystkiego Jako Obiekt

Początkowo, Matz szukał w innych językach idealnej składni. Wspominając swoje poszukiwania, Matz mówi: “Szukałem języka potężniejszego od Perl’a i bardziej obiektowego od Python’a”[3].”

W Rubim, wszystko jest obiektem. Każdy fragment informacji i kodu może uzyskać swoje właściwości i czynności. Programowanie obiektowe nazywa właściwości zmiennymi instancji a czynności metodami. Czysto obiektowe podejście Rubiego jest zazwyczaj demonstrowane przy uzyciu fragmentu kodu, który wywołuje czynność na liczbie.

5.times { print "We *love* Ruby -- it's outrageous!" }

W wielu językach, liczby i inne typy podstawowe nie są obiektami. Ruby podąża za Smalltalk’iem udostępniając metody i zmienne instancji wszystkim swoim typom. To ułatwia korzystanie z języka, ponieważ reguły mające zastosowanie do obiektów odnoszą sie również do całego języka.

Elastyczność Rubiego

Ruby postrzegany jest jako język elastyczny, ponieważ pozwala on swoim użytkownikom dowolnie modyfikować jego części. Zasadnicze części języka mogą zostać usnięte lub przedefiniowane – w zależności od woli. Do istniejących już części można dodać nowe. Ruby stara się nie ograniczać programisty.

Na przykład, dodawanie wykonuje się za pomocą operatora (+). Lecz gdybyś chciał wykorzystać w tym celu słowa plus, mógłbyś dodać stosowną metodę do klasy Numeric.

class Numeric
  def plus(x)
    self.+(x)
  end
end

y = 5.plus 6
# y wynosi teraz 11

Operatory Rubiego są lukrem składniowym dla metod, metody również możesz przedefiniować.

Bloki, Prawdziwie Ekspresyjna Właściwość

Bloki postrzegane są jako źródło ogromnej elastyczności. Programista może dołączyć domknięcie (ang. closure) do dowolnej metody, opisując jak dana metoda ma działać. To domknięcie nazywa się blokiem i stało się ono jednym z najbardziej popularnych właściwości Rubiego dla programistów pochodzących ze środowisk PHP i Visual Basic’a.

Bloki zainspirowane zostały językami funkcjonalnymi. Matz mówił, “w blokach Rubiego chciałem oddać szacunek środowisku Lisp’a4.”

search_engines = 
  %w[Google Yahoo MSN].map do |engine|
    "http://www." + engine.downcase + ".com"
  end

W powyższym kodzie, blok jest opisany pomiędzy słowami do ... end. Metoda map aplikuje zadany blok do podanej listy słów (Google Yahoo MSN). Wiele innych metod w Rubim udostępnia miejsce dla programisty, który może napisać swój własny blok i wykorzystać go w danej metodzie.

Język Ruby oraz Mixin-y

W przeciwieństwie do innych języków obiektowych, Ruby potrafi realizować tylko jednokrotne dziedziczenie (celowo). Język Ruby pozwala jednak na korzystanie z modułów (zwanych również Kategoriami w Objective-C). Moduły są zbiorami metod.

Klasy mogą dołączyć moduł i w ten sposób przejąć implementację metod z modułu. Dla przykładu, którakolwiek z klas implementujących metodę each może dołączyć moduł Enumerable, który z kolei realizuje kilka metod, które wykorzystują metodę each do iterowania po elementach.

class MyArray
  include Enumerable
end

Programiści języka Ruby uznają tą technikę za prostszą niż wielokrotne dziedziczenie—które może być skomplikowane i nakłada wiele ograniczneń.

Ruby’s Visual Appearance

Ruby używa minimalnej liczby elementów składni. Pomimo tego, istnieją sposoby na jej udekorowanie. Ruby nie wymaga deklaracji zmiennych, jedynie bardzo prostej konwencji, aby zaznaczyć w jakim zakresie żyje zmienna.

  • var może być zmienną lokalną.
  • @var jest polem instancji (zmienną instancji).
  • $var jest zmienną globalną.

Dzięki tej konwencji, programista może szybko zidentyfikować rodzaj zmiennej z którą ma do czynienia. Nie ma już potrzeby wstawiania słowa kluczowego self. przy każdym wystąpieniu zmiennej instancji.

Zaawansowane techniki

Ruby posiada bogactwo innych właściwości—niektóre z nich to:

  • Ruby obsługuje błędy poprzez wyjątki, zupełnie jak Java lub Python. Pozwala to na wykorzystanie dobrze znanego mechanizmu przez programistów tych języków.
  • Ruby posiada prawdziwy garbage collector typu mark-and-sweep dla wszystkich obiektów żyjących w pamięci obiektowej. Nie ma potrzeby przetrzymywania informacji na temat liczby odniesień do obiektu. Jak mówi Matz, “Wpływa to korzystnie na twoje zdrowie.”
  • Pisanie rozszerzeń do Rubiego jest prostsze niż w Perlu lub Pythonie i ma bardzo eleganckie API dostępne w języku C. Pozwala ono na wbudowanie interpretera Rubiego do aplikacji jako język skryptowy. Dostępny jest również interfejs SWIG.
  • Jeśli system operacyjny na to pozwala, Ruby pozwala na dynamiczne ładowanie bibliotek.
  • Ruby posiada wątki, które są niezależne od systemu operacyjnego. To znaczy, że są one dostępne na każdej platformie, niezależnie od tego, czy sama platforma wspiera wątki—można ich używać nawet w MS-DOS!
  • Ruby jest bardzo przenośny: rozwijany głównie na platformie GNU/Linux, ale może być używany na wielu typach UNIXów, Mac OS X, Windows 95/98/Me/NT/2000/XP, DOS, BeOS, OS/2, itd.

Odnośniki

1 Matz, wypowiedź na liście ruby-talk, May 12th, 2000.

2 Zobacz stronę Ruby on Rails aby dowiedzieć sie więcej.

3 Matz, w Wywiad z twórcą języka Ruby, Nov. 29th, 2001.

4 Matz, w Bloki i domnkięcia w Rubym, December 22nd, 2003.