Ruby (język programowania)

Ruby (wym. ) – interpretowany, w pełni obiektowy i dynamicznie typowany język programowania stworzony w 1995 roku przez Yukihiro Matsumoto (pseudonim Matz). W języku angielskim ruby oznacza rubin.

Ruby bazuje na wielu językach, takich jak CLU, Eiffel, Lisp, Perl, Python czy Smalltalk. Składnia jest zorientowana liniowo i oparta na składni CLU oraz, w mniejszym stopniu, Perla.

Rozwój języka 

Od roku 2003 lawinowo zdobywa nowych zwolenników, głównie za sprawą popularnego frameworku do tworzenia aplikacji internetowych o nazwie Ruby on Rails, tworzonego przez grupę programistów pod kierownictwem Davida Heinemeiera Hanssona.

W roku 2005 według statystyk sklepu Amazon.com dwie najpopularniejsze książki na temat Ruby i Ruby on Rails były najlepiej sprzedawanymi pozycjami z kategorii Programowanie.

30 stycznia 2009 roku została wydana wersja 1.9.1. Poprawiła ona m.in. obsługę Unicode i wydajność interpretera, dzięki wprowadzeniu nowego mechanizmu o nazwie YARV (ang. ).

24 lutego 2013 została wydana wersja 2.0.0. Kolejne wersje były zwyczajowo wydawane w święta Bożego Narodzenia: 2.1.0 w 2013 roku, 2.2.0 w 2014, 2.3.0 w 2015, 2.4.0 w 2016 i 2.5.0 w 2017. Data ta jest nawiązaniem do 25 grudnia 1996, kiedy została wydana wersja 1.0.

W lutym 2018 roku wydana została wersja preview Ruby 2.6, która zawiera m.in. wstępną wersję wsparcia dla kompilacji just-in-time, mającej znacząco przyspieszyć wykonywanie programów w Ruby.

W 2020 roku wydano Ruby 3.0. Wersja ta koncentruje się wokół hasła „Ruby 3x3”, które oznacza m.in. że wersja 3 jest trzy razy szybsza od wersji 2.0. Kolejnym znaczącym usprawnieniem jest wprowadzenie zupełnie nowego modelu współbieżności, opartego o „ractory” (pierwotnie mające się nazywać „gildiami”). Kod wykonywany w obrębie ractory jest wykonywany z użyciem Global Interpreter Lock, jednak różne ractory są wykonywane w pełni współbieżnie.

Cechy

Odśmiecanie pamięci 
Ruby posiada automatyczne odśmiecanie pamięci (ang. ), w związku z czym programiści nie muszą zajmować się ręcznym nią zarządzaniem. W standardowej implementacji MRI w starych wersjach stosowany był wolny  typu , który aby wykonać czyszczenie musiał zatrzymać wykonanie programu () i był krytykowany za zbyt wolne działania. W wersji 2.1 wprowadzono nowy generacyjny system odśmiecania pamięci (), który jednak okazał się niewystarczająco poprawiony. Z tego powodu w wersji 2.2.0 pojawiła się inna, inkrementalna, implementacja . Dodano w niej również odśmiecanie symboli, które w poprzednich wersjach nie były nigdy sprzątane.

Wszystko jest obiektem 
W języku Ruby wszystko jest obiektem. Oznacza to, że nie ma podziału na obiekty zachowujące się jak obiekt oraz inne (na przykład prymitywy w Javie).

"abc".length   #=> 3
1.to_s         #=> "1"
1.class        #=> Fixnum
Fixnum.class   #=> Class (również klasa jest obiektem)

Singleton class / eigenclass 
W każdym obiekcie metody pochodzące z klasy mogą być nadpisane bez stosowania jawnego dziedziczenia. Wynika to z faktu, że każdy obiekt jest instancją tzw. singleton class (nie mylić z wzorcem projektowym Singleton) lub eigenclass, która w drzewie hierarchii dziedziczenia znajduje się pomiędzy samym obiektem a jego jawną klasą.

W poniższym przykładzie metoda greet obiektu y zostaje nadpisana.

class Foo
  def greet
    "Hello, world!"
  end
