È stato pubblicato il linguaggio di programmazione Ruby 4.0

È stata rilasciata Ruby 4.0.0, un linguaggio di programmazione dinamico a oggetti, incentrato su un'elevata efficienza nello sviluppo software e che incorpora 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 si riferisce all'ultima versione della licenza GPL ed è compatibile con GPLv3.

Miglioramenti principali:

  • È stato incluso un nuovo compilatore JIT, ZJIT, posizionato come la prossima generazione del JIT Ruby. Per impostazione predefinita, continua a essere utilizzato il compilatore JIT YJIT, mentre ZJIT è incluso come opzione (attivato dal flag "—zjit"). Come YJIT, il nuovo compilatore JIT è scritto in Rust dal team di sviluppatori di Shopify nell'ambito di un'iniziativa per migliorare le prestazioni delle applicazioni Ruby che utilizzano il framework Rails e fanno molte chiamate a metodi. Nello stato attuale di sviluppo, ZJIT è più veloce dell'interprete, ma attualmente è inferiore in prestazioni rispetto a YJIT (si prevede che in Ruby 4.1 ZJIT sarà stabilizzato e supererà in prestazioni YJIT).

    A differenza di YJIT, il nuovo compilatore JIT traduce il bytecode della macchina virtuale YARV non in una rappresentazione intermedia a basso livello, simile al codice macchina, ma in una rappresentazione intermedia ad alto livello SSA (Static Single Assignment), che consente di eseguire fasi di ottimizzazione aggiuntive e di ottimizzare grandi blocchi di codice, non solo le operazioni correnti. Per attrarre nuovi partecipanti, ZJIT implementa l'architettura classica JIT, utilizzando i dati storici sui tipi accumulati dall'interprete, invece della complessa tecnica di versioning dei blocchi di base (LBBV - Lazy Basic Block Versioning) utilizzata in YJIT.

  • È stata aggiunta una classe sperimentale Ruby::Box con implementazione di un meccanismo di isolamento, che consente di separare l'esecuzione in un processo di classi, moduli e monkey patch (metodi e attributi delle classi sostituiti). Utilizzando Ruby::Box, è possibile anche separare l'esecuzione del codice applicativo dalle librerie Ruby, garantire l'isolamento dei test e organizzare l'esecuzione parallela dei web handler in un unico processo. server applicazioni (ad esempio, per la sostituzione progressiva di una versione del codice con un'altra o per l'aggiornamento delle dipendenze). Per attivare Ruby::Box, è necessario impostare la variabile d'ambiente «RUBY_BOX=1». # foo.rb class String def self.foo = «foo» end # main.rb box = Ruby::Box.new box.require(‘foo’)
  • È stata modernizzata l'implementazione del modello di attori Ractor, offrendo un'astrazione in stile «attori» (ruby actor) per garantire l'esecuzione parallela sicura dei thread con interazione tra i thread tramite la trasmissione di messaggi. È stata aggiunta la classe Ractor::Port, che risolve problemi legati all'invio e alla ricezione di messaggi. È stato aggiunto il metodo Ractor.shareable_proc per facilitare l'accesso condiviso agli oggetti Proc da attori diversi. Sono state ottimizzate le strutture dati per ridurre i conflitti durante l'impostazione di blocchi globali e migliorare l'efficienza dell'uso della cache CPU. L'anno prossimo, Ractor dovrebbe essere dichiarato una funzionalità stabile. port1 = Ractor::Port.new port2 = Ractor::Port.new Ractor.new port1, port2 do |port1, port2| port1 << 1 port2 << 11 port1 << 2 port2 < 1, 2 2.times{ p port2.receive } #=> 11, 12
  • L'operatore «*nil» ora restituisce immediatamente un array vuoto («[]») senza chiamare il metodo «nil.to_a», analogamente a come «**nil» restituisce direttamente un hash vuoto senza invocare «nil.to_hash».
  • È consentito suddividere le righe con operatori logici «||», «&&», «and» e «or» in modo tale che la riga successiva inizi con l'operatore. if condition1 && condition2 … end
  • Sono stati aggiunti i metodi Array#find e «Array#rfind» per una ricerca più efficiente degli elementi in un array, che funzionano più velocemente di «array.reverse_each.find» e «Enumerable#find».
  • Le classi Set e Pathname sono state aggiunte tra le classi incorporate.
  • Sono state ampliate le funzionalità di molte classi di base, come Binding, Enumerator, ErrorHighlight, Fiber, File, IO, Kernel, Math, Proc, Range, Socket, String, Thread.
  • Sono state aggiornate le versioni dei moduli gem incorporati e inclusi nella libreria standard.

Fonte: opennet.ru

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