Die Programmiersprache Ruby 4.0 wurde veröffentlicht.

Die Veröffentlichung von Ruby 4.0.0 wurde bekanntgegeben, einer dynamischen objektorientierten Programmiersprache, die sich auf die hohe Effizienz der Softwareentwicklung konzentriert und die besten Eigenschaften von Perl, Java, Python, Smalltalk, Eiffel, Ada und Lisp vereint. Der Code des Projekts wird unter den Lizenzen BSD ("2-clause BSDL") und "Ruby" verteilt, die sich auf die letzte Version der GPL-Lizenz beziehen und mit GPLv3 kompatibel sind.

Wesentliche Verbesserungen:

  • Das neue JIT-Compiler-ZJIT ist Bestandteil des Releases und positioniert sich als nächste Generation des Ruby JIT. Standardmäßig bleibt der YJIT-Compiler in Verwendung, während ZJIT als Option verfügbar ist (aktiviert mit dem Flag "—zjit"). Wie der YJIT-Compiler wurde ZJIT von einem Team von Entwicklern bei Shopify in der Programmiersprache Rust entwickelt und zielt darauf ab, die Leistung von Ruby-Anwendungen zu steigern, die das Rails-Framework nutzen und viele Methoden aufrufen. In der aktuellen Entwicklungsphase ist ZJIT schneller als der Interpreter, bleibt jedoch in der Leistung hinter YJIT zurück (es wird erwartet, dass ZJIT in Ruby 4.1 stabilisiert wird und YJIT in der Leistung übertreffen wird).

    Im Gegensatz zu YJIT übersetzt der neue JIT-Compiler den Bytecode der virtuellen Maschine YARV nicht in eine niedrigstufige, maschinennahen Intermediate-Repräsentation, sondern in eine hochgradig abstrakte Intermediate-Repräsentation SSA (Static Single Assignment). Diese ermöglicht zusätzliche Optimierungsphasen und die Optimierung größerer Codeblöcke, nicht nur der aktuellen Operationen. Um neue Mitwirkende zu gewinnen, implementiert ZJIT die klassische JIT-Architektur, die auf den historischen Typdaten basiert, die vom Interpreter gesammelt wurden, statt der in YJIT verwendeten komplexen Technik der lazy Basic Block Versionierung (LBBV).

  • Eine experimentelle Klasse Ruby::Box wurde hinzugefügt, die einen Isolationsmechanismus implementiert, der die Ausführung von Klassen, Modulen und Monkey-Patches (überlagerten Methoden und Attributen) innerhalb eines Prozesses trennt. Mit Ruby::Box kann auch die Ausführung des Anwendungs-Codes von Ruby-Bibliotheken getrennt werden, um die Isolierung von Tests zu gewährleisten und die gleichzeitige Ausführung von Web-Handlern in einem Prozess zu organisieren. Server Anwendungen (zum Beispiel für den schrittweisen Austausch einer Version des Codes gegen eine andere oder zum Aktualisieren von Abhängigkeiten). Um Ruby::Box zu aktivieren, muss die Umgebungsvariable „RUBY_BOX=1“ gesetzt werden. # foo.rb class String def self.foo = "foo" end # main.rb box = Ruby::Box.new box.require('foo')
  • Die Implementierung des Aktormodells Ractor wurde modernisiert, die eine Abstraktion im Stil von „Aktoren“ (ruby actor) bereitstellt, um einen threadsicheren parallelen Ablauf des Programms mit Interaktion zwischen Threads durch Nachrichtenaustausch zu gewährleisten. Die Klasse Ractor::Port wurde hinzugefügt, um Probleme beim Senden und Empfangen von Nachrichten zu lösen. Die Methode Ractor.shareable_proc wurde hinzugefügt, um den gemeinsamen Zugriff auf Proc-Objekte aus verschiedenen Akteuren zu erleichtern. Es wurden Optimierungen der Datenstrukturen vorgenommen, um Konflikte beim Setzen globaler Sperren zu reduzieren und die Effizienz der CPU-Caches zu erhöhen. Im nächsten Jahr wird Ractor voraussichtlich in den Status stabiler Funktionen überführt. 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
  • Der Operator «*nil» gibt jetzt sofort ein leeres Array («[]») ohne den Zwischenschritt des Aufrufs der Methode «nil.to_a» zurück, ähnlich wie «**nil» sofort einen leeren Hash zurückgibt, ohne «nil.to_hash» aufzurufen.
  • Es ist erlaubt, Zeilen mit den logischen Operatoren «||», «&&», «and» und «or» so zu brechen, dass die nächste Zeile mit dem Operator beginnt. if condition1 && condition2 … end
  • Die Methoden Array#find und Array#rfind wurden hinzugefügt, um die Suche nach Elementen in einem Array effizienter zu gestalten, wobei sie schneller arbeiten als «array.reverse_each.find» und «Enumerable#find».
  • Die Klassen Set und Pathname wurden in die Liste der eingebauten Klassen aufgenommen.
  • Die Funktionen vieler grundlegender Klassen wie Binding, Enumerator, ErrorHighlight, Fiber, File, IO, Kernel, Math, Proc, Range, Socket, String, Thread wurden erweitert.
  • Die Versionen der eingebauten und in die Standardbibliothek integrierten Gem-Module wurden aktualisiert.

Quelle: opennet.ru

Zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen 🔥 Zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen | ProHoster