Γ stato rilasciato Ruby 3.2.0, un linguaggio di programmazione dinamico orientato agli oggetti che Γ¨ altamente efficiente nello sviluppo di programmi e incorpora le migliori funzionalitΓ di Perl, Java, Python, Smalltalk, Eiffel, Ada e Lisp. Il codice del progetto Γ¨ distribuito sotto le licenze BSD ("BSDL a 2 clausole") e "Ruby", che si riferisce all'ultima versione della licenza GPL ed Γ¨ completamente compatibile con GPLv3.
Principali miglioramenti:
- Γ stata aggiunta una versione iniziale dell'interprete CRuby. Compila in codice intermedio WebAssembly per l'esecuzione in un browser web o in runtime separati, come wasmtime. L'API WASI (WebAssembly System Interface) viene utilizzata per l'interazione diretta con il sistema operativo durante l'esecuzione autonoma. Tra le altre cose, viene fornito un wrapper VFS su WASI, che consente di impacchettare un'intera applicazione Ruby come un singolo file .wasm. L'esecuzione in un browser puΓ² essere utilizzata per creare servizi web di formazione e dimostrazione, come TryRuby. Allo stato attuale dello sviluppo, la versione supera con successo le suite di test Basic e Bootstrap, che non utilizzano l'API Thread. La versione non supporta inoltre fibre, eccezioni o garbage collection.
- Il compilatore JIT in-process YJIT, creato dagli sviluppatori della piattaforma di e-commerce Shopify nell'ambito di un'iniziativa volta a migliorare le prestazioni dei programmi Ruby che utilizzano il framework Rails e che richiamano numerosi metodi, Γ¨ stato annunciato come stabile e pronto per l'uso in produzione. La differenza principale rispetto al precedente compilatore JIT MJIT, basato sull'elaborazione di interi metodi e sull'utilizzo di un compilatore C esterno, risiede nel fatto che YJIT utilizza il Lazy Basic Block Versioning (LBBV) e include un compilatore JIT integrato. Grazie a LBBV, il JIT compila inizialmente solo l'inizio di un metodo, completando il resto in un secondo momento, dopo che i tipi delle variabili e degli argomenti utilizzati sono stati determinati durante l'esecuzione. YJIT Γ¨ disponibile per le architetture x86-64 e arm64/aarch64. Linux, MacOS, BSD e altre piattaforme UNIX.
A differenza di CRuby, YJIT Γ¨ scritto in Rust e richiede il compilatore rustc 1.58.0+ per la compilazione. Pertanto, la compilazione di YJIT Γ¨ disabilitata di default ed Γ¨ facoltativa. Γ stato dimostrato che l'utilizzo di YJIT migliora le prestazioni nel benchmark yjit-bench del 41% rispetto al codice interpretato.

- Γ stata aggiunta una protezione aggiuntiva contro gli attacchi denial-of-service (ReDoS) durante l'elaborazione di dati esterni in espressioni regolari inefficienti e di lunga durata. L'algoritmo di matching, che utilizza la tecnica di memoizzazione, Γ¨ stato notevolmente migliorato. Ad esempio, il tempo di esecuzione dell'espressione '/^a*b?a*$/ =~ "a" * 50000 + "x"' Γ¨ stato ridotto da 10 a 0.003 secondi. Il costo di questa ottimizzazione Γ¨ un aumento del consumo di memoria, che Γ¨ circa 10 volte la dimensione dei dati di input. Una seconda misura di mitigazione Γ¨ la possibilitΓ di definire un timeout (ad esempio, "Regexp.timeout = 1.0") entro il quale l'espressione regolare deve essere elaborata.
- Γ ora inclusa la modalitΓ syntax_suggest, che aiuta a diagnosticare le cause degli errori relativi a un'istruzione di chiusura "end" mancante o non necessaria. 'end' non corrispondente, parola chiave mancante ('do', 'def', 'if', ecc.) ? 1 class Dog > 2 defbark > 3 end 4 end
- La possibilitΓ di contrassegnare gli argomenti per errori relativi a tipi e argomenti Γ¨ stata aggiunta alla modalitΓ di visualizzazione della posizione dell'errore, ad esempio: test.rb:2:in `+': nil can't be coerced into Integer (TypeError) sum = ary[0] + ary[1] ^^^^^^
- Aggiunta nuova sintassi per inoltrare set di argomenti ad altri metodi: def foo(*) bar(*) end def baz(**) quux(**) end
- ruby_vm/mjit/compiler Γ¨ una riscrittura basata su Ruby del vecchio compilatore MJIT JIT. Esegue MJIT in un processo separato, anzichΓ© all'interno del thread worker MJIT.
- Bundler 2.4 ora utilizza il controllo di versione di PubGrub per la gestione delle dipendenze, utilizzato anche nel gestore di pacchetti Pub per il linguaggio Dart. L'algoritmo Molinillo, precedentemente utilizzato, continua a essere utilizzato in RubyGems, ma verrΓ sostituito da PubGrub in futuro.
- Sono state aggiornate le versioni dei moduli gem integrati e di quelli inclusi nella libreria standard.
Fonte: opennet.ru
