Ruby (programovací jazyk) - Ruby (programming language)

Rubín
Ruby logo.svg
Paradigma Multi-paradigma : funkční , imperativní , objektově orientované , reflexní
Navrhl Yukihiro Matsumoto
Vývojář Yukihiro Matsumoto a kol.
Poprvé se objevil 1995 ; Před 26 lety ( 1995 )
Stabilní uvolnění
3.0.2  Upravte to na Wikidata / 7. července 2021 ; před 3 měsíci ( 7. července 2021 )
Kázeň při psaní Kachna , dynamická , silná
Rozsah Lexikální, někdy dynamické
Implementační jazyk C
OS Cross-platform
Licence Ruby License
Rozšíření názvu souboru .rb
webová stránka www .ruby-lang .org
Hlavní implementace
Ruby MRI , TruffleRuby , YARV , Rubinius , maglev , JRuby , MacRuby , RubyMotion , Mruby , IronRuby
Ovlivněn
Ada , Basic , C ++ , CLU , Dylan , Eiffel , Lisp , Lua , Perl , Python , Smalltalk
Ovlivněn
Clojure , CoffeeScript , Crystal , D , Elixir , Groovy , Ioke , Julia , Mirah , Nu , Ring, Rust , Swift

Ruby je interpretován , high-level , general-purpose programovací jazyk . Byl navržen a vyvinut v polovině 90. let Yukihiro „Matz“ Matsumoto v Japonsku .

Ruby je dynamicky psaný a používá sběr odpadu a kompilaci just-in-time . Podporuje více paradigmat programování , včetně procedurálního , objektově orientovaného a funkčního programování . Podle tvůrce Ruby ovlivnili Perl , Smalltalk , Eiffel , Ada , BASIC a Lisp .

Dějiny

Raný koncept

Matsumoto řekl, že Ruby byla koncipována v roce 1993. V příspěvku z roku 1999 do seznamu adresátů rubínové konverzace popisuje některé ze svých raných představ o jazyce:

Mluvil jsem s kolegou o možnosti objektově orientovaného skriptovacího jazyka. Znal jsem Perl (Perl4, ne Perl5), ale moc se mi to nelíbilo, protože to vonělo jazykem hraček (stále má). Objektově orientovaný jazyk vypadal velmi slibně. Tehdy jsem znal Python . Ale nelíbilo se mi to, protože jsem si nemyslel, že by to byl skutečný objektově orientovaný jazyk-funkce OO se zdály být doplňkem jazyka. Jako 15letý jazykový maniak a fanoušek OO jsem opravdu chtěl skutečný objektově orientovaný a snadno použitelný skriptovací jazyk. Hledal jsem, ale nenašel. Tak jsem se rozhodl to zvládnout.

Matsumoto popisuje design Ruby jako jádra jednoduchého jazyka Lisp s objektovým systémem jako Smalltalk, bloky inspirovanými funkcemi vyššího řádu a praktickými nástroji, jako je Perl.

Název „Ruby“ vznikl během online chatu mezi Matsumoto a Keiju Ishitsuka 24. února 1993, než byl pro daný jazyk napsán jakýkoli kód. Původně byla navržena dvě jména: „ Coral “ a „ Ruby “. Matsumoto si vybral to druhé v pozdějším e-mailu Ishitsuce. Matsumoto později zaznamenal faktor při výběru jména „Ruby“ - to byl kámen narození jednoho z jeho kolegů.

Raná vydání

První veřejné vydání Ruby 0,95 bylo oznámeno na japonských domácích diskusních skupinách 21. prosince 1995. Následně byly během dvou dnů vydány další tři verze Ruby. Vydání se shodovalo se spuštěním seznamu adresátů ruby-list v japonském jazyce , což byl první seznam adresátů pro nový jazyk.

V této fázi vývoje již bylo přítomno mnoho funkcí známých v pozdějších vydáních Ruby, včetně objektově orientovaného designu, tříd s dědičností, mixinů , iterátorů , uzávěrů , zpracování výjimek a shromažďování odpadků .

