Ruby 3.0.0 Preview 1 veröffentlicht

Wir freuen uns, die Veröffentlichung von Ruby 3.0.0-preview1 ankündigen zu können.

Sie führt eine Reihe neuer Features und Performanzverbesserungen ein.

RBS

Mithilfe von RBS lassen sich die Typen eines Ruby-Programms beschreiben. Typprüfungsprogramme wie type-profiler und andere Werkzeuge mit RBS-Unterstützung werden mithilfe von RBS-Definitionen viel besser in der Lage sein, Ruby-Programme zu verstehen.

Mit RBS ist es nun möglich, die Definitionen von Klassen und Modulen zu beschrieben: Methoden der Klasse, Instanzvariablen und ihre Typen, Vererbungs- und Mix-In-Beziehungen.

RBS soll übliche Ruby-Idiome unterstützen und erlauben, komplexe Typen wie Union Types, überladene Methoden und Generics zu schreiben. RBS unterstützt mithilfe von Schnittstellen-Typen (Interface Types) auch Duck Typing.

Ruby 3.0 enthält das Gem rbs, das das Parsing und die Verarbeitung von in RBS geschriebenen Typendefinitionen ermöglicht.

Nachfolgend ein kleines Beispiel von RBS.

module ChatApp
  VERSION: String

  class Channel
    attr_reader name: String
    attr_reader messages: Array[Message]
    attr_reader users: Array[User | Bot]              # `|` bedeutet Union Types, `User` oder `Bot`.

    def initialize: (String) -> void

    def post: (String, from: User | Bot) -> Message   # Methodenüberladung wird unterstützt.
            | (File, from: User | Bot) -> Message
  end
end

Siehe die README des rbs-Gem für weitere Informationen.

Ractor (experimentell)

Ractor ist eine dem Aktorenmodell ähnliche Abstraktion für Nebenläufigkeit, um die parallele Ausführung von Code bei gleichzeitiger Beachtung von Thread-Sicherheit zu ermöglichen.

Sie können mehrere Ractors anlegen und sie parallel ausführen. Ractor ermöglicht es, thread-sichere parallele Programme zu schreiben, weil sich Ractors normale Objekte nicht teilen können. Die Kommunikation zwischen Ractors wird stattdessen über Nachrichten abgewickelt.

Um das Teilen von Objekten zu begrenzen, führt Ractor einige Beschränkungen für Rubys Syntax ein (die allerdings nicht eingreifen, wenn nicht mehrere Ractors verwendet werden).

Die Spezifikation und Implementation sind noch nicht abgeschlossen und können sich in Zukunft noch ändern, weshalb dieses Feature als experimentell markiert ist und bei Erstellung eines Ractors eine entsprechende Warnung ausgegeben wird.

Das folgende kleine Programm berechnet prime? parallel mit zwei Ractors und ist, wenn zwei oder mehr Prozessorkerne vorhanden sind, damit etwa 2-mal so schnell wie ein sequentielles Programm.

require 'prime'

# n.prime? wird mit den gesendeten Integern in r1, r2 parallel ausgeführt
r1, r2 = *(1..2).map do
  Ractor.new do
    n = Ractor.recv
    n.prime?
  end
end

# Parameter abschicken
r1.send 2**61 - 1
r2.send 2**61 + 15

# Warte auf die Ergebnisse von expr1, expr2
p r1.take #=> true
p r2.take #=> true

Siehe doc/ractor.md für weitere Informationen.

Scheduler (Experimentell)

Zur Unterbrechung blockender Operationen wird Thread#scheduler eingeführt. Das ermöglicht leichtgewichtige Nebenläufigkeit ohne Änderungen bestehenden Codes.

Momentan unterstützte Klassen/Methoden:

  • Mutex#lock, Mutex#unlock, Mutex#sleep
  • ConditionVariable#wait
  • Queue#pop, SizedQueue#push
  • Thread#join
  • Kernel#sleep
  • IO#wait, IO#read, IO#write und verwandte Methoden (z.B. #wait_readable, #gets, #puts usw.).
  • IO#select wird nicht unterstützt.

Der momentane Eintrittspunkt für Nebenläufigkeit ist Fiber.schedule{...}. Das kann sich aber bis zur Veröffentlichung von Ruby 3 noch ändern.

