Ruby to interpretowany, dynamiczny i obiektowy język programowania stworzony w latach dziewięćdziesiątych przez Yukihiro Matsumoto (ps. matz) – programistę pochodzącego z Kraju Kwitnącej Wiśni.
Zaczynamy
Składnia i gramatyka Ruby’ego przypominają nieco Pythona, chociaż ten pierwszy jest
trochę bardziej obiektowy: nawet liczby całkowite są instancjami klasy Fixnum
i pełnoprawnymi obiektami. Poza tym instancja danej klasy również zachowuje się jak
samodzielna klasa. Co to jest instancja i czym dokładnie jest klasa wyjaśnimy sobie
później.
Pamiętamy operator wyboru składowej z C++ i innych języków (zwany też operatorem kropki)? W Rubym, dzięki wszechobecnej obiektowości, można traktować go wręcz jako łącznik komunikatów, poprzez który obiekty, będące rezultatami wykonywanych operacji, wędrują od jednej metody do drugiej.
Ruby jest nieco bardziej „śmietniskowy” niż Python, ale znacznie mniej, niż
dominujący w tej kategorii Perl. Pisze się w nim przyjemnie i nie trzeba co rusz, jak
to bywa w Pythonie, nadużywać słowa kluczowego self
. Ludzie programujący w Rubym
doceniają elegancję i przyjemność wynikającą z programowania w języku, który
miejscami przypomina język naturalny. Ma to swoje dobre i złe strony.
Ruby stał się popularny dzięki środowisku Ruby on Rails (skr. RoR). Według zapewnień twórców i wielu użytkowników, można w nim szybko i przyjemnie stworzyć aplikację webową. Zawiera ono zbiór generatorów, które budują szkielety gotowych aplikacji, co znacznie ułatwia rozpoczynanie pracy, a duża społeczność i wiele gotowych komponentów sprawiają, że można naprawdę w kilkanaście minut stworzyć serwis WWW.
Programowanie obiektowe
Ruby jest językiem wieloparadygmatowym, to znaczy można w nim korzystać z różnych sposobów modelowania świata i pomagających w tym mechanizmów. Jednak dominującym paradygmatem jest programowanie obiektowe** (ang. object-oriented programming, skr. OOP).
Obiekty
Obiekty to struktury danych o zdefininowanych wcześniej polach i operacjach, które można na tych polach wykonać. Pozwalają łączyć dane i metody dostępu do tych danych.
Obiekty przypominają dane typów wbudowanych – również identyfikowane są nazwami i również zajmujące określone miejsca w pamięci – chociaż o ich wewnętrznych składnikach decyduje programista, a nie producent kompilatora czy interpretera.
Klasy
Określanie pól, które będą składowymi wykorzystywanych obiektów odbywa się podczas definiowania nowych typów danych – służą do tego klasy (ang. classes). Klasa jest wzorcem, w którym wyrażamy z czego będzie składał się każdy obiekt tworzonego obiektowego typu danych i jakie operacje będzie można na nim wykonać.
Dynamiczne typizowanie
Typy danych (ang. data types) pozwalają kompilatorowi lub interpreterowi na przewidzenie jakiego rozmiaru pamięć należy zarezerwować na obsługę konkretnej zmiennej czy konkretnego egzemplarza klasy (obiektu). W językach silnie typizowanych pozwalają też na wykonywanie tylko tych operacji na danych (np. funkcji czy procedur), które zadeklarowano jako obsługujące pewne typy. W ten sposób unika się pomyłek i przyspiesza działanie programu. Ceną, jaką się za to płaci jest z kolei mała elastyczność i konieczność budowania osobnych wersji klas dla każdego typu.
Języki dynamicznie typizowane pozwalają na wykrywanie typów w trakcie działania programu (ang. runtime). Tu również mogą występować testy typów, ale dokonuje ich programista podczas tworzenia metod, umieszczając odpowiednie warunki.
Innym mechanizmem jest też tzw. kacze typizowanie (ang. duck typing). Polega
ono na dynamicznym sprawdzaniu czy obiekt, który otrzymujemy (np. jako wartość
argumentu wywoływanej metody) zachowuje się w określony sposób. Konkretnie
oznacza to, że wyposażony jest w metody o określonych nazwach. Jeżeli na przykład
obiekt ma metodę ćwierkaj
, to zakładamy, że jego klasą jest Ptak
lub
pochodna. Oczywiście nie chodzi tu o dedukcję typu danych obiektu, ale
o sprawdzanie, czy obiekt jest w stanie wykonać pewną operację, a potem
skorzystanie z niej.
Instalacja interpretera
Instalacja interpretera polega na pobraniu źródeł, wypakowaniu ich, wywołaniu skryptu automatycznej konfiguracji, a następnie na kompilacji i zainstalowaniu w odpowiednim katalogu. Niektóre czynności wymagać mogą uprawnień administratora systemu.
Na szczęście istnieją projekty, których celem jest uproszczenie tego procesu. Dwa najpopularniejsze to RVM i rbenv. W procesie instalacji będziemy korzystali z tego pierwszego.
Wymagane oprogramowanie
Zanim przystąpimy do instalacji musimy się upewnić, że w systemie znajdują się
pliki nagłówkowe dla bibliotek glibc (glibc-dev
), pthread (libpthread-dev
),
OpenSSL (openssl-dev
), ncurses, readline (libreadline-dev
), a także
narzędzia do kompilacji: gcc
, automake
, m4
itp.