Po vydání Ruby 0,95 v roce 1995 bylo v následujících letech vydáno několik stabilních verzí Ruby:

  • Ruby 1.0: 25. prosince 1996
  • Ruby 1.2: prosinec 1998
  • Ruby 1.4: srpen 1999
  • Ruby 1.6: září 2000

V roce 1997 byl na webu publikován první článek o Ruby. Ve stejném roce byl Matsumoto najat společností netlab.jp, aby pracoval na Ruby jako vývojář na plný úvazek.

V roce 1998 spustil Matsumoto archiv aplikací Ruby a jednoduchou domovskou stránku v angličtině pro Ruby.

V roce 1999 začal první anglicky psaný seznam ruby-talk , který signalizoval rostoucí zájem o jazyk mimo Japonsko. Ve stejném roce Matsumoto a Keiju Ishitsuka napsali první knihu o Ruby, Objektově orientovaný skriptovací jazyk Ruby (オ ブ ジ ェ ク ト 指向 ス ク リ プ ト 言語 Ruby), která vyšla v Japonsku v říjnu 1999. Na začátku roku 2000 by ji následovalo přibližně 20 knih o Ruby vydaných v japonštině.

Do roku 2000 byl Ruby v Japonsku populárnější než Python. V září 2000 byla vytištěna první anglická kniha Programming Ruby , která byla později volně vydána veřejnosti, což dále rozšířilo přijetí Ruby mezi anglicky mluvícími. Na začátku roku 2002 dostával seznam e - mailů v ruby-talk v angličtině více zpráv než seznam ruby v japonštině , což demonstrovalo rostoucí popularitu Ruby v nejaponsky mluvícím světě.

Ruby 1.8 a 1.9

Ruby 1.8 byl původně vydán v srpnu 2003, byl dlouhodobě stabilní a byl vyřazen z provozu v červnu 2013. Ačkoli je zastaralý, stále na něm je založen kód. Ruby 1.8 je pouze částečně kompatibilní s Ruby 1.9.

Ruby 1.8 byl předmětem několika průmyslových standardů. Jazykové specifikace pro Ruby byly vyvinuty Střediskem pro podporu otevřených standardů Agentury pro podporu informačních technologií ( japonská vládní agentura) k předložení Japonskému výboru pro průmyslové standardy (JISC) a poté Mezinárodní organizaci pro normalizaci (ISO). Byl přijat jako japonský průmyslový standard (JIS X 3017) v roce 2011 a mezinárodní standard ( ISO/IEC 30170 ) v roce 2012.

Kolem roku 2005 vzrostl zájem o jazyk Ruby společně s Ruby on Rails , webovým frameworkem napsaným v Ruby. Rails se často připisuje zvyšování povědomí o Ruby.

S platností pro Ruby 1.9.3, vydanou 31. října 2011, přešel Ruby z dvojí licence podle licence Ruby a GPL na dvojí licenci podle licence Ruby a licence BSD s dvěma klauzulemi. Přijetí 1.9 bylo zpomaleno změnami od 1.8, které vyžadovaly přepsání mnoha oblíbených drahokamů třetích stran . Ruby 1.9 přináší řadu významných změn oproti řadě 1.8. Mezi příklady patří:

  • blokovat lokální proměnné (proměnné, které jsou lokální pro blok, ve kterém jsou deklarovány)
  • další syntaxe lambda :f = ->(a,b) { puts a + b }
  • další doslovnou syntaxi Hash pomocí dvojteček pro klíče symbolů:{symbol_key: "value"} == {:symbol_key => "value"}
  • Podporováno je kódování znaků na řetězec
  • nové API soketu ( podpora IPv6 )
  • require_relative zabezpečení importu

Ruby 2

Ruby 2.0 měl být plně zpětně kompatibilní s Ruby 1.9.3. K oficiálnímu vydání 2.0.0 24. února 2013 existovalo pouze pět známých (menších) nekompatibilit. Ruby 2.0 přidal několik nových funkcí, včetně:

  • argumenty klíčových slov metody,
  • nová metoda Module#prependpro rozšíření třídy,
  • nový literál pro vytváření řady symbolů,
  • nové API pro líné hodnocení Enumerables a
  • nová konvence použití #to_h k převodu objektů na hash.

