Llançament del llenguatge de programació Ruby 3.2

Es va llançar Ruby 3.2.0, un llenguatge de programació dinàmic orientat a objectes que és molt eficient en el desenvolupament de programes i incorpora les millors característiques de Perl, Java, Python, Smalltalk, Eiffel, Ada i Lisp. El codi del projecte es distribueix sota les llicències BSD ("2-clause BSDL") i "Ruby", que fa referència a la darrera versió de la llicència GPL i és totalment compatible amb GPLv3.

Principals millores:

  • S'ha afegit un port inicial de l'intèrpret CRuby, que es compila en codi intermedi WebAssembly per executar-se en un navegador web o en temps d'execució autònoms com ara wasmtime. Per a la interacció directa amb el sistema operatiu quan s'executa per separat, s'utilitza l'API WASI (WebAssembly System Interface). Entre altres coses, es proporciona un embolcall VFS a la part superior de WASI, que us permet empaquetar tota l'aplicació Ruby en una presentació en forma d'un únic fitxer wasm. L'execució en un navegador es pot utilitzar per crear serveis web de formació i demostració com TryRuby. En l'etapa actual de desenvolupament, el port passa amb èxit les suites de proves bàsiques i d'arrencada, que no utilitzen l'API Thread. El port tampoc és compatible amb fibres, excepcions o recollida d'escombraries.
  • El compilador JIT en procés YJIT, creat pels desenvolupadors de la plataforma de comerç electrònic Shopify com a part d'una iniciativa per augmentar el rendiment dels programes Ruby que utilitzen el marc Rails i criden molts mètodes, s'ha declarat estable i preparat per ús de producció. La diferència clau amb el compilador MJIT JIT utilitzat anteriorment, que es basa en processar mètodes sencers i utilitza un compilador extern en llenguatge C, és que YJIT utilitza Lazy Basic Block Versioning (LBBV) i conté un compilador JIT integrat. Amb LBBV, JIT compila primer només l'inici del mètode, i compila la resta un temps després, després de determinar els tipus de variables i arguments utilitzats durant l'execució. YJIT està disponible per a arquitectures x86-64 i arm64/aarch64 a Linux, MacOS, BSD i altres plataformes UNIX.

    A diferència de Ruby, el codi YJIT està escrit en el llenguatge Rust i requereix el compilador rustc 1.58.0+ per a la compilació, de manera que la compilació YJIT està desactivada per defecte i és opcional. Quan s'utilitzava YJIT, es va registrar un augment del rendiment del 41% quan s'executava la prova de banc d'yjit en comparació amb la interpretació.

    Llançament del llenguatge de programació Ruby 3.2

  • S'ha afegit protecció addicional contra atacs de denegació de servei quan es processen dades externes en expressions regulars (ReDoS) ineficients i que requereixen temps. L'algoritme de concordança, que utilitza la tècnica de memorització, s'ha millorat significativament. Per exemple, el temps d'execució de l'expressió '/^a*b?a*$/ =~ "a" * 50000 + "x"' es va reduir de 10 a 0.003 segons. El cost de l'optimització és un augment del consum de memòria, el consum del qual és aproximadament 10 vegades més gran que la mida de les dades d'entrada. La segona mesura de seguretat és la possibilitat de definir un temps d'espera (per exemple, "Regexp.timeout = 1.0") durant el qual s'ha de processar l'expressió regular.
  • S'inclou el mode syntax_suggest, que ajuda a diagnosticar les causes dels errors associats amb una expressió de "final" de tancament que falta o addicional. `final' sense coincidència, falta paraula clau (`fer', `def`, `si`, etc.)? 1 classe Gos > 2 defbark > 3 final 4 final
  • La capacitat de marcar arguments per a errors relacionats amb tipus i arguments s'ha afegit al mode de visualització de la ubicació d'error, per exemple: test.rb:2:in `+': nil no es pot forçar a Integer (TypeError) sum = ary [0] + ària [1] ^^^^^^
  • S'ha afegit una nova sintaxi per redirigir conjunts d'arguments a altres mètodes: def foo(*) bar(*) end def baz(**) quux(**) end
  • Es proposa Ruby_vm/mjit/compiler, una variant de l'antic compilador MJIT JIT, reescrit en llenguatge Ruby. S'ha assegurat que MJIT s'executa en un procés independent en lloc d'executar-se en un fil de treball MJIT.
  • A Bundler 2.4, el processament de dependències utilitza el detector de versions de PubGrub, també utilitzat al gestor de paquets pub per a l'idioma Dart. L'algorisme de Molinillo utilitzat anteriorment es continua utilitzant a RubyGems, però també serà substituït per PubGrub en el futur.
  • Versions actualitzades dels mòduls gem integrats i els inclosos a la biblioteca estàndard.

Font: opennet.ru

Afegeix comentari