Ilmus Ruby 4.0.0, dünaamiline objektorienteeritud programmeerimiskeel, mis keskendub kõrgele arendusefektiivsusele ja sisaldab parimaid jooni keeltest nagu Perl, Java, Python, Smalltalk, Eiffel, Ada ja Lisp. Projekti kood levitatakse BSD litsentside („2-clause BSDL“) ja „Ruby“ litsentsi alusel, mis viitab viimasele GPL litsentsi versioonile ja on ühilduv GPLv3-ga.
Peamised parandused:
- Komplekti kuulub uus ZJIT kompilaator, mille positsioneerimine on järgmise genereerimise Ruby JITina. Vaikimisi kasutatakse endiselt YJIT kompilaatorit, ZJIT on aga valikuna kaasatud (aktiveeritakse lipuga „—zjit“). Nagu YJIT, on uus JIT kompilaator kirjutatud Rust keeles Shopify arendajate meeskonna poolt Ruby programmide jõudluse suurendamise algatuse raames, mis kasutavad Rails raamistikku ja kutsuvad välja väga palju meetodeid. Praeguses arenguetapis on ZJIT kiiremini kui tõlkija, kuid jääb YJITist jõudluses maha (oodatakse, et Ruby 4.1 versioonis stabiliseeritakse ZJIT ja see ületab YJITi jõudluses).
Erinevalt YJIT-st tõlgendab uus JIT-kompilaator YARV-i virtuaalmasina byte-koodi mitte madala taseme vaheesitust, mis on lähedane masina koodile, vaid kõrge taseme SSA (Static Single Assignment) vaheesitust, mis võimaldab täiendavate optimeerimisfaaside teostamist ja suurte koodiblokkide optimeerimist, mitte ainult jooksvaid operatsioone. Uute osalejate kaasamiseks kasutab ZJIT klassikalist JIT-architektuuri, mis põhineb tõlgendaja ajaloolistel andmetel tüüpide kohta, erinevalt YJIT-is rakendatud keerulisest põhimoodulite versioneerimise tehnikast (LBBV — Lazy Basic Block Versioning).
- Eksperimentaalne Ruby::Box klass on lisatud isolatsioonimehhanismi rakendamiseks, mis võimaldab eraldada klasside, moodulite ja monkey-patchide (muudetud meetodite ja klasside atribuutide) täitmise ühes protsessis. Ruby::Box-i abil on samuti võimalik eraldada rakenduskoodi täitmine Ruby-raamatukogudest, tagada testide isolatsioon ja korraldada veebikäsitlejate paralleelne täitmine ühes protsessis. serverile rakendust (nt ejemplo, etappilise koodi versiooni asendamiseks või sõltuvuste värskendamiseks). Ruby::Box'i aktiveerimiseks tuleb seada keskkonnamuutuja „RUBY_BOX=1“. # foo.rb class String def self.foo = „foo“ end # main.rb box = Ruby::Box.new box.require(‘foo’)
- On uuendatud Ractor'i näitlejamudeli teostust, mis pakub „näitlejate“ (ruby actor) stiilis abstraktsiooni programmide turvalise samaaegse täitmise tagamiseks, kus vahetatakse sõnumeid. Lisatud on Ractor::Port klass, mis lahendab sõnumite saatmise ja vastuvõtmisega seotud probleemid. Ractor.shareable_proc meetod on lisatud, et lihtsustada Proc objektide jagamist erinevate näitlejate vahel. Andmestruktuuride optimeerimine on suunatud globaalsete lukustuste konfliktide vähendamisele ja CPU vahemälu tõhusama kasutamise suurendamisele. Järgmisel aastal plaanitakse Ractor tõsta stabiilsete võimaluste hulka. port1 = Ractor::Port.new port2 = Ractor::Port.new Ractor.new port1, port2 do |port1, port2| port1 << 1 port2 << 11 port1 << 2 port2 < 1, 2 2.times{ p port2.receive } #=> 11, 12
- Operaator „*nil“ tagastab nüüd koheselt tühja massiivi („[]“) ilma vahepealse meetodi „nil.to_a“ kutsumiseta, sarnaselt sellele, kuidas „**nil“ tagastab koheselt tühja hashi, ilma et kutsutaks „nil.to_hash“.
- Lubatud on jagada reaalooge koos loogiliste operaatoritega „||“, „&&“, „and“ ja „or“ nii, et järgmine rida algab operaatoriga. if condition1 && condition2 … end
- Lisatud on meetodid Array#find ja „Array#rfind“, mis võimaldavad elementide otsimist massiivis tõhusamalt, töötades kiiremini kui „array.reverse_each.find“ ja „Enumerable#find“.
- Klassid Set ja Pathname on viidud sisseehitatud klasside hulka.
- Rohkem võimalusi on lisatud paljudele põhiklassidele, nagu Binding, Enumerator, ErrorHighlight, Fiber, File, IO, Kernel, Math, Proc, Range, Socket, String, Thread.
- Sisseehitatud ja standardraamatukogu gem-modulite versioonid on ajakohastatud.
Allikas: opennet.ru