Počínaje verzí 2.1.0 se zásady správy verzí Ruby změnily, aby se více podobaly sémantickému vytváření verzí .

Ruby 2.2.0 obsahuje zrychlení, opravy chyb a aktualizace knihovny a odstraňuje některá zastaralá rozhraní API. Nejpozoruhodnější je, že Ruby 2.2.0 zavádí změny v manipulaci s pamětí - inkrementální garbage collector, podpora pro garbage collector symbolů a možnost kompilovat přímo proti jemalloc. Obsahuje také experimentální podporu pro použití vfork (2) se systémy () a spawn () a přidanou podporu pro specifikaci Unicode 7.0. Od verze 2.2.1 byl vylepšen výkon Ruby MRI na PowerPC64 . Mezi zastaralé nebo odstraněné funkce patří callcc, knihovna DL, Digest :: HMAC, lib/rational.rb, lib/complex.rb, GServer, Logger :: Application a také různé funkce C API.

Ruby 2.3.0 obsahuje mnoho vylepšení výkonu, aktualizací a oprav chyb, včetně změn volání Proc#, použití soketů a vstupů a výstupů výjimečných klíčových slov, zpracování názvu vlákna#, výchozí pasivní připojení Net :: FTP a odebrání Rake ze stdlib. Mezi další významné změny patří:

  • Možnost označit všechny řetězcové literály jako zmrazené ve výchozím nastavení s následně velkým zvýšením výkonu v řetězcových operacích.
  • Porovnání hashování umožňuje přímou kontrolu párů klíč/hodnota místo pouze klíčů.
  • Nový bezpečný navigační operátor, &. který může usnadnit nulové ovládání (např. Místo toho můžeme použít ).if obj && obj.foo && obj.foo.barif obj&.foo&.bar
  • Did_you_mean klenot je nyní dodáván standardně a požadované při startu automaticky navrhnout podobným názvem utkání na NameError nebo NoMethodError .
  • Hash#dig a Array#dig pro snadné extrahování hluboce vnořených hodnot (např. Vzhledem k tomu , že hodnotu Foo Baz lze nyní načíst pomocí ).profile = { social: { wikipedia: { name: 'Foo Baz' } } }profile.dig(:social, :wikipedia, :name)
  • .grep_v(regexp) který bude kromě všech nových funkcí odpovídat všem negativním příkladům daného regulárního výrazu.

Ruby 2.4.0 obsahuje vylepšení výkonu hashovací tabulky, pole#max, pole#min a přístupu k proměnným instancím. Mezi další významné změny patří:

  • Vazba#irb: Spusťte relaci REPL podobně jako binding.pry
  • Sjednotit Fixnum a Bignum do Integer třídu
  • Řetězec podporuje mapování případů Unicode, nejen ASCII
  • Nová metoda, Regexp#match ?, která je rychlejší booleovskou verzí Regexp#match
  • Detekce zablokování vláken nyní zobrazuje vlákna s jejich backtrace a závislostí

Několik pozoruhodných změn v Ruby 2.5.0 zahrnuje záchranu a zajištění toho, aby příkazy automaticky používaly okolní blok do-end (menší potřeba dalších bloků konce začátku ), řetězení metod s yield_self , podpora pokrytí větví a měření pokrytí metod a jednodušší Transformace hash s Hash#slice a Hash#transform_keys Kromě toho přichází řada vylepšení výkonu, jako je rychlejší předávání bloků (3krát rychlejší), rychlejší Mutexy, rychlejší šablony ERB a vylepšení některých metod zřetězení.

Několik pozoruhodných změn v Ruby 2.6.0 zahrnuje experimentální kompilátor just-in-time (JIT) a RubyVM :: AbstractSyntaxTree (experimentální).

Několik pozoruhodných změn v Ruby 2.7.0 zahrnuje Pattern Matching (experimentální), vylepšení REPL, GC zhutnění a oddělení pozičních a klíčových argumentů.

Ruby 3

Ruby 3.0.0 byl vydán na Štědrý den v roce 2020. Je známý jako Ruby 3x3. Jedním z jeho hlavních cílů bylo přepnout tlumočníka na kompilátor Just-In-Time, aby byly programy rychlejší.

Vydání Ruby 3.1 je plánováno na Štědrý den v roce 2021.

Tabulka verzí

Verze Nejnovější verze pro malé děti Datum prvního vydání Konec fáze podpory Konec fáze údržby zabezpečení
Stará verze, již není udržována: 1,0 NA 1996-12-25 NA NA
Stará verze, již není udržována: 1,8 1.8.7-p375 2003-08-04 2012-06 01.04.2014
Stará verze, již není udržována: 1.9 1.9.3-p551 25. prosince 2007 23. dubna 2014 23. 2. 2015
Stará verze, již není udržována: 2.0 2.0.0-p648 24. února 2013 24. 2. 2015 24. února 2016
Stará verze, již není udržována: 2.1 2.1.10 25. 12. 2013 30. března 2016 2017-03-31
Stará verze, již není udržována: 2.2 2.2.10 25. 12. 2014 28. 3. 2017 2018-03-31
Stará verze, již není udržována: 2.3 2.3.8 25. 12. 2015 2018-06-20 2019-03-31
Stará verze, již není udržována: 2.4 2.4.10 25. 12. 2016 2019-04-01 01.04.2020
Stará verze, již není udržována: 2.5 2.5.9 25. 12. 2017 2021-04-05 2021-04-05
Starší verze, ale stále udržovaná: 2.6 2.6.8 25. 12. 2018 2021-04-05 2022-04-05
Starší verze, ale stále udržovaná: 2.7 2.7.4 25. 12. 2019 TBA TBA
Aktuální stabilní verze: 3,0 3.0.2 25. 12. 2020 TBA TBA
Budoucí vydání: 3.1 3.1.0 2021-12-25 TBA TBA
Legenda:
Stará verze
Starší verze, stále udržovaná
Nejnovější verze
Nejnovější verze náhledu
Budoucí vydání

Sémantika a filozofie

Yukihiro Matsumoto , tvůrce Ruby

Matsumoto řekl, že Ruby je navržen pro produktivitu a zábavu programátora a dodržuje zásady dobrého návrhu uživatelského rozhraní . Na konferenci Google Tech Talk v roce 2008 Matsumoto dále uvedl: „Doufám, že Ruby pomůže každému programátorovi na světě být produktivní, bude si užívat programování a bude šťastný. To je hlavním účelem jazyka Ruby.“ Zdůrazňuje, že návrh systémů musí klást důraz na lidské, nikoli počítačové potřeby:

Lidé, zejména počítačoví inženýři, se často zaměřují na stroje. Myslí si: „Tím, že to udělá stroj, poběží rychle. Tím, že to udělá, stroj poběží efektivněji. Tím, že to udělá, bude něco něco, něco.“ Soustředí se na stroje. Ale ve skutečnosti se musíme zaměřit na lidi, na to, jak se lidé starají o programování nebo provozování aplikací strojů. Jsme mistři. Jsou to otroci.

Matsumoto řekl, že jeho primárním cílem designu bylo vytvořit jazyk, který sám rád používal, a to minimalizací práce programátora a možného zmatku. Řekl, že na návrh Ruby nepoužil princip nejmenšího úžasu (POLA); v diskusi z května 2005 o diskusní skupině comp.lang.ruby se Matsumoto pokusil distancovat Ruby od POLA s vysvětlením, že protože jakákoli volba designu bude pro někoho překvapivá, používá při hodnocení překvapení osobní standard. Pokud tento osobní standard zůstane konzistentní, pro ty, kteří jsou s tímto standardem obeznámeni, by došlo k několika překvapením.

Matsumoto to v rozhovoru definoval takto:

