Rilascio del linguaggio di programmazione Ruby 3.2

È 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:

  • Aggiunta una porta iniziale di un interprete CRuby che viene compilato nel codice intermedio WebAssembly da eseguire in un browser Web o in runtime autonomi come wasmtime. Per l'interazione diretta con il sistema operativo durante l'esecuzione separata, viene utilizzata l'API WASI (WebAssembly System Interface). Tra l'altro viene fornito un collegamento VFS sopra WASI, che consente di comprimere l'intera applicazione nel linguaggio Ruby in una vista sotto forma di un unico file wasm. L'esecuzione in un browser può essere utilizzata per creare tutorial e servizi Web demo come TryRuby. Allo stadio attuale di sviluppo, il port supera con successo le suite di test di base e bootstrap, che non utilizzano l'API Thread. La porta inoltre non supporta Fiber, Exceptions o Garbage Collection.
  • Il compilatore JIT in-process YJIT, creato dagli sviluppatori della piattaforma di e-commerce Shopify come parte di un'iniziativa per aumentare le prestazioni dei programmi Ruby che utilizzano il framework Rails e chiamano molti metodi, è stato dichiarato stabile e pronto per uso produttivo. La differenza fondamentale rispetto al compilatore MJIT JIT utilizzato in precedenza, che si basa sull'elaborazione del metodo e utilizza un compilatore C esterno, è che YJIT utilizza Lazy Basic Block Versioning (LBBV) e contiene un compilatore JIT integrato. Grazie a LBBV, JIT compila inizialmente solo l'inizio del metodo e compila il resto dopo un po' di tempo, dopo che i tipi di variabili e argomenti utilizzati sono stati determinati durante l'esecuzione. YJIT è disponibile per architetture x86-64 e arm64/aarch64 su Linux, MacOS, BSD e altre piattaforme UNIX.

    A differenza di CRuby, il codice YJIT è scritto in Rust e richiede la compilazione del compilatore rusticc 1.58.0+, quindi la compilazione YJIT è disabilitata per impostazione predefinita ed è facoltativa. Utilizzando YJIT, è stato registrato un aumento delle prestazioni del 41% durante l'esecuzione del test yjit-bench rispetto all'utilizzo dell'interpretazione.

    Rilascio del linguaggio di programmazione Ruby 3.2

  • Aggiunta ulteriore protezione contro gli attacchi che causano attacchi di tipo Denial of Service durante l'elaborazione di dati esterni in espressioni regolari (ReDoS) inefficienti e di lunga durata. Algoritmo di corrispondenza notevolmente migliorato, che utilizza la tecnica di memorizzazione. Ad esempio, il tempo di esecuzione dell'espressione '/^a*b?a*$/ =~ "a" * 50000 + "x"' è stato ridotto da 10 a 0.003 secondi. Il prezzo dell'ottimizzazione è un aumento del consumo di memoria, il cui consumo è circa 10 volte superiore alla dimensione dei dati di input. La seconda misura di sicurezza è la possibilità di definire un timeout (ad esempio, "Regexp.timeout = 1.0"), per il quale l'espressione regolare deve avere tempo per essere elaborata.
  • La modalità syntax_suggest è inclusa per aiutare a diagnosticare le cause degli errori associati a un'istruzione di chiusura "end" mancante o ridondante. "end" senza corrispondenza, parola chiave mancante ("do", "def", "if", ecc.)? 1 classe Cane > 2 defbark > 3 end 4 end
  • Aggiunta la possibilità di contrassegnare gli argomenti in caso di errori relativi a tipi e argomenti nella modalità di localizzazione degli errori, ad esempio: test.rb:2:in `+': nil non può essere forzato in Integer (TypeError) sum = ary[ 0] + ario [1] ^^^^^^
  • Aggiunta una nuova sintassi per il reindirizzamento ad altri metodi di set di argomenti: def foo(*) bar(*) end def baz(**) quux(**) end
  • Ruby_vm/mjit/compiler proposto - una variante del vecchio compilatore MJIT JIT, riscritto nel linguaggio Ruby. Garantita l'esecuzione di MJIT in un processo separato, anziché l'esecuzione nel thread di lavoro MJIT.
  • In Bundler 2.4, la gestione delle dipendenze utilizza il cercatore di versione PubGrub, utilizzato anche dal gestore pacchetti pub per Dart. L'algoritmo Molinillo utilizzato in precedenza continua ad essere utilizzato in RubyGems, ma in futuro sarà sostituito anche da PubGrub.
  • Versioni aggiornate dei moduli gem della libreria standard e incorporati.

Fonte: opennet.ru

Aggiungi un commento