Uscita del linguaggio di programmazione Ruby 3.2

È stato rilasciato Ruby 3.2.0, un linguaggio di programmazione orientato agli oggetti dinamico, noto per l'alta efficienza nello sviluppo di software e per aver incorporato le migliori caratteristiche di Perl, Java, Python, Smalltalk, Eiffel, Ada e Lisp. Il codice del progetto è distribuito sotto le licenze BSD («2-clause BSDL») e «Ruby», che fa riferimento all'ultima versione della licenza GPL ed è completamente compatibile con GPLv3.

Miglioramenti principali:

  • È stato aggiunto un port iniziale dell'interprete CRuby, compilato in codice intermedio WebAssembly per l'esecuzione in un browser web o sotto runtime isolati come wasmtime. Per l'interazione diretta con il sistema operativo durante l'esecuzione isolata, viene utilizzata l'API WASI (WebAssembly System Interface). Tra l'altro è stata fornita un'interfaccia VFS sopra WASI, che consente di impacchettare interamente un'applicazione Ruby in un unico file wasm. L'esecuzione nel browser può essere utilizzata per creare servizi web formativi e dimostrativi, come TryRuby. In questa fase di sviluppo, il port supera con successo i test di base e bootstrap, nei quali non viene utilizzata l'API Thread. Inoltre, nel port non sono supportati i fiber, le eccezioni e la raccolta dei rifiuti.
  • È stato dichiarato stabile e pronto per l'uso in produzione il compilatore JIT intra-processo YJIT, sviluppato dai creatori della piattaforma di e-commerce Shopify nell'ambito di un'iniziativa per migliorare le prestazioni delle applicazioni Ruby che utilizzano il framework Rails e invocano molti metodi. La principale differenza rispetto al precedente compilatore JIT MJIT, che si basa sull'elaborazione di metodi completi e utilizza un compilatore esterno scritto in C, è che YJIT applica il versionamento dei blocchi di base (LBBV — Lazy Basic Block Versioning) e contiene un compilatore JIT integrato. Grazie a LBBV, il JIT compila inizialmente solo l'inizio del metodo, mentre il resto viene compilato successivamente, dopo che durante l'esecuzione sono stati determinati i tipi delle variabili e degli argomenti utilizzati. YJIT è disponibile per le architetture x86-64 e arm64/aarch64 su Linux, MacOS, BSD e altre piattaforme UNIX.

    A differenza di CRuby, il codice di YJIT è scritto in Rust e richiede un compilatore rustc 1.58.0 o superiore per essere compilato, quindi la compilazione di YJIT è disabilitata per impostazione predefinita e opzionale. Con YJIT è stato registrato un aumento delle prestazioni del 41% durante il test yjit-bench rispetto all'interpretazione.

    Uscita del linguaggio di programmazione Ruby 3.2
  • È stata aggiunta una protezione aggiuntiva contro gli attacchi di denial of service durante l'elaborazione di dati esterni in espressioni regolari inefficienti e lunghe (ReDoS). È stato migliorato significativamente l'algoritmo di corrispondenza, utilizzando una tecnica di memoizzazione. Ad esempio, il tempo di esecuzione dell'espressione '/^a*b?a*$/' =~ "a" * 50000 + "x" è diminuito da 10 a 0,003 secondi. Il prezzo dell'ottimizzazione è un aumento del consumo di memoria, che è circa dieci volte superiore alla dimensione dei dati in ingresso. Una seconda misura di protezione è la possibilità di determinare un timeout (ad esempio, "Regexp.timeout = 1.0") per il quale l'espressione regolare dovrebbe essere elaborata.
  • È stata inclusa la modalità syntax_suggest, che aiuta a diagnosticare le cause degli errori legati a espressioni 'end' mancanti o extra. Unmatched `end’, missing keyword (`do’, `def’, `if’, etc.) ? 1 class Dog > 2 defbark > 3 end 4 end
  • Nella modalità di visualizzazione degli errori è stata aggiunta la possibilità di contrassegnare gli argomenti in caso di errori legati ai tipi e agli argomenti; ad esempio: test.rb:2:in `+’: nil can’t be coerced into Integer (TypeError) sum = ary[0] + ary[1] ^^^^^^
  • È stata aggiunta una nuova sintassi per il reindirizzamento ad altri metodi di set di argomenti: def foo(*) bar(*) end def baz(**) quux(**) end
  • È stato proposto ruby_vm/mjit/compiler — una versione del vecchio compilatore JIT MJIT, riscritta in Ruby. È stata garantita l'esecuzione di MJIT in un processo separato, invece che in un thread di MJIT worker.
  • In Bundler 2.4, per la gestione delle dipendenze è stato impiegato il determinatore di versioni PubGrub, utilizzato anche nel gestore di pacchetti pub per il linguaggio Dart. L'algoritmo precedentemente utilizzato, Molinillo, continua a essere applicato in RubyGems, ma in futuro sarà anch'esso sostituito da PubGrub.
  • Sono state aggiornate le versioni dei moduli gem incorporati e inclusi nella libreria standard.

Fonte: opennet.ru

Acquista un hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista un hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster