Ruby 3.3 veröffentlicht
(ruby-lang.org)- YJIT verbessert Performance und Speicherverbrauch im Vergleich zu Ruby 3.2 deutlich und ist in Optcarrot mehr als 3-mal schneller als der Interpreter
- Code GC von YJIT ist standardmäßig deaktiviert, und
--yjit-exec-mem-sizewirkt als Hard Limit, das die Kompilierung neuen Codes stoppt - Mit dem neu hinzugefügten
RubyVM::YJIT.enablelässt sich YJIT zur Laufzeit aktivieren, ohne Kommandozeilenargumente oder Umgebungsvariablen zu ändern - Der Parser Prism wurde als Standard-gem hinzugefügt; die APIs
Prism.parse(source),Prism.parse_comments(source)undPrism.parse_success?(source)sind verfügbar - Der Prism-Compiler kann mit
ruby --parser=prismoderRUBYOPT="--parser=prism"experimentell ausprobiert werden, dieser Flag ist jedoch nur für Debugging gedacht - Der Parser-Generator wurde von Bison auf Lrama umgestellt, und der interne Parser von Lrama wurde zugunsten besserer Wartbarkeit durch einen von Racc erzeugten LR-Parser ersetzt
- Der pure-Ruby-JIT-Compiler RJIT ersetzt MJIT, unterstützt jedoch nur die x86-64-Architektur unter Unix und ist auf experimentelle Zwecke beschränkt
- Ein M:N thread scheduler wurde eingeführt, bei dem N native Threads M Ruby-Threads verwalten; da dies jedoch die Kompatibilität mit C-Erweiterungen beeinträchtigen kann, ist er im main Ractor standardmäßig deaktiviert
- Die Nutzung von
it, wenn es ohne Argumente aufgerufen und in Blöcken ohne normale Parameter verwendet wird, wird als deprecated markiert; in Ruby 3.4 soll es zur Referenz auf den ersten Blockparameter werden Regexp::newerlaubt statt des seit Ruby 3.2 deprecated Aufrufs mit 3 Argumenten nur noch maximal 2 Argumenteext/readlinewurde eingestellt; künftig wird aufrelinegesetzt, eine pure-Ruby-Implementierung, die mit derext/readline-API kompatibel ist- Falls
ext/readlinebenötigt wird, kann es übergem install readline-extvon rubygems.org installiert werden; Bibliotheken wielibreadlineoderlibeditmüssen nicht mehr installiert sein - RubyGems und Bundler warnen, wenn bestimmte gems per
requiregeladen werden, ohne sie dem Gemfile oder gemspec hinzuzufügen; diese gems werden in künftigen Ruby-Versionen zu bundled gems - Bei Nutzung des bootsnap-gems wird diese Warnung unterdrückt; aufgrund einer Einschränkung dieser Version wird empfohlen, die Anwendung mindestens einmal mit der Umgebungsvariable
DISABLE_BOOTSNAP=1auszuführen prism 0.19.0wurde als Standard-gem hinzugefügt, undracc 1.7.3wurde von einem default gem zu einem bundled gem hochgestuft
1 Kommentare
Meinungen auf Hacker News
Mit Ruby 3.3 ist Ruby wirklich zurück, würde ich sagen. Es konzentriert sich auf die Freude der Entwickler, und eine Sprache, die früher als langsam verspottet wurde, ist jetzt nicht mehr langsam
YJIT ist eine erstaunliche Technologie, und zusammen mit Object Shapes und verschiedenen Optimierungen der Garbage Collection wird Ruby ziemlich schnell. Selbst große Ruby-Anwender wie Shopify berichten von Leistungsverbesserungen im zweistelligen Prozentbereich, indem sie YJIT in der Vorabversion von 3.3 aktiviert und im Betrieb eingesetzt haben
Persönlich freue ich mich sehr auf Ruby und seine Zukunft und würde gern mit Ruby 3.3 arbeiten und es auf Kundenseiten im Produktivbetrieb einsetzen
https://railsatscale.com/2023-09-18-ruby-3-3-s-yjit-runs-sho...
Ich habe es sogar für Glue Code zwischen einem Redis-basierten DNS-Record-Store und PowerDNS verwendet, und der gesamte Stack hat auf 14 kleinen VPSen 50 Milliarden Queries pro Monat verarbeitet, ohne in
htopgroß aufzufallen. Ich habe PowerDNS nicht wegen der Performance gewählt, sondern weil es in der Regel keine gute Idee ist, Dinge wie Kryptografie, HTTP oder DNS, die dem öffentlichen Internet ausgesetzt sind, selbst zu implementierenDie Ironie des heutigen Webs ist, dass Web-Apps aus „langsamem“ Ruby und Server-Side-Rendering in der Praxis Seiten oft schneller laden als wirklich langsame, final konsistente Datenbanken und aufgeblähte Frontend-Web-Apps. Im modernen Web sieht man selbst bei Kleinigkeiten viel zu oft Loading-Spinners
Nach dem Klick auf den Link war klar: Es waren Verbesserungen im Bereich von 10 %. Das dürfte an der Wahrnehmung, dass Ruby gegenüber „schnellen“ Sprachen wie Rust, Java, Go oder C++ grob 50- bis 200-mal langsamer ist, nicht viel ändern
Ruby 3.3 scheint eines der wichtigsten und funktionsreichsten Ruby-Releases der letzten zehn Jahre zu sein. Ich hätte nicht gedacht, dass es vor Python ein produktionsreifes JIT geben würde, und dazu kommen noch Prism, Lrama und IRB
Was aber nicht genug besprochen wird, sind Ractor, der M:N-Thread-Scheduler, Fiber und Async. Mich würde besonders im Rails-Kontext interessieren, ob jemand diese Funktionen in Produktionsumgebungen einsetzt und welche Erfahrungen es dazu gibt
Trotzdem verdient Ractor mehr Aufmerksamkeit. Das ist ein enorm großes Feature
Vermutlich gibt es in Unternehmen intern Tausende private, maßgeschneiderte Lösungen auf Basis von RabbitMQ oder Redis
Jedes Jahr zu Weihnachten bringt Ruby Lang mit der Präzision eines Uhrwerks ein neues Release heraus
Auf Heroku verfügbar: https://devcenter.heroku.com/changelog-items/2772
Sieht gut aus. Das neue IRB ist ein interaktiver Ruby-Interpreter mit besserer Autovervollständigung und verbessertem Debugging. Die meisten Änderungen in Ruby 3.3 dürften auf Verbesserungen bei den Entwicklerwerkzeugen hinauslaufen
Die Sprach-API bleibt insgesamt weitgehend konsistent mit früheren Releases. Ich habe einen Leitfaden zum Update auf Ruby 3.3 geschrieben, inklusive Hinweisen zu verschiedenen Versionsmanagern: https://mac.install.guide/ruby/update.html
Ich bin neugierig, welchen Versionsmanager man empfehlen kann. Früher habe ich asdf, frum und chruby empfohlen
Namensauflösung wie bei
Socket.getaddrinfokann jetzt unterbrochen werden, und wann immer Namensauflösung nötig ist, wird dafür ein Worker-pthreaderzeugt, in demgetaddrinfo(3)ausgeführt wirdIch frage mich, ob andere Sprachruntimes Ähnliches machen. Einen Thread zu erzeugen wirkt ziemlich schwergewichtig, aber vielleicht ist das in der Praxis kein großes Problem. Selbst laut den eigenen Benchmarks ist der Overhead klein, aber nicht null
10000.times { Addrinfo.getaddrinfo("www.ruby-lang.org", 80) }brauchte vor dem Patch 2,3 Sekunden und nach dem Patch 3,0 Sekunden, und100.times { URI.open("https://www.ruby-lang.org").read }brauchte vor dem Patch 3,36 Sekunden und nach dem Patch 3,40 SekundenAnders als in Python, wo dieselbe Operation noch einmal in einer async-„Farbe“ implementiert wird, hatte ich den Eindruck, dass hier alles grundsätzlich in Richtung Asynchronität verschoben wurde, bin mir aber nicht sicher, ob das stimmt
Ich frage mich, ob es sich lohnt, Ruby zu lernen, wenn man Python und NodeJS bereits kennt. Ruby wirkt interessant, fühlt sich aber schwierig an
Wenn man mit Node und Python vertraut ist, dürfte es ziemlich leicht zu lernen sein. Der Nachteil ist, dass es, wenn man diese Sprachen bereits kennt, grundsätzlich nichts völlig Neues ermöglicht. Der Vorteil ist vor allem ästhetisch: Ruby bietet und fördert Möglichkeiten, Code wirklich schön auszudrücken, und es macht Spaß, das zu erleben
Ich arbeite hauptsächlich in einer TypeScript-Codebasis, aber wenn ich mit Log-Daten oder halbstrukturiertem Text zu tun habe oder regex-basierte Umschreibungen über viele Dateien hinweg machen muss, greife ich oft zu Ruby. Ruby macht sehr viel Spaß und ist von den Sprachen, die ich regelmäßig verwendet habe, wahrscheinlich die unterhaltsamste — das ist schon für sich genommen eine Belohnung
Das größte Beispiel ist, dass Ruby Blöcke wirklich liebt. Sie sind überall in der Standardbibliothek, es gibt viel syntaktischen Zucker, und es gibt unzählige blockzentrierte DSLs. Auch typische funktionale Features sind schon lange in der Standardbibliothek enthalten, sodass man einen funktionalen Stil flüssig und gut lesbar schreiben kann.
In Python ist das technisch meist auch möglich, aber es wirkt beim Schreiben und Lesen deutlich unbeholfener. Python hat Lambdas, scheint sie aber über triviale Verwendungen hinaus nicht besonders zu mögen; stattdessen werden Funktionen überall als First-Class-Values verwendet
Leute mit Gespür für aktuelle Technologien wechselten zu API-orientierter Entwicklung auf Basis von node.js und AngularJS, die deutlich schneller war als Dinge, die mit RoR gebaut wurden. RoR wirkte 2013 bereits alt, weil der Standardansatz weiterhin monolithisch war und der Umstieg auf das neue Paradigma der Frontend-/Backend-Trennung nicht gut gelang.
Der Grund, warum ich lang über ein Framework in Ruby und nicht über Ruby selbst gesprochen habe, ist, dass wohl auch heute noch 95 % der Ruby-Entwicklung Rails-Anwendungen sein dürften. Berühmt wurde Ruby größtenteils dank Ruby on Rails, und wenn RoR auf dem Rückzug ist, wird Ruby wohl demselben Verlauf folgen, bis nur noch eine kleine, leidenschaftliche Community wie bei Perl übrig bleibt.
Wenn man nur die Sprache selbst betrachtet, fällt mir kein Grund ein, Ruby statt Python oder TypeScript zu wählen. Weder als Sprache noch als Plattform scheint Ruby etwas besser zu können als die bereits etablierteren Konkurrenten
Prism ist interessant. Ich frage mich, ob es Tools zur Analyse von Ruby-Code gibt, die es verwenden. Ich hatte nach einer Methode gesucht, den Code im Unternehmen zu analysieren
Die Umgebungsvariable
RUBY_MAX_CPU=nsetzt offenbar maximal N, also die maximale Zahl nativer Threads, und der Standardwert ist 8Ich hätte erwartet, dass der Standardwert wie bei Rusts Tokio oder vielen M:N-Laufzeiten die Anzahl logischer Kerne ist
init()odermain()Ich hoffe, dass Ruby 4.0 explizite Imports erlaubt statt der heutigen impliziten Methode, Gems in den globalen Namespace zu laden
Es gibt auch eine Diskussion über ein noch spekulatives Feature „namespace on read“: https://bugs.ruby-lang.org/issues/19744
Dass der globale Namespace genau eine Version jedes Gems unterstützt, fördert zudem eine gesunde Kultur, die stabile ABIs und Schonfristen bei Abkündigungen wertschätzt. Im Vergleich zu manchen Sprachökosystemen ist das traumhaft
Oder ich liege komplett daneben
https://youtu.be/4MM5b2F9zrM?si=UT3aUbD6p_uBZehS&t=2347