Každý má individuální zázemí. Někdo může pocházet z Pythonu, někdo jiný může pocházet z Perlu a mohou být překvapeni různými aspekty jazyka. Pak ke mně přišli a řekli: „Byl jsem překvapen touto vlastností jazyka, takže Ruby porušuje zásadu nejmenšího překvapení.“ Počkejte. Počkejte. Princip nejmenšího překvapení není jen pro vás. Princip nejmenšího překvapení znamená princip alespoň překvapení. A to znamená zásadu nejmenšího překvapení poté, co se Ruby naučíte velmi dobře. Například jsem byl programátorem C ++, než jsem začal navrhovat Ruby. V C ++ jsem programoval výhradně dva nebo tři roky. A po dvou letech programování v C ++ mě to stále překvapuje.

Ruby je objektově orientovaný : každá hodnota je objekt, včetně tříd a instancí typů, které mnoho jiných jazyků označuje jako primitiva (například celá čísla , logické hodnoty a „ null “). Proměnné vždy obsahují odkazy na objekty. Každá funkce je metoda a metody jsou vždy volány na objektu. Metody definované v rozsahu nejvyšší úrovně se stávají metodami třídy Object. Protože tato třída je předchůdcem každé jiné třídy, lze takové metody volat na jakýkoli objekt. Jsou také viditelné ve všech oblastech působnosti a účinně slouží jako „globální“ postupy. Ruby podporuje dědičnost pomocí dynamických metod odesílání , mixů a singletonů (patřících do jedné instance a definovaných pro jednu instanci , než aby byla definována ve třídě). Ačkoli Ruby nepodporuje vícenásobnou dědičnost , třídy mohou importovat moduly jako mixiny.

Ruby byl popsán jako programovací jazyk s více paradigmaty : umožňuje procedurální programování (definování funkcí/proměnných mimo třídy z nich dělá součást root, „self“ Object), s orientací na objekt (vše je objekt) nebo funkční programování (to má anonymní funkce , uzávěry a pokračování ; všechny příkazy mají hodnoty a funkce vracejí poslední hodnocení). Má podporu pro introspekci , reflexi a metaprogramování , stejně jako podporu pro vlákna založená na interpretech . Ruby nabízí dynamické psaní a podporuje parametrický polymorfismus .

Podle Ruby FAQ je syntaxe podobná Perlu a sémantika je podobná Smalltalk , ale výrazně se liší od Pythonu .

Funkce

Syntax

Syntaxe Ruby je zhruba podobná syntaxi Perlu a Pythonu . Definice tříd a metod jsou signalizovány klíčovými slovy, zatímco bloky kódu lze definovat buď pomocí klíčových slov, nebo závorek. Na rozdíl od Perlu nejsou proměnné povinně předponovány sigilem . Při použití sigil změní sémantiku rozsahu proměnné. Z praktických důvodů neexistuje žádný rozdíl mezi výrazy a prohlášeními . Konce řádků jsou významné a jsou brány jako konec příkazu; ekvivalentně může být použit středník. Na rozdíl od Pythonu není odsazení významné.

Jedním z rozdílů z Python a Perl je Ruby udržuje všechny jeho instance proměnných zcela soukromé třídy a vystavuje je pouze přístupový objekt metod ( attr_writer, attr_reader, atd.). Na rozdíl od metod „getter“ a „setter“ jiných jazyků, jako je C ++ nebo Java , lze přístupové metody v Ruby vytvořit pomocí jednoho řádku kódu prostřednictvím metaprogramování ; přístupové metody lze však také vytvořit tradičním způsobem v C ++ a Javě. Jak vyvolání těchto metod nevyžaduje použití závorek, je triviální změnit proměnnou instance do plné funkce, aniž by se měnil jeden řádek volání kód nebo mají dělat žádné refaktorování dosažení podobné funkce jako C # a VB.NET majetku členů.

