Ruby (język programowania)
Paradygmat | Wieloparadygmat : funkcjonalny , imperatywny , obiektowy , refleksyjny |
---|---|
Zaprojektowany przez | Yukihiro Matsumoto |
Deweloper | Yukihiro Matsumoto i in. |
Po raz pierwszy pojawiły się | 1995 |
Wersja stabilna | |
Dyscyplina pisania | Kaczka , dynamiczna , mocna |
Zakres | Leksykalne, czasem dynamiczne |
Język implementacji | C |
system operacyjny | Międzyplatformowe |
Licencja | Licencja rubinowa |
Rozszerzenia nazw plików | .rb |
Strona internetowa | ruby-lang.org |
Główne wdrożenia | |
Ruby MRI , TruffleRuby , YARV , Rubinius , MagLev , JRuby , MacRuby , RubyMotion , Mruby , IronRuby | |
Pod wpływem | |
Ada , Basic , C++ , CLU , Dylan , Eiffel , Lisp , Lua , Perl , Python , Smalltalk | |
pod wpływem | |
Clojure , CoffeeScript , Crystal , D , Elixir , Groovy , Ioke, Julia , Mirah , Nu , Ring , Rust , Swift | |
|
Ruby to interpretowany język programowania wysokiego poziomu ogólnego przeznaczenia, który obsługuje wiele paradygmatów programowania . Został zaprojektowany z naciskiem na produktywność i prostotę programowania. W języku Ruby wszystko jest obiektem, w tym prymitywne typy danych . Został opracowany w połowie lat 90. przez Yukihiro „Matz” Matsumoto w Japonii .
Ruby jest pisany dynamicznie i używa wyrzucania elementów bezużytecznych oraz kompilacji just-in-time . Obsługuje wiele paradygmatów programowania, w tym proceduralne , obiektowe i funkcjonalne . Według twórcy, na Ruby miał wpływ Perl , Smalltalk , Eiffel , Ada , BASIC , Java i Lisp .
Historia
Wczesna koncepcja
Matsumoto powiedział, że Ruby został poczęty w 1993 roku. W poście z 1999 roku na liście mailingowej ruby-talk opisuje niektóre ze swoich wczesnych pomysłów na język:
Rozmawiałem z moim kolegą o możliwości obiektowego języka skryptowego. Znałem Perla (Perl4, nie Perl5), ale niezbyt mi się podobał, ponieważ miał zapach języka zabawek (nadal ma). Język obiektowy wydawał się bardzo obiecujący. Znałem wtedy Pythona . Ale nie podobało mi się to, ponieważ nie sądziłem, że jest to prawdziwie zorientowany obiektowo język – funkcje OO wydawały się być dodatkiem do języka. Jako maniaczka językowa i fanka OO od 15 lat, naprawdę chciałam naprawdę zorientowanego obiektowo, łatwego w użyciu języka skryptowego. Szukałem ale nie mogłem znaleźć. Więc postanowiłem to zrobić.
Matsumoto opisuje projekt Ruby jako rdzeń prostego języka Lisp , z systemem obiektowym takim jak Smalltalk, blokami inspirowanymi funkcjami wyższego rzędu i praktycznymi narzędziami takimi jak Perl.
Nazwa „Ruby” powstała podczas sesji czatu online między Matsumoto i Keiju Ishitsuka 24 lutego 1993 r., Zanim jakikolwiek kod został napisany dla tego języka. Początkowo proponowano dwie nazwy: „ Koral ” i „ Rubin ”. Matsumoto wybrał to drugie w późniejszym e-mailu do Ishitsuki. Matsumoto później zwrócił uwagę na czynnik przy wyborze imienia „Ruby” - był to kamień narodzin jednego z jego kolegów.
Wczesne wydania
Pierwsze publiczne wydanie Ruby 0.95 zostało ogłoszone na japońskich krajowych grupach dyskusyjnych 21 grudnia 1995 r. Następnie w ciągu dwóch dni ukazały się trzy kolejne wersje Ruby. Wydanie zbiegło się w czasie z uruchomieniem japońskiej listy mailingowej ruby-list , która była pierwszą listą mailingową dla nowego języka.
Już na tym etapie rozwoju było dostępnych wiele funkcji znanych z późniejszych wydań Rubiego, w tym projektowanie obiektowe , klasy z dziedziczeniem, domieszki , iteratory , zamknięcia , obsługa wyjątków i wyrzucanie elementów bezużytecznych .
Po wydaniu Ruby 0.95 w 1995 roku, w kolejnych latach wydano kilka stabilnych wersji Ruby:
- Ruby 1.0: 25 grudnia 1996
- Ruby 1.2: grudzień 1998
- Ruby 1.4: sierpień 1999
- Ruby 1.6: wrzesień 2000
W 1997 roku w sieci pojawił się pierwszy artykuł o Ruby. W tym samym roku Matsumoto został zatrudniony przez netlab.jp do pracy nad Ruby jako pełnoetatowy programista.
W 1998 roku Matsumoto uruchomił Ruby Application Archive wraz z prostą anglojęzyczną stroną główną dla Ruby.
W 1999 roku rozpoczęła się pierwsza anglojęzyczna lista mailingowa ruby-talk , która sygnalizowała rosnące zainteresowanie językiem poza Japonią. W tym samym roku Matsumoto i Keiju Ishitsuka napisali pierwszą książkę o języku Ruby, The Object-performance Scripting Language Ruby (オブジェクト指向スクリプト言語 Ruby), która została opublikowana w Japonii w październiku 1999 roku. 20 książek o Ruby opublikowanych w języku japońskim.
Do 2000 roku Ruby był w Japonii bardziej popularny niż Python. We wrześniu 2000 roku została wydrukowana pierwsza anglojęzyczna książka Programming Ruby , która później została bezpłatnie udostępniona publicznie, co jeszcze bardziej zwiększyło popularność języka Ruby wśród anglojęzycznych. Na początku 2002 r. angielskojęzyczna ruby-talk otrzymywała więcej wiadomości niż japońskojęzyczna lista ruby-list , co świadczy o rosnącej popularności Ruby w świecie nie mówiącym po japońsku.
Rubin 1,8 i 1,9
Ruby 1.8 został pierwotnie wydany w sierpniu 2003 r., Był stabilny przez długi czas i został wycofany w czerwcu 2013 r. Chociaż jest przestarzały, nadal istnieje na nim oparty kod. Ruby 1.8 jest tylko częściowo kompatybilny z Ruby 1.9.
Ruby 1.8 był przedmiotem kilku standardów branżowych. Specyfikacje językowe języka Ruby zostały opracowane przez Centrum Promocji Otwartych Standardów Agencji Promocji Informatyki (japońskiej rządowej ) w celu przedłożenia ich Japońskiemu Komitetowi ds. Standardów Przemysłowych (JISC), a następnie Międzynarodowej Organizacji Normalizacyjnej (ISO). W 2011 roku została przyjęta jako japońska norma przemysłowa (JIS X 3017), a w 2012 roku jako norma międzynarodowa (ISO/IEC 30170).
Około 2005 roku zainteresowanie językiem Ruby wzrosło wraz z pojawieniem się Ruby on Rails , frameworka internetowego napisanego w języku Ruby. Railsom często przypisuje się rosnącą świadomość języka Ruby.
Wraz z Ruby 1.9.3, wydanym 31 października 2011 r., Ruby przeszedł z podwójnej licencji na Ruby License i GPL na podwójną licencję na Ruby License i dwuklauzulową licencję BSD. Przyjęcie wersji 1.9 zostało spowolnione przez zmiany z wersji 1.8, które wymagały przepisania wielu popularnych klejnotów stron trzecich . Ruby 1.9 wprowadza wiele znaczących zmian w stosunku do serii 1.8. Przykłady obejmują:
- blokuj zmienne lokalne (zmienne, które są lokalne dla bloku , w którym zostały zadeklarowane)
- dodatkowa składnia lambda :
f = -> ( a , b ) { stawia a + b }
- dodatkowa składnia literału Hash z dwukropkami dla kluczy symboli:
{ symbol_key : "value" } == { :symbol_key => "value" }
- obsługiwane jest kodowanie znaków dla poszczególnych ciągów znaków
- nowy interfejs API gniazda ( obsługa IPv6 )
-
wymagane_względne
bezpieczeństwo importu
Rubin 2
Ruby 2.0 miał być w pełni wstecznie kompatybilny z Ruby 1.9.3. Od oficjalnego wydania 2.0.0 24 lutego 2013 r. Znanych było tylko pięć (drobnych) niezgodności. Ruby 2.0 dodał kilka nowych funkcji, w tym:
- argumenty słów kluczowych metody,
- nowa metoda,
Module#prepend
, służąca do rozszerzania klasy, - nowy literał do tworzenia tablicy symboli,
- nowy interfejs API do leniwej oceny Enumerables i
- nowa konwencja używania #to_h do konwersji obiektów na skróty.
Począwszy od wersji 2.1.0, polityka wersjonowania Ruby została zmieniona, aby była bardziej podobna do wersjonowania semantycznego .
Ruby 2.2.0 zawiera przyspieszenia, poprawki błędów i aktualizacje bibliotek oraz usuwa niektóre przestarzałe interfejsy API. Przede wszystkim Ruby 2.2.0 wprowadza zmiany w obsłudze pamięci – przyrostowe wyrzucanie elementów bezużytecznych, obsługę wyrzucania elementów bezużytecznych symboli oraz opcję bezpośredniej kompilacji z jemalloc. Zawiera także eksperymentalną obsługę używania vfork (2) z system() i spawn() oraz dodaną obsługę specyfikacji Unicode 7.0. Od wersji 2.2.1 wydajność Ruby MRI na PowerPC64 został poprawiony. Funkcje, które stały się przestarzałe lub usunięte, obejmują callcc, bibliotekę DL, Digest::HMAC, lib/rational.rb, lib/complex.rb, GServer, Logger::Application, a także różne funkcje C API.
Ruby 2.3.0 zawiera wiele ulepszeń wydajności, aktualizacji i poprawek błędów, w tym zmiany w Proc#call, Socket i IO w użyciu słów kluczowych wyjątków, obsługę Thread#name, domyślne pasywne połączenia Net::FTP i usunięcie Rake z biblioteki stdlib. Inne godne uwagi zmiany to:
- Możliwość domyślnego oznaczania wszystkich literałów łańcuchowych jako zamrożonych, co w konsekwencji powoduje duży wzrost wydajności operacji na łańcuchach.
- Porównanie skrótów, aby umożliwić bezpośrednie sprawdzanie par klucz/wartość zamiast samych kluczy.
- Nowy operator bezpiecznej nawigacji
&.
co może ułatwić obsługę zer (np. zamiastif obj && obj . foo && obj . foo .bar )
możemy użyćif obj&.foo&.bar
. - Klejnot did_you_mean jest teraz domyślnie dołączany i wymagany podczas uruchamiania, aby automatycznie sugerować podobne dopasowania nazw w przypadku błędu NameError lub NoMethodError .
-
Hash#dig i Array#dig do łatwego wydobywania głęboko zagnieżdżonych wartości (np. podany
profil = { social : { wikipedia : { name : 'Foo Baz' } } }
, wartość Foo Baz można teraz pobrać przezprofile.dig(:social , :wikipedia, :imię)
). -
.grep_v(regexp)
, który oprócz innych nowych funkcji będzie dopasowywał wszystkie negatywne przykłady danego wyrażenia regularnego.
Ruby 2.4.0 zawiera ulepszenia wydajności do tablicy mieszającej, Array#max, Array#min i dostępu do zmiennych instancji. Inne godne uwagi zmiany to:
- Binding#irb: Rozpocznij sesję REPL podobną do binding.pry
- Ujednolicenie Fixnum i Bignum w klasie Integer
- Ciąg obsługuje odwzorowania wielkości liter Unicode, nie tylko ASCII
- Nowa metoda, Regexp#match?, która jest szybszą logiczną wersją Regexp#match
- Wykrywanie zakleszczenia wątków pokazuje teraz wątki wraz z ich śledzeniem wstecznym i zależnościami
Kilka znaczących zmian w Ruby 2.5.0 to ratowanie i zapewnienie , że instrukcje automatycznie używają otaczającego bloku kończącego (mniejsza potrzeba dodatkowych bloków początkowych ), łączenie metod za pomocą yield_self , obsługa pomiaru pokrycia gałęzi i pokrycia metody oraz łatwiejsze Transformacje skrótu za pomocą Hash#slice i Hash#transform_keys Oprócz tego wprowadzono wiele ulepszeń wydajności, takich jak szybsze przekazywanie bloków (3 razy szybciej), szybsze muteksy, szybsze szablony ERB i ulepszenia niektórych metod konkatenacji.
Kilka znaczących zmian w Ruby 2.6.0 to eksperymentalny kompilator just-in-time (JIT) i RubyVM::AbstractSyntaxTree (eksperymentalny).
Kilka znaczących zmian w Ruby 2.7.0 to dopasowanie wzorców (eksperymentalne), ulepszenia REPL, kompaktowanie GC oraz oddzielenie argumentów pozycyjnych i słów kluczowych.
Rubin 3
Ruby 3.0.0 został wydany w Boże Narodzenie 2020 roku. Znany jest jako Ruby 3x3, co oznacza, że programy w Ruby 3.0 działały trzy razy szybciej niż w Ruby 2.0. a niektóre zostały już zaimplementowane w pośrednich wydaniach w drodze od 2 do 3. Aby osiągnąć 3x3, Ruby 3 jest dostarczany z MJIT, a później YJIT, kompilatorami Just-In-Time, aby programy były szybsze, chociaż są one opisywane jako eksperymentalne i pozostają domyślnie wyłączone (włączone przez flagi w czasie wykonywania).
Kolejnym celem Ruby 3.0 jest poprawa współbieżności , a dwa dodatkowe narzędzia: Fibre Scheduler i eksperymentalny Ractor ułatwiają osiągnięcie tego celu. Ractor jest lekki i bezpieczny dla wątków, ponieważ jest to osiągane poprzez wymianę wiadomości, a nie udostępnianie obiektów.
Ruby 3.0 wprowadza język RBS do opisu typów programów Ruby do analizy statycznej . Jest oddzielony od ogólnych programów Ruby.
W Ruby 3.0 również wprowadzono pewne ulepszenia składni i zmiany w bibliotekach.
Ruby 3.1 został wydany w Boże Narodzenie 2021 roku. Zawiera YJIT, nowy, eksperymentalny kompilator Just-In-Time opracowany przez Shopify w celu zwiększenia wydajności rzeczywistych aplikacji biznesowych. Dołączony jest również nowy debugger . W tej wersji wprowadzono pewne ulepszenia składni i inne ulepszenia. Biblioteki sieciowe dla FTP , SMTP , IMAP i POP zostały przeniesione z domyślnych klejnotów do klejnotów w pakiecie.
Ruby 3.2 został wydany w Boże Narodzenie 2022 roku. Zapewnia obsługę uruchamiania w środowisku WebAssembly za pośrednictwem interfejsu WASI. Wyrażenia regularne również otrzymują pewne ulepszenia, w tym szybszy, zapamiętywany algorytm dopasowywania w celu ochrony przed niektórymi atakami ReDoS oraz konfigurowalne limity czasu dla dopasowywania wyrażeń regularnych. Ta wersja zawiera również dodatkowe funkcje debugowania i składni, w tym sugestię składni, a także wyróżnianie błędów. Kompilator MJIT został ponownie zaimplementowany jako standardowy moduł biblioteczny, podczas gdy YJIT , oparty na kompilatorze JIT obsługuje teraz więcej architektur w systemie Linux.
Tabela wersji
Wersja | Najnowsza wersja dla nastolatków | Pierwsza data wydania | Koniec fazy wsparcia | Koniec fazy utrzymania bezpieczeństwa |
---|---|---|---|---|
1.0 | — | 1996-12-25 | — | — |
1.8 | 1.8.7-p375 | 2003-08-04 | 2012-06 | 2014-07-01 |
1.9 | 1.9.3-p551 | 2007-12-25 | 2014-02-23 | 2015-02-23 |
2.0 | 2.0.0-p648 | 2013-02-24 | 2015-02-24 | 2016-02-24 |
2.1 | 2.1.10 | 2013-12-25 | 2016-03-30 | 2017-03-31 |
2.2 | 2.2.10 | 2014-12-25 | 2017-03-28 | 2018-03-31 |
2.3 | 2.3.8 | 2015-12-25 | 2018-06-20 | 2019-03-31 |
2.4 | 2.4.10 | 2016-12-25 | 2019-04-01 | 2020-04-01 |
2.5 | 2.5.9 | 2017-12-25 | 2021-04-05 | 2021-04-05 |
2.6 | 2.6.10 | 2018-12-25 | 2021-04-05 | 2022-04-05 |
2.7 | 2.7.7 | 2019-12-25 | 2022-04-12 | 2023-03-31 |
3.0 | 3.0.5 | 2020-12-25 | 2023-03-31 | TBA |
3.1 | 3.1.3 | 2021-12-25 | TBA | TBA |
3.2 | 3.2.0 | 2022-12-25 | TBA | TBA |
Legenda:
Stara wersja
Starsza wersja, nadal utrzymywana
Ostatnia wersja
|
Semantyka i filozofia
Matsumoto powiedział, że Ruby został zaprojektowany z myślą o produktywności i zabawie programistów, zgodnie z zasadami dobrego projektowania interfejsu użytkownika . Podczas Google Tech Talk w 2008 roku Matsumoto stwierdził dalej: „Mam nadzieję, że Ruby pomoże każdemu programiście na świecie być produktywnym, cieszyć się programowaniem i być szczęśliwym. To jest główny cel języka Ruby”. Podkreśla, że projektowanie systemów musi kłaść nacisk na potrzeby człowieka, a nie komputera:
Często ludzie, zwłaszcza inżynierowie komputerowi, skupiają się na maszynach. Myślą: „Dzięki temu maszyna będzie działać szybko. W ten sposób maszyna będzie działać wydajniej. W ten sposób maszyna zrobi coś, coś, coś”. Koncentrują się na maszynach. Ale w rzeczywistości musimy skupić się na ludziach, na tym, jak ludzie troszczą się o programowanie lub obsługę aplikacji maszyn. Jesteśmy mistrzami. Oni są niewolnikami.
Matsumoto powiedział, że jego głównym celem projektowym było stworzenie języka, którego sam lubił używać, poprzez zminimalizowanie pracy programisty i możliwego zamieszania. Powiedział, że nie zastosował zasady najmniejszego zdziwienia (POLA) do projektu Ruby; w dyskusji w maju 2005 roku na grupie dyskusyjnej comp.lang.ruby Matsumoto próbował zdystansować Ruby'ego od POLA, wyjaśniając, że ponieważ każdy wybór projektu będzie dla kogoś zaskakujący, stosuje osobisty standard oceny zaskoczenia. Jeśli ten osobisty standard pozostanie spójny, nie będzie wielu niespodzianek dla osób zaznajomionych z tym standardem.
Matsumoto zdefiniował to w następujący sposób w wywiadzie:
Każdy ma indywidualne pochodzenie. Ktoś może pochodzić z Pythona, ktoś może pochodzić z Perla i może być zaskoczony różnymi aspektami języka. Potem podchodzą do mnie i mówią: „Byłem zaskoczony tą cechą języka, więc Ruby łamie zasadę najmniejszego zaskoczenia”. Czekać. Czekać. Zasada najmniejszego zaskoczenia dotyczy nie tylko Ciebie. Zasada najmniejszego zaskoczenia oznacza zasadę najmniejszego mojego niespodzianka. A to oznacza zasadę najmniejszego zaskoczenia po tym, jak bardzo dobrze nauczysz się języka Ruby. Na przykład byłem programistą C++, zanim zacząłem projektować Ruby. Programowałem wyłącznie w C++ przez dwa, trzy lata. A po dwóch latach programowania w C++ nadal mnie to zaskakuje.
Ruby jest zorientowany obiektowo : każda wartość jest obiektem, w tym klasy i instancje typów, które wiele innych języków określa jako prymitywne (takie jak liczby całkowite , wartości logiczne i „ null ”). Zmienne zawsze zawierają odniesienia do obiektów. Każda funkcja jest metodą , a metody są zawsze wywoływane na obiekcie. Metody zdefiniowane w zakresie najwyższego poziomu stają się metodami klasy Object. Ponieważ ta klasa jest przodkiem każdej innej klasy, takie metody można wywoływać na dowolnym obiekcie. Są one również widoczne we wszystkich zakresach, skutecznie pełniąc rolę „globalnych” procedur. Rubinowe wsparcie dziedziczenie z dynamicznym wysyłaniem , mixinami i metodami singletonowymi (należy do pojedynczej instancji i jest dla niej zdefiniowana, a nie zdefiniowana w klasie). Chociaż Ruby nie obsługuje wielokrotnego dziedziczenia , klasy mogą importować moduły jako domieszki.
Ruby został opisany jako wieloparadygmatowy język programowania : umożliwia programowanie proceduralne (definiowanie funkcji/zmiennych poza klasami czyni je częścią głównego, „własnego” Obiektu), z orientacją obiektową (wszystko jest obiektem) lub programowaniem funkcyjnym ( to ma anonimowe funkcje , domknięcia i kontynuacje ; wszystkie instrukcje mają wartości, a funkcje zwracają ostatnią ocenę). Obsługuje introspekcję , refleksję i metaprogramowanie , a także obsługę wątków opartych na interpreterach . Ruby obsługuje typowanie dynamiczne i obsługuje polimorfizm parametryczny .
Według Ruby FAQ, składnia jest podobna do Perla , a semantyka jest podobna do Smalltalka , ale filozofia projektowania znacznie różni się od Pythona .
Cechy
- Całkowicie zorientowany obiektowo z dziedziczeniem , domieszkami i metaklasami
- Pisanie dynamiczne i kaczka
- Wszystko jest wyrażeniem (nawet instrukcje ) i wszystko jest wykonywane imperatywnie (nawet deklaracje )
- Zwięzła i elastyczna składnia, która minimalizuje szum składniowy i służy jako podstawa dla języków specyficznych dla domeny
- Dynamiczne odbicie i zmiana obiektów w celu ułatwienia metaprogramowania
- Domknięcia leksykalne , iteratory i generatory ze składnią blokową
- Dosłowna notacja dla tablic , skrótów , wyrażeń regularnych i symboli
- Osadzanie kodu w stringach ( interpolacja )
- Domyślne argumenty
- Cztery poziomy zasięgu zmiennych ( globalny , klasowy , instancyjny i lokalny ) oznaczone sigilami lub ich brakiem
- Zbieranie śmieci
- Kontynuacje pierwsza klasa
- Ścisłe reguły przymusu boolowskiego (wszystko jest prawdą oprócz
fałszu
inil
) - Obsługa wyjątków
- Przeciążenie operatora
- Wbudowana obsługa liczb wymiernych , liczb zespolonych i arytmetyki o dowolnej precyzji
- Niestandardowe zachowanie wysyłania (poprzez
method_missing
iconst_missing
) - Nici natywne i włókna kooperacyjne (włókna są cechą 1.9/ YARV )
- Obsługa Unicode i wielu kodowań znaków .
- Natywne API wtyczek w C
- Interactive Ruby Shell, interaktywny interpreter wiersza poleceń, którego można użyć do szybkiego testowania kodu ( REPL )
- Scentralizowane zarządzanie pakietami przez RubyGems
- Wdrożony na wszystkich głównych platformach
- Duża standardowa biblioteka, w tym moduły dla YAML , JSON , XML , CGI , OpenSSL , HTTP , FTP , RSS , przekleństwa , zlib i Tk
- Kompilacja w samą porę
Składnia
Składnia języka Ruby jest zasadniczo podobna do składni Perla i Pythona . Definicje klas i metod są sygnalizowane za pomocą słów kluczowych, podczas gdy bloki kodu mogą być definiowane za pomocą słów kluczowych lub nawiasów klamrowych. W przeciwieństwie do Perla, zmienne nie są obowiązkowo poprzedzane sigilem . Gdy jest używany, sigil zmienia semantykę zakresu zmiennej. Ze względów praktycznych nie ma rozróżnienia między wyrażeniami a stwierdzeniami . Podziały wierszy są znaczące i traktowane jako koniec instrukcji; średnik może być równoważnie użyty. W przeciwieństwie do Pythona, wcięcia nie są znaczące.
Jedną z różnic w stosunku do Pythona i Perla jest to, że Ruby utrzymuje wszystkie zmienne instancji całkowicie prywatne dla klasy i udostępnia je tylko za pomocą metod dostępu ( attr_writer
, attr_reader
itd.). W przeciwieństwie do metod „pobierających” i „ustawiających” innych języków, takich jak C++ lub Java , metody dostępu w języku Ruby można tworzyć za pomocą jednego wiersza kodu za pomocą metaprogramowania ; jednak metody akcesorów można również tworzyć w tradycyjny sposób C++ i Javy. Ponieważ wywołanie tych metod nie wymaga użycia nawiasów okrągłych, zmiana zmiennej instancji na pełną funkcję jest banalna, bez modyfikowania pojedynczej linii kodu wywołującego lub konieczności wykonywania jakiejkolwiek refaktoryzacji, uzyskując podobną funkcjonalność do właściwości C # i VB.NET członkowie.
Deskryptory właściwości Pythona są podobne, ale wymagają kompromisu w procesie programowania. Jeśli ktoś zaczyna w Pythonie od użycia publicznie udostępnionej zmiennej instancji, a później zmienia implementację tak, aby używała prywatnej zmiennej instancji ujawnionej przez deskryptor właściwości, może być konieczne dostosowanie kodu wewnętrznego klasy, aby używał zmiennej prywatnej zamiast właściwości publicznej . Projekt Ruby wymusza, aby wszystkie zmienne instancji były prywatne, ale zapewnia również prosty sposób deklarowania set
i get
metody. Jest to zgodne z ideą, że w Ruby nigdy nie uzyskuje się bezpośredniego dostępu do wewnętrznych elementów klasy spoza klasy; raczej przekazuje się wiadomość klasie i otrzymuje odpowiedź.
Implementacje
Interpreter Ruby Matza
Oryginalny interpreter języka Ruby jest często określany jako interpreter języka Ruby firmy Matz lub MRI. Ta implementacja jest napisana w C i wykorzystuje własną maszynę wirtualną specyficzną dla języka Ruby .
Standaryzowana i wycofana implementacja Ruby 1.8 została napisana w C jako jednoprzebiegowy język interpretowany .
Począwszy od Ruby 1.9 i kontynuując od Ruby 2.x i nowszych, oficjalnym interpreterem Ruby był YARV („Jeszcze kolejna Ruby VM”), a ta implementacja zastąpiła wolniejszą maszynę wirtualną używaną w poprzednich wersjach MRI.
Alternatywne implementacje
Od 2018 roku istnieje wiele alternatywnych implementacji języka Ruby, w tym JRuby , Rubinius i mruby . Każdy ma inne podejście, przy czym JRuby i Rubinius zapewniają kompilację just-in-time , a mruby również kompilację z wyprzedzeniem .
Ruby ma trzy główne alternatywne implementacje:
- JRuby , mieszana implementacja Java i Ruby działająca na wirtualnej maszynie Java . JRuby obecnie celuje w Ruby 3.1.x.
- TruffleRuby, implementacja Java wykorzystująca ramy implementacji języka Truffle z GraalVM
- Rubinius , maszyna wirtualna kodu bajtowego C++ , która używa LLVM do kompilacji do kodu maszynowego w czasie wykonywania. Kompilator kodu bajtowego i większość podstawowych klas są napisane w czystym języku Ruby. Rubinius obecnie celuje w Ruby 2.3.1.
Inne implementacje Ruby obejmują:
- MagLev , implementacja Smalltalk działająca na GemStone/S VM firmy GemTalk Systems
- mruby , implementacja zaprojektowana do osadzenia w kodzie C, podobnie jak Lua . Obecnie jest rozwijany przez Yukihiro Matsumoto i innych
- RGSS lub Ruby Game Scripting System, zastrzeżona implementacja używana przez serię oprogramowania RPG Maker do projektowania gier i modyfikacji silnika RPG Maker
- julializer, transpilator (częściowy) z Ruby do Julii . Może być użyty do znacznego przyspieszenia w porównaniu np. z implementacjami Ruby lub JRuby (może być przydatny tylko dla kodu numerycznego).
- Topaz, implementacja języka Ruby napisana w języku Python
- Opal, internetowy interpreter, który kompiluje Ruby do JavaScript
Inne nieistniejące już implementacje Ruby to:
- MacRuby , implementacja systemu Mac OS X w środowisku wykonawczym Objective-C . Jego odpowiednik na iOS nazywa się RubyMotion
- IronRuby implementacja na platformie .NET Framework
- Cardinal, implementacja dla maszyny wirtualnej Parrot
- Ruby Enterprise Edition , często skracane do ree , implementacja zoptymalizowana do obsługi dużych projektów Ruby on Rails
- HotRuby , implementacja JavaScript i ActionScript języka programowania Ruby
Dojrzałość implementacji Ruby jest zwykle mierzona ich zdolnością do uruchamiania frameworka Ruby on Rails (Rails), ponieważ implementacja jest złożona i wykorzystuje wiele funkcji specyficznych dla Ruby. Moment, w którym konkretna implementacja osiąga ten cel, nazywany jest „osobliwością Railsów”. Implementacja referencyjna, JRuby i Rubinius, wszystkie są w stanie uruchomić Railsy niezmodyfikowane w środowisku produkcyjnym.
Wsparcie platformy
Matsumoto pierwotnie rozwijał Ruby na systemie Sony NEWS-OS 3.x opartym na 4.3BSD , ale później przeniósł swoją pracę do SunOS 4.x, aw końcu do Linuksa . Do 1999 roku Ruby był znany z pracy w wielu różnych systemach operacyjnych . Nowoczesne wersje i implementacje języka Ruby są dostępne we wszystkich głównych systemach operacyjnych dla komputerów stacjonarnych, urządzeń przenośnych i serwerów. Ruby jest również obsługiwany na wielu platformach hostingowych w chmurze, takich jak Jelastic , Heroku , Google Cloud Platform i inne.
Narzędzia takie jak RVM i RBEnv ułatwiają instalację i partycjonowanie wielu wersji ruby oraz wielu „zestawów klejnotów” na jednym komputerze.
Repozytoria i biblioteki
RubyGems to menedżer pakietów Ruby. Pakiet Ruby nazywany jest „klejnotem” i można go zainstalować za pomocą wiersza poleceń. Większość klejnotów to biblioteki, choć istnieje kilka aplikacji, takich jak IDE . Na RubyGems.org znajduje się ponad 100 000 klejnotów Ruby .
Wiele nowych i istniejących bibliotek Ruby jest hostowanych w GitHub , usłudze oferującej hosting repozytoriów kontroli wersji dla Git .
Ruby Application Archive, w którym znajdowały się aplikacje, dokumentacja i biblioteki do programowania w Ruby, było utrzymywane do 2013 roku, kiedy to jego funkcja została przeniesiona do RubyGems.
Zobacz też
- Porównanie języków programowania
- Projekt Metasploit
- Why's (przejmujący) Przewodnik po Ruby
- Kryształ (język programowania)
- Rubin na szynach
Dalsza lektura
- Czarny, Dawid; Leo, Joseph (15 marca 2019), The Well-Grounded Rubyist (wydanie trzecie), Manning Publications , s. 584, ISBN 978-1617295218
- Metz, Sandi (22 sierpnia 2018 r.), Praktyczne projektowanie zorientowane obiektowo: zwinny elementarz przy użyciu języka Ruby (wydanie drugie), Addison-Wesley Professional , s. 288, ISBN 978-0-13-445647-8
- Cooper, Peter (12 lipca 2016), Beginning Ruby: From Novice to Professional (wyd. Trzecie), Apress , s. 492, ISBN 978-1484212790
- Carlson, Lucas; Richardson, Leonard (3 kwietnia 2015), Ruby Cookbook: Recipes for Object-Oriented Scripting (wyd. Drugie), O'Reilly Media , s. 963, ISBN 978-1449373719
- Fulton, Hal; Arko, André (2 marca 2015), The Ruby Way: Solutions and Techniques in Ruby Programming (wydanie trzecie), Addison-Wesley Professional , s. 816, ISBN 978-0-321-71463-3
- Tomasz, Dave; Fowler, Czad; Hunt, Andy (7 lipca 2013), Programming Ruby 1.9 & 2.0: The Pragmatic Programmers' Guide (wydanie czwarte), Pragmatic Bookshelf , s. 888, ISBN 978-1937785499
- McAnally, Jeremy; Arkin, Assaf (28 marca 2009), Ruby in Practice (wydanie pierwsze), Manning Publications , s. 360, ISBN 978-1933988474
- Flanagan, Dawid; Matsumoto, Yukihiro (25 stycznia 2008), The Ruby Programming Language (wydanie pierwsze), O'Reilly Media , s. 446 , ISBN 978-0-596-51617-8
- Baird, Kevin (8 czerwca 2007), Ruby by Example: Concepts and Code (wydanie pierwsze), No Starch Press , s. 326, ISBN 978-1593271480
- Fitzgerald, Michael (14 maja 2007), Learning Ruby (wydanie pierwsze), O'Reilly Media , s. 255 , ISBN 978-0-596-52986-4
Linki zewnętrzne
- Języki programowania oparte na klasach
- Dynamiczne języki programowania
- Dynamicznie typowane języki programowania
- Darmowe kompilatory i interpretery
- Wolne oprogramowanie zaprogramowane w C
- normy ISO
- japońskie wynalazki
- Wieloparadygmatowe języki programowania
- Obiektowe języki programowania
- Języki programowania stworzone w 1995 roku
- Języki programowania zgodne ze standardem ISO
- Ruby (język programowania)
- Języki skryptowe
- Oprogramowanie korzystające z licencji BSD
- Tekstowe języki programowania