Mit Async::Scheduler steht ein Test-Scheduler zur Verfügung. Siehe doc/scheduler.md für weitere Informationen. [Feature #16786]

ACHTUNG: Diese Feature ist sehr experimentell. Sowohl der Name als auch das Feature selbst werden sich in der nächsten Vorschau-Veröffentlichung ändern.

Sonstige erwähnenswerte neue Features

  • Rechtsbündige Zuweisungsanweisung wird eingeführt.

    fib(10) => x
    p x #=> 55
    
  • End-lose Methodendefinition wird eingeführt.

    def square(x) = x * x
    
  • Find-Idiom wird eingeführt.

    case ["a", 1, "b", "c", 2, "d", "e", "f", 3]
    in [*pre, String => x, String => y, *post]
      p pre  #=> ["a", 1]
      p x    #=> "b"
      p y    #=> "c"
      p post #=> [2, "d", "e", "f", 3]
    end
    
  • Hash#except ist jetzt eingebaut.

    h = { a: 1, b: 2, c: 3 }
    p h.except(:a) #=> {:b=>2, :c=>3}
    
  • Memory View wird als experimentelles Feature eingeführt.

    • Dabei handelt es sich um ein neues C-API, das den Austausch roher Speicherabschnitte, wie ein numerisches Array oder Bitmap-Bilder, zwischen Erweiterungsbibliotheken (C extensions) ermöglichen soll. Die Erweiterungsbibliotheken können auch die Metadaten des betroffenen Speicherabschnitts wie etwa Schnitt, Elementformat usw. teilen. Mit dieser Art von Metadaten können Erweiterungsbibliotheken sogar mehrdimensionale Arrays ordnungsgemäß teilen. Dieses Feature orientiert sich an Pythons Buffer Protocol.

Performanzverbesserungen

  • Es gab viele Verbesserungen im MJIT. Siehe die NEWS für Details.

Sonstige erwähnenswerte Änderungen seit 2.7

  • Schlüsselwortargumente werden von anderen Argumenten abgetrennt.

    • Grundsätzlich wird Code, der unter Ruby 2.7 eine Warnung erzeugte, nicht mehr funktionieren. Siehe dieses Dokument für weitere Details.
    • Übrigens unterstützt Argumentweiterleitung jetzt auch vorangehende Argumente.

      def method_missing(meth, ...)
        send(:"do_#{ meth }", ...)
      end
      
  • Die Besonderheiten von $SAFE wurde vollständig entfernt. Es handelt sich nun um eine normale globale Variable.

  • In Ruby 2.5 war die Reihenfolge der Backtraces umgekehrt worden. Diese Änderung ist rückgängig gemacht worden, d.h. die Fehlermeldung und die Nummer der Zeile, in der der Fehler auftrat, werden zuerst und die Aufrufer danach ausgegeben.

  • Einige Standardbibliotheken wurden aktualisiert.
    • RubyGems 3.2.0.rc.1
    • Bundler 2.2.0.rc.1
    • IRB 1.2.6
    • Reline 0.1.5
  • Die folgenden Bibliotheken werden nicht länger mitgeliefert. Installieren Sie die entsprechenden Gems, um diese Features zu nutzen.
    • net-telnet
    • xmlrpc
  • Die folgenden Standardbibliotheken werden zu mitgelieferten Gems aufgewertet.
    • rexml
    • rss
  • Werte die stdlib zu mitgelieferten Gems auf. Die folgenden Gems wurden auf rubygems.org veröffentlicht:
    • abbrev
    • base64
    • English
    • erb
    • find
    • io-nonblock
    • io-wait
    • net-ftp
    • net-http
    • net-imap
    • net-protocol
    • nkf
    • open-uri
    • optparse
    • resolv
    • resolv-replace
    • rinda
    • securerandom
    • set
    • shellwords
    • tempfile
    • time
    • tmpdir
    • tsort
    • weakref

Siehe die NEWS oder die commit logs für weitere Details.

Mit diesen Änderungen wurden 3385 Dateien geändert, 150159 Einfügungen(+), 124949 Löschungen(-) seit Ruby 2.7.0!

Bitte probieren Sie Ruby 3.0.0-preview1 aus und geben Sie uns Rückmeldung!

Download

  • https://cache.ruby-lang.org/pub/ruby/3.0/ruby-3.0.0-preview1.tar.bz2

    SIZE: 15538340
    SHA1: 032697f3ace0a697cd72f68bac0032c31a8328d4
    SHA256: 013bdc6e859d76d67a6fcd990d401ed57e6e25896bab96d1d0648a877f556dbb
    SHA512: 3a6a6458d9c5f06555ab8705160f6b071f4dbe9d2a91cd7848852633657b495c480d74e4b2ff2cebddda556118d26bbb271160c989bc970bb1b5cb234e868d2f
    
  • https://cache.ruby-lang.org/pub/ruby/3.0/ruby-3.0.0-preview1.tar.gz

    SIZE: 17747808
    SHA1: 2842d2af2568d74c8d4071f5f536889a6b149202
    SHA256: ce8bd7534e7ec2a870b24d2145ea20e9bbe5b2d76b7dfa1102dbee5785253105
    SHA512: b94892951f842a1538f4b99022606ac2c0b5031f1ede7eef3833a8caa9ed63e9b22868509173bfefb406f263c65211db75597b152b61f49e5ba2a875fce63a27
    
  • https://cache.ruby-lang.org/pub/ruby/3.0/ruby-3.0.0-preview1.tar.xz

    SIZE: 12703060
    SHA1: 91d9fbe87504924148deeec90199d6ff4d7dcf56
    SHA256: aa7cce0c99f4ea2145fef9b78d74a44857754396790cd23bad75d759811e7a2a
    SHA512: dca5dcc965c434371947c100864090e29e649e19ae24b8bb2e88a534ebd8220c5a086035a999b1e8b1cd5ec154a6985a8d8dfea56095d712d62aeea7a2054f7d
    
  • https://cache.ruby-lang.org/pub/ruby/3.0/ruby-3.0.0-preview1.zip

    SIZE: 22002645
    SHA1: 4b5b61066373daf0a947d3fafe2645788504a164
    SHA256: a39a48ed9a8ca2c83d65d225a1bb3db331c6587a77ba156c20e630c1b4bfc23b
    SHA512: 10f6f28715a52093d7d9da82d1678147091b45e2f279e463626adea8efbf181485daa42565e5086057ffb45a097ffb8ff395c572b247b6b5da27d85933cf58a8
    

3.0.0-preview2 Vorankündigung

Wir planen, “type-profiler”, ein Feature zur statischen Typanalyse, mitzuliefern. Wir halten Sie auf dem Laufenden!

Was ist Ruby

Ruby wurde zunächst 1993 von Matz (Yukihiro Matsumoto) entwickelt und ist heute quelloffene Software. Es läuft auf mehreren Plattformen und wird weltweit genutzt, insbesondere für die Webentwicklung.