Ilmus Ruby 3.4.0, dünaamiline objektorienteeritud programmeerimiskeel, mis keskendub arenduse kõrgele efektiivsusele ja sisaldab parimaid omadusi keeltest nagu Perl, Java, Python, Smalltalk, Eiffel, Ada ja Lisp. Projekti kood on levitatud BSD ("2-clause BSDL") ja "Ruby" litsentside all, mis viitab viimasele GPL litsentsi versioonile ja on ühilduv GPLv3-ga.
Peamised parandused:
- Lisatud uus identifikaator "it", mis on seotud nimetusteta parameetriga, mis määratakse vaikimisi blokis. Uus identifikaator on sarnane varem olemasolevale muutuja "_1" puhul, kui edastatakse ühte parameetrit blokki. Uue identifikaatori tutvustamine tuleneb soovist kõrvaldada segadus, mis tekib mitme parameetri edastamise korral blokis ("it" viitab sellele, et alati on ainult üks argument, samas kui "_1" ei ütle selgelt, kas on olemas parameeter "_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"]
- Vaikimisi on aktiivne Prism parsiija, mis on rohkem ülekantav, hõlpsasti hooldatav ja võimaldab töötada koodivigadega. Ruby koodi parsimiseks on saadaval meetodid Prism.parse(source) koodi AST-representatsiooni saamiseks, Prism.parse_comments(source) koodi kommentaaride eraldamiseks ja Prism.parse_success?(source) koodi vigade kontrollimiseks. Varem kasutusele võetud parsiijat "parse.y" saab taastada valiku "--parser=parse.y" abil.
- Socket teegis on sisse lülitatud ja vaikimisi aktiveeritud Happy Eyeballs (RFC 8305) algoritmi toetus, et valida optimaalsed protokollid, kui serverid on samal ajal kergesti ligipääsetavad IPv4 ja IPv6 aadresside kaudu. Happy Eyeballs algoritm lahendab IPv4 ja IPv6 aadressid ning saadab ühendusettepaneku kõigepealt IPv6 kaudu, seejärel üritab 250 ms pärast paralleelselt ühendust luua ka muude aadressidega, ei oota eelnevalt tehtud ühendusettepanekute tulemusi. Aktiivseks jääb esimesena loodud ühendus, teised suletakse. Enne seda, Ruby koodis TCPSocket.new ja Socket.tcp meetodite kutsumine viis järjestikuste IPv4/IPv6 aadresside lahendamis- ja ühendmisprotsessideni, mis põhjustas viivitusi, näiteks juhul, kui esimene ühenduse katse oli IPv6 kaudu, aga süsteem ei toetanud IPv6-d. Vanema käitumise taastamiseks saab kasutada keskkonnamuutujat "RUBY_TCP_NO_FAST_FALLBACK=1", sätet "Socket.tcp_fast_fallback=false" või argumenti "fast_fallback: false" meetodite väljakutsumisel.
- YJIT JIT-koodikomplektori optimeerimise protsess jätkub, mida arendavad e-kaubanduse platvormi Shopify arendajad, kes töötavad Ruby programmide, mis kasutavad Rails raamistikke ja kutsuvad palju meetodeid, jõudluse suurendamise algatuse nimel. Erinevalt MJIT JIT-koodikomplektorist, rakendab uus YJIT baassegmentide versioonimise (LBBV - Lazy Basic Block Versioning) meetodite täismahulise töötlemise asemel ja on integreeritud JIT-koodikomplektor, mis on kirjutatud Rust keeles. Tänu LBBV-le kompileerib JIT alguses ainult meetodi alguse ja kompileerib ülejäänud osa näiteks hiljem, pärast seda, kui täitmise käigus on kindlaks tehtud muutuja ja argumentide tüübid.
Uues versioonis on enamikes testides x86_64 ja ARM64 süsteemide jaoks YJIT jõudlust tõusnud. Uued optimeerimised on lisatud: registrite rakendamine kohalike muutujate ja meetodite argumentide jaoks; Ruby-implementatsioonid Array#each, Array#select ja Array#map; tühjade meetodite ja konstantide, enda näidise või sisendi argumendi tagastavate meetodite inline-lahtiseletamine; teatud meetodite jaoks eraldi koodigeneraatorid; süvendi töötluse optimeerimine (String#getbyte, String#setbyte); bititegevuste kiirus.
Mälu tarbimist on vähendatud metadate tihendamise ja ühtse piirangute süsteemi rakendamise kaudu. Lisatud on valik "--yjit-mem-size", mis on vaikimisi seadistatud väärtusele 128MiB ja mõjutab üldist mälu kasutamist. Lisatud on valik "--yjit-log" jälgimise sisse lülitamiseks, et teada saada, millist koodi kompileeritakse.
- Tallennuste, mis on kogutud jagatud raamatukogudena, dünaamilise laadimise võimalus. Nõutava kogumise raamatukogu määramiseks tuleks kasutada keskkonnamuutujat RUBY_GC_LIBRARY. Vaikimisi rakendatav sisseehitatud koguja nüüd võib olla kompileeritud eraldi raamatukoguna. Alternatiivina on lisatud Rust keeles kirjutatud MMTk raamistiku põhine koguja.
- Nimega argumentide meetoditesse edastamine, mille väärtus on nil, on lubatud. Argumente, mille väärtus on «**nil», töödeldakse nüüd tühja hargina «**{}» ilma nimete argumentide edastamiseta meetodisse.
- Indeksites on blokeeringute edastamine ja nimete argumentide määramine, näiteks «a[&b]=c» ja «o[1, a: 1]», keelatud.
- Meetodit JSON.parse on optimeeritud, mis nüüd töötab poolteist korda kiiremini kui paketis json 2.7.
Allikas: opennet.ru
