8 ms·
Ruby 4.0.0 Preview2
- lloydatkinson 11mo agoI didn't know Ruby has three different JITs
- hartator 11mo agoYes, specially ZJIT is news to me.
- rurban 11mo agoYou can ignore it. It's just that the Japanese cannot allow an external jit dominate, and so they came up with a much simplier tier 0 method jit, which will never be able to surpass Maxime's yjit.
- shevy-java 11mo agoMostly the newer ones try to improve the older ones. I guess at some later point one will dominate and the others will go sleep mode. Just like in the movie Highlander - there can only be one. (I couldn't name offhand which JIT is the main one right now ... I always think it is from Takashi Kokubun but that may now be outdated. MJIT YJIT ZJIT HUJIT WAJIT WTFJIT GRANDMAJIT - too many JITs.)
- Lio 11mo agoI was actually hoping it would be four JITs and we'd get Tenderlove's tiny FFI JIT too. https://railsatscale.com/2025-02-12-tiny-jits-for-a-faster-ffi/ https://railsatscale.com/2025-02-12-tiny-jits-for-a-faster-f...
- pjmlp 11mo agoIt actually has several more, if you take into account JRuby + all JVM implementations (OpenJDK based distros, OpenJ9, Azul, PTC,...), ART even if not JVM proper with Ruboto, and TruffleRuby on GraalVM.
- falcor84 11mo agoAny particular changes of interest?
- dudeinjapan 11mo agoZJIT is supposed to be an improvement on YJIT. I'm happy to get any free performance improvements! The Ruby Ractor (Actor) interface is now completely changed to use a Ractor::Port class, mirroring IPC (inter-process communication) semantics. Ractors were added in 3.0 as a way to get around the GVL/GIL, but having N number of Ruby interpreters running in a Ruby process which would enable executing on N cores at once. For me, hot take but Ractors don't seem to offer major advantages over plain-ol' copy-on-write (COW) forking. The one "big" feature was supposed to be namespaces, which apparently have now been renamed to Ruby::Box (https://docs.ruby-lang.org/en/master/box_md.html https://docs.ruby-lang.org/en/master/box_md.html). From what I can glean from the Ruby issue tracker, it appears this feature has been radically descoped, primarily because it had performance impacts, but also, I think probably there are realistic concerns about fit with the existing ecosystem. Unlike Javascript/Python, Ruby has never used "modules" for code isolation--everything is loaded into the global namespace (the "global dumping ground" as I call it.) Now the Box feature is only enabled with an environment variable RUBY_BOX=1 https://bugs.ruby-lang.org/issues/21311 https://bugs.ruby-lang.org/issues/21311
- shevy-java 11mo agoI don't think it has really descoped. They just want the transition to be smooth. So they start slowly. The lead japanese dev will most likely in 2026 go for more extension, and I also think this kind of has to be synced a bit with ractor (I think?). Ractor is also strange. Do many people use ractors? I rarely see them used in actual ruby code out there. Right now it seems to me as if ractors are used by only ... say ... 1% or fewer of the ruby developers out there. A bit more than refinement users ... :P
- dudeinjapan 11mo agoRactors have promise but the implementations up till now haven't had strong concurrency safety. It seems in the latest release some of the heavy-hitter contributors like Jean Boussier (byroot) have taken a detailed look at Ractors and started to clean things up. https://byroot.github.io/ruby/performance/2025/05/24/unlocking-ractors-class-variables.html https://byroot.github.io/ruby/performance/2025/05/24/unlocki...
- shevy-java 11mo agoIt is 4.0.0 largely because matz created ruby 30 years ago. matz is no longer the youngest - although he does look young, he is already 60 years old. He also said he has a retirement plan, e. g. avoiding a situation such as when Guido quit (or semi-quit) from Python (due to fatigue/frustration; Guido is not 100% retired but he is also not necessarily the solo-design-dev either, so it is a bit of a semi-retirement). So we won't know how long matz will be the lead designer of ruby - and who will succeed. Which may be reason to worry depending on who it would be. Imagine DHH takes over - man, there would be an insta-exodus of people ... So while this release does not have a lot of content as such, one thing that is quite big, even though right now it is not, is Ruby::Box. There are many who don't understand it. The thing is ... I understand the use cases for it. I was not involved in any way with regards to its design, mind you - that was mostly a japanese-group in design. But there are objective use cases for it. Many years ago I recall on IRC (we oldschool people used IRC back in the pre-discord stone age) some C# hacker said he won't use ruby because there are no strong namespaces, that is, someone else can just overwrite things and then nothing works. Although I think he was a drama guy, and any "danger" to be minimal, objectively he has had a point, simply because ruby had no strong concept of isolation here. Lateron there came refinements. Now refinements are strange, because while I think the use case makes sense, the syntax is strange. Syntax is one huge reason why I do not use refinements; but also because I try to avoid putting my own modifications all over the place, largely because I'd have to distribute that too, and also because modifying core classes, while that has a use, should not be done excessively, IMO. Ruby::Box kind of builds on that and makes the refinement use case more generic (eventually; I am aware that right now this is not the case but you need a transition stage. Syntax-wise Ruby::Box is also weird, so hopefully the syntax gets easier too, but I instantly understood the use cases. Many people don't, in particular about 95% who demanded a name change away from Namespace to something else, really don't understand the underlying use case.) Now - making isolated per-project changes is not the only use case. For instance, ractors could be simplified if you know that there are separate ruby processes; ruby threads probably too. These I consider secondary benefits though (and yes, that may be far in the future, who knows; when python removed its GIL though, it put ruby under pressure, aka shape-up-or-go-extinct mode). One thing I would complain a lot is that on rubygems.org, before RubyCentral went shopify-controlled-only, that people would occupy namespaces. Such as Configuration. I wanted to have a project called Configuration so I can do Configuration.new or Configuration.parse_this_file(). This is possible of course, but when it comes to distributing code, who owns that toplevel namespace? Normally the one who occupied the name first on rubygems.org, sort of. Via Ruby::Box, it should be possible to have ownerships. This could be strong or weak; weak as a hint, aka "psych is owned by ruby core ownershiper but it can be modified", or strong aka making it immutable. Both have use cases. Could also be both. Having this more organized would be really convenient for developers. I would not have to worry whether anyone else uses that "namespace". And of course we need a way to query this state from within ruby code too aka, say immutable: "If psych is owned by ruby-core, continue to use it." psych (for yaml) is not a good example here but you can think of any other namespace where you may only want to consider some gems/projects but not others. (Again, the use case may differ between strong and weak ownership, but the thing is that this is an improvement over the prior status quo.) There are several additional use cases to be had but I'll stop here. What I find strange is that many people who complain, don't refer to the old issues and discussions. We had discussions before refinements were added. About 80% of the people involved, DON'T EVEN KNOW THESE OLD DISCUSSIONS. Either they have dementia, or these are young ruby users who never were active in the old days. It's very strange. I am not saying all is perfect about Ruby::Box, in particular syntax-wise I'd like improvements, but many people don't seem to understand the use cases, and this is very very strange.
- ksec 11mo agoNothing about Fibres and Async from Samuel Williams ?
- Lio 11mo agoYep having the Async gem in the standard library would be a great win. Async Ruby is fantastic now. I think I read somewhere that Matz is actually in favour of that but Samuel is holding off for now.
- ksec 11mo agoYes. It should be in 4.0 as experimental at least before being official in 4.1z
- kmarc 11mo agoI'm tasked to amend a project written in ruby. With a python background (and some nice pydantic, type annotated, etc "strong" code bases behind my back), every day I spend with ruby is a minefield, a nightmare. I hoped that ruby4 maybe implements stuff that python has, like type annotations or making the damn parens mandatory, but no. Not surprised that python has ten times more developers according to stackoverflow's survey... I can't possibly imagine a collaborative project where other people also have to work on the same code base, and not having any clue what a symbol under the cursor might be. No type hints. No mandatory requires. No parens, so never know if something is a method or, callable, or variable. Basically IRB is a must for development, because in the editor, I'm blind. And the ecosystem is just sad. Swagger-rails libraries out there are rookie jokes compared to what python has. At least there is decent GRPC / protobuf integration, so all new services I am writing can be in python. Or any sane language.
- phantasmish 11mo agoI’ve sworn off Rails development for anything short of stupid-high compensation for similar reasons. Implicit imports (“… which package defined this symbol? Who knows!”), dynamic definitions all over the place (“where’s this defined? Literally nowhere until the program runs!”), all that stuff. It’s awful. I feel blind not being able to answer basic questions about a codebase with grep. And that’s not even considering the lack of static typing.
- dalenw 11mo agoI used to be a big ruby/rails fan but I have to agree with you. I now write c-sharp and it's a lot less stressful than Ruby. If a Ruby/Rails codebases get to a large enough point it's really difficult to keep track of what types a method you wrote accepts. You end up just constantly double checking your own code. Or you end up with a few type checks and/or type conversions at the top of every method. And maybe I was doing it wrong because it was early on in my career. But when a method can accept literally anything and return literally anything, not even a strong IDE like RubyMine can save you.
- chihuahua 11mo agoPeople on HN seem to hate it whenever someone criticizes Ruby. But the language is a sad joke that's gone on for too long. I totally agree with your points and have many more I could mention (lack of proper debugger support and shitty tooling in general - these things exist, but they break every week) The 4.0.0 release notes (TFA) are like a joke. Here are the language changes in their entirety: Language changes: *nil no longer calls nil.to_a That's it.
- thiago_fm 11mo agoVery little happened in Ruby since 3.2 or even 3, it feels stagnated. Still a very beautiful language from my point of view, but yeah, stagnation. Wish we'd see more action on RBS, perhaps getting Sorbet to core or something. At least having some sort of consensus in the community. Or even some considerable project in the JIT, dunno! Python is definitely ahead in types, work on removing the GIL... list is huge.
- honeycrispy 11mo agoI was so disappointed in how RBS was executed it caused me to give up on Ruby and move onto something else. I haven't looked back.
- rco8786 11mo agoI'm still a Ruby fan but I share your immense, nearly immeasurable disappointment on the implementation of RBS. It's as though someone was tasked to add types to Ruby but do it specifically in a way that would guarantee zero adoption.
- dtech 11mo agoOut of curiosity, why was RBS so poorly executed and adopted?
- honeycrispy 11mo agoThey put them in separate designated .rbs files, so far out of the way that they might as well not be there at all.
- multiplegeorges 11mo agoYou should look into rbs-inline. It's a huge DX improvement. The community spoke up and they are moving in the right direction now.
- deleted 11mo ago[deleted]
- to-too-two 11mo agoWith talk here of Ruby stagnating, has anyone checked out Crystal? I have not but have been curious about it.
- princevegeta89 11mo agoI checked out crystal. It's a nice little language, but it has a very, very long way to go. IDE support is still quite shaky and the developer community is not large enough yet. There are some few good packages and frameworks that work very well though. I think it's still not supported on Windows as of today.
- wmoxam 11mo agoIt has similar syntax, but adding explicit types and macros it's a very different language in practice. IMO the two languages can be quite complimentary, I've been exploring using Crystal + MRuby to create apps, it's been fun so far.
- jazzyjackson 11mo agoOne man's stagnation is another's stability, no?
- karunamurti 11mo agoSo Christmas is near the corner then.
- Lammy 11mo agoI've really loved programming with Ractors in the 3.x series and am excited for Ractor::Port