Popisy vlastností Pythonu jsou podobné, ale přicházejí s kompromisem v procesu vývoje. Pokud jeden začíná v Pythonu pomocí veřejně přístupné proměnné instance a později změní implementaci tak, aby používala proměnnou soukromé instance vystavenou prostřednictvím deskriptoru vlastností, bude možná nutné upravit kód interní pro třídu, aby používal spíše soukromou proměnnou než veřejnou vlastnost . Ruby's design nutí všechny proměnné instance být soukromé, ale také poskytuje jednoduchý způsob deklarace seta getmetody. To je v souladu s myšlenkou, že v Ruby člověk nikdy přímo nepřistupuje k interním členům třídy mimo třídu; spíše předá zprávu třídě a dostane odpověď.

Implementace

Matzův tlumočník Ruby

Původní Ruby tlumočník je často označován jako Matzův Ruby tlumočník nebo MRI. Tato implementace je napsána v jazyce C a používá vlastní virtuální stroj specifický pro Ruby .

Standardizovaná a vyřazená implementace Ruby 1.8 byla napsána v jazyce C jako interpretovaný jazyk s jedním průchodem .

Počínaje Ruby 1.9 a pokračováním Ruby 2.xa výše je oficiálním tlumočníkem Ruby YARV („Yet Another Ruby VM“) a tato implementace nahradila pomalejší virtuální stroj používaný v předchozích vydáních MRI.

Alternativní implementace

Od roku 2018 existuje řada alternativních implementací Ruby, včetně JRuby , Rubinius a mruby . Každý z nich má jiný přístup, přičemž JRuby a Rubinius poskytují kompilaci just-in-time a mruby také kompilaci předem .

Ruby má tři hlavní alternativní implementace:

  • JRuby , smíšená implementace Java a Ruby, která běží na virtuálním počítači Java . JRuby v současné době cílí na Ruby 2.5.
  • TruffleRuby , implementace Java pomocí implementačního rámce jazyka Truffle s GraalVM
  • Rubinius , virtuální stroj s bajtovým kódem C ++, který používá LLVM ke kompilaci do strojového kódu za běhu. Kompilátor bytecode a většina základních tříd jsou napsány v čistém Ruby. Rubinius se aktuálně zaměřuje na Ruby 2.3.1.

Mezi další implementace Ruby patří:

Dalšími dnes již zaniklými implementacemi Ruby byly:

Zralost implementací Ruby bývá měřena jejich schopností spustit rámec Ruby on Rails (Rails), protože implementace je složitá a využívá mnoho funkcí specifických pro Ruby. Bod, kdy konkrétní implementace dosáhne tohoto cíle, se nazývá „singularita Rails“. Referenční implementace, JRuby a Rubinius, dokážou spustit Rails bez úprav v produkčním prostředí.

Podpora platformy

Matsumoto původně vyvinul Ruby na systému Sony NEWS -OS 3.x založeném na 4.3BSD , ale později svou práci migroval na SunOS 4.x a nakonec na Linux .

V roce 1999 bylo známo, že Ruby funguje v mnoha různých operačních systémech , včetně NEWS-OS, SunOS, AIX , SVR4 , Solaris , NEC UP-UX , NeXTSTEP , BSD, Linux, Mac OS , DOS , Windows a BeOS .

Moderní verze a implementace Ruby jsou k dispozici v mnoha operačních systémech, jako jsou Linux, BSD, Solaris, AIX, macOS , Windows, Windows Phone , Windows CE , Symbian OS , BeOS, OpenVMS a IBM i .

Programovací jazyk Ruby je podporována v celé řadě cloud hosting platforem, jako je Jelastic , Heroku , Google Cloud Platform a dalších.

Repozitáře a knihovny

RubyGems je správce balíčků Ruby. Balíček Ruby se nazývá „drahokam“ a lze jej nainstalovat pomocí příkazového řádku. Většina drahokamů jsou knihovny, i když existuje několik aplikací, jako jsou IDE . Na RubyGems.org je hostováno více než 10 000 drahokamů Ruby .

Mnoho nových i stávajících knihoven Ruby je hostováno na GitHubu , službě, která nabízí hostování úložiště správy verzí pro Git .

Ruby Application Archive, který hostoval aplikace, dokumentaci a knihovny pro programování Ruby, byl udržován až do roku 2013, kdy byla jeho funkce převedena na RubyGems.

Viz také

Reference

Další čtení

externí odkazy