end

x = Foo.new
y = Foo.new

class << y
  # nadpisanie metody tylko w eigenclass obiektu y
  def greet
    "Goodbye, world!"
  end
end

x.greet
#=> "Hello, world!"
y.greet
#=> "Goodbye, world!"

Przenośność 
Ponieważ Ruby jest językiem interpretowanym, programy pisane w Ruby charakteryzują się wysoką przenośnością pomiędzy platformami (istnieją implementacje na wiele systemów Uniksowych, DOS, Windows, OS X, BeOS itd.).

REPL 
Standardowa dystrybucja Ruby zawiera program IRB (), który stanowi REPL dla języka i pozwala na interaktywne eksperymentowanie z jego funkcjami lub bibliotekami. Przykładowa sesja IRB (Ruby 2.1.5):

$ irb
2.1.5 :001 > def double(x)
2.1.5 :002?>   x * 2
2.1.5 :003?>   end
 => :double
2.1.5 :004 > double(3)
 => 6
2.1.5 :005 > double("abc")
 => "abcabc"
2.1.5 :006 > puts "Hello world!"
Hello world!
 => nil

Inne 
 iteratory
 przeciążanie operatorów (ang. )
 normalne i zaawansowane właściwości zorientowania obiektowego (klasa, metoda...)
 obsługa wyjątków (ang. )
 wyrażenia regularne wbudowane w składnię
 liczby całkowite o dowolnych rozmiarach
 dodawanie metod do instancji klasy – możliwa jest zmiana lub dodanie metody do instancji danej klasy
 bloki i lambdy () – wygodne przekazywanie funkcji jako parametrów
 „Duck typing” – rozpoznawanie typów na podstawie ich zachowania, a nie deklaracji
 moduły – rodzaj wielodziedziczenia pozwalający włączyć gotową implementację zbioru metod do danej klasy
 możliwość zmiany praktycznie wszystkiego – dodanie dodatkowych metod do klasy Array, czy zmiana sposobu drukowania liczb całkowitych są niezmiernie proste.
 zmienne leksykalne modyfikowalne w czasie działania programu

Licencja 
Ruby jest rozwijany jako otwarte oprogramowanie i dostępny na licencji GPL oraz na własnej licencji wymagającej zmiany nazw plików wykonywalnych w przypadku zamknięcia kodu.

Implementacje 
Główna implementacja języka Ruby, utrzymywana m.in. przez Matsumoto, jest napisana w języku C. Standardową nazwą używaną do jej określania jest CRuby. Można jednak spotkać się ze stosowaniem nazwy MRI („Matz’s Ruby Interpreter”). Istnieją również inne implementacje języka. Wśród nich najistotniejsze to:

 JRuby – wersja działająca na Wirtualnej maszynie Javy; wspiera, w odróżnieniu od CRuby, pełną współbieżność (bez Global Interpreter Lock) oraz kompatybilność z bibliotekami Javy.
 TruffleRuby – implementacja języka oparta o GraalVM (Oracle), koncentrująca się na wydajności. Jej najważniejszą cechą jest wsparcie dla rozszerzeń pisanych w języku C, a więc dotąd dostępnych wyłącznie w implementacji CRuby.

Nierozwijane 

 MagLev – implementacja bazująca na maszynie wirtualnej GemStone S/3.1 od VMware, koncentrująca się głównie na wydajności. Wersja 1.0 została wydana w 2011 roku, od tamtej pory jest praktycznie nierozwijana.
 Rubinius – interpreter Ruby, którego głównym celem jest, by jak największa jego część była napisana w samym Ruby (używając LLVM). Inne fragmenty napisane są w C++. Rubinius, podobnie jak JRuby, nie posiada GIL i wspiera pełną współbieżność. Ostatnia wersja (5.0) została wydana w maju 2020 roku.

Zobacz też 
 Ruby on Rails – popularny framework aplikacji webowych, napisany w Ruby

Przypisy

Bibliografia

Linki zewnętrzne 

 Witryna projektu Ruby
 Witryna poświęcona dokumentacji języka 

Języki skryptowe