Ka kishte një lëshim të Ruby 3.4.0, një gjuhë programimi dinamike orientuar në objekte, e fokusuar në efikasitetin e lartë të zhvillimit të software-it dhe që kombinon karakteristikat më të mira të Perl, Java, Python, Smalltalk, Eiffel, Ada dhe Lisp. Kodi i projektit shpërndahet nën licencat BSD ("2-clause BSDL") dhe "Ruby", e cila referon versionin më të fundit të licencës GPL dhe është e përputhshme me GPLv3.
Përmirësimet kryesore:
- Shtuar një identifikues të ri "it", i lidhur me parametrin e paemëruar që jepet në bllokun e paracaktuar. Identifikuesi i ri është i ngjashëm me ndryshoren e paranojës "_1" në rastin e kalimit të një parametri në bllok. Prezantimi i identifikuesit të ri shpjegohet me dëshirën për të eliminuar konfuzionin të shkaktuar nga mundësia e kalimit të disa parametrave në bllok ("it" nënkupton se gjithmonë ka vetëm një argument, ndërsa me shenjimin "_1", nuk është e qartë nëse ekziston parametri "_2"). [1, 2, 3].each { puts _1 } [1, 2, 3].each { puts it } ary = ["foo", "bar", "baz"] p ary.map { it.upcase } #=> ["FOO", "BAR", "BAZ"]
- Nga e drejta, përdoret parser-i Prism, i cili është më i transportueshëm, i lehtë për tu mirëmbajtur dhe lejon trajtimin e gabimeve në kod. Metodat e Prism për analizimin e kodit Ruby në programet e tij janë duke përdorur Prism.parse(source) për të marrë përfaqësimin e AST të kodit, Prism.parse_comments(source) për të nxjerrë komentet nga kodi dhe Prism.parse_success?(source) për të kontrolluar nëse ka gabime në kod. Për të kthyer parser-in e mëparshëm "parse.y", mund të përdoret opsioni "--parser=parse.y".
- Në bibliotekën "socket" është implementuar dhe përfshirë si parazgjedhje mbështetje për algoritmin Happy Eyeballs (RFC 8305) për zgjedhjen e protokollit optimal kur lidhet me host-et, të cilat janë në dispozicion në adresat IPv4 dhe IPv6. Përdorimi i algoritmit Happy Eyeball lejon klientin të rezolvojë menjëherë adresat IPv4 dhe IPv6 për host-in dhe dërgon kërkesën për lidhje përmes IPv6, pastaj me një vonesë prej 250 ms përpiqet të lidhë paralelisht me adresat e tjera të lidhura me host-in, pa pritur rezultatet nga përpjekjet e mëparshme të lidhjes. Lidhja që është krijuar e para mbetet aktive, ndërsa të tjerat mbyllen. Deri më tani, thirrja e metodave TCPSocket.new dhe Socket.tcp në programet Ruby ka çuar në përpjekje të gjithanshme për të rezolvuar adresat IPv4/IPv6 dhe për të lidhur, që ka rezultuar në vonesa, për shembull, kur përpjekja e parë ishte për lidhje përmes IPv6, por sistemi nuk e mbante IPv6. Për të kthyer sjelljen e vjetër, mund të përdoret variabla e mjedisit "RUBY_TCP_NO_FAST_FALLBACK=1", konfigurimi "Socket.tcp_fast_fallback=false" ose argumenti "fast_fallback: false" në thirrje.
- Janë vazhduar optimizimet e performancës së JIT-kompilatorit YJIT, i zhvilluar nga programuesit e platformës së tregtisë elektronike Shopify për iniciativën e rritjes së performancës së aplikacioneve Ruby që përdorin framework-un Rails dhe që bëjnë shumë thirrje metodash. Ndryshe nga JIT-kompilatori MJIT, YJIT i ri aplikon versionimin e blloqeve bazë (LBBV - Lazy Basic Block Versioning) në vend të përpunimit të metodave në tërësi dhe është realizuar si një JIT-kompilator i integruar, i shkruar në gjuhën Rust. Falë LBBV, JIT në fillim kompilon vetëm fillimin e metodës, ndërsa pjesa e mbetur kompilon në një kohë më vonë, pasi gjatë ekzekutimit të përcaktohen llojet e variablave dhe argumenteve që përdoren.
Në versionin e ri, në shumicën e testeve në sistemet x86_64 dhe ARM64 është arritur një rritje e performancës YJIT. Janë shtuar optimizime të reja: përdorimi i regjistrave për variablat lokalë dhe argumentet e metodave; angazhimi i realizimeve Ruby të Array#each, Array#select dhe Array#map; shpërndarja në linjë e metodave të zbrazëta dhe metodave që kthejnë konstantet, instancat e tyre ose argumentet hyrëse; gjeneratorët e veçantë të kodit për metoda të caktuara; optimizimi i punës me vargjet (String#getbyte, String#setbyte); përshpejtimi i operacioneve bitore.
Konsumimi i memories është reduktuar falë kompresimit të metadatat dhe implementimit të një sistemi të unifikuar të kufizimeve. Shtuar opsioni "--yjit-mem-size", i vendosur parazgjedhur në vlerën 128MiB dhe që ndikon në konsumimin total të memories. Shtuar opsioni "--yjit-log" për të aktivizuar ndihmësin e ndjekjes, për çfarë kodi kompilohen.
- Për sa i përket, është dhënë mundësia e ngarkimit dinamik të mbledhësve alternativë të mbeturinave, të ndërtuara në formën e bibliotekave të ndara. Për të specifikuar bibliotekën me mbledhësin e nevojshëm të mbeturinave, duhet të përdoret variabla e mjedisit RUBY_GC_LIBRARY. Mbledhësi i mbeturinave i integruar, i angazhuar parazgjedhur, tani mund të ndërtohet si një bibliotekë e veçantë. Si alternativë, është shtuar një mbledhës mbeturinash i bazuar në frameworkun MMTk, i shkruar në gjuhën Rust.
- Transmetimi në metodat e argumenteve të emëruara me vlerë nil është e lejuar. Argumentet me vlerën «**nil» tani përpunohen si një hesh «**{}» pa kaluar argumente të emëruara në metodë.
- Në indekset, ndalohet kalimi i bllokuesve dhe përcaktimi i argumenteve të emëruara, për shembull, «a[&b]=c» dhe «o[1, a: 1]».
- Metoda JSON.parse është optimizuar, tani funksionon një herë e gjysmë më shpejt se paketa json 2.7.
Burimi: opennet.ru
