Repository navigation
IronRuby 4.0.5 is the first release built for .NET 10 and .NET 11, and the first without .NET 8. .NET 8 reached the end of Microsoft support on 10 November 2026, and 4.0.4 was the last release for it. Each download now comes in two builds: one on .NET 10, an LTS release and the default download, which keeps the names earlier releases used, and one on .NET 11, named -net11-. Both carry their runtime, so neither needs .NET installed. On .NET 11.0.0, multiplying and dividing big Integers is several times slower than on .NET 10; most other code runs a few percent faster there. Apart from the move to the new runtimes, it has one fix, which .NET 11 made necessary: an Integer too large for .NET's BigInteger raises NoMemoryError on every runtime.
.NET 10 and .NET 11
- .NET 8 is gone. The source builds for
net10.0andnet11.0
(IronRubyTargetFrameworksinDirectory.Build.props), and the code that only .NET 8
needed is removed (#198). A program that hosts IronRuby, or loads its assemblies, needs
.NET 10 or later. Scripts run with the self-contained downloads are not affected: the
downloads bring their own runtime. - Two downloads for each platform. The archives named as before,
ironruby-4.0.5-<platform>, and the Windows installer are built on .NET 10 and carry the
.NET 10 runtime. .NET 10 is supported until 14 November 2028
(.NET support policy).
Theironruby-4.0.5-net11-<platform>archives are the same IronRuby built on .NET 11
and carry its runtime. Their launchers run the .NET 11 build. There is no .NET 11
installer. - Why .NET 10 is the default. On .NET 11.0.0,
BigIntegermultiplication and division
are 3 to 6 times slower than on .NET 10, in plain C# too: a 3,000-digita * btakes
176 µs instead of 37 µs. Code that works on big Integers runs slower on the .NET 11
download; TruffleRuby'spidigitsbenchmark takes 3.3 times as long (#198). - Elsewhere, .NET 11 is a little faster (#198, Release builds measured side by side on
Linux x64). Startup is about 5% shorter:ir -e 1takes 430 ms instead of 456 ms, and
require "json"502 ms instead of 530 ms. TruffleRuby'sbench/(136 benchmarks) runs
3.5% faster by geometric mean, and a 10-benchmark subset of ruby-bench 3.9% faster.
AWFY is unchanged (+0.2%). Among the issue #89 micro-benchmarks, a raise rescued in
place is 15% faster andThread.new { }.join17% faster, whileis_a?is 25% slower.
Changed
- No Integer can be wider than about 2**31 bits (#198). .NET's
BigIntegerholds at
most 2**31 - 64 bits on .NET 9 and later. The 4.0.4 downloads ran on .NET 8, where
1 << 2**31built the Integer; on the 4.0.5 downloads it raisesNoMemoryError, as
CRuby does when an allocation fails. - On Windows,
zlibruns on .NET 10's or .NET 11's zlib-ng (#198), the zlib inside
.NET, where 4.0.4 ran on .NET 8's fork of zlib 1.2.Zlib::ZLIB_VERSIONis
"1.3.1.zlib-ng"instead of"1.2.13", and compressed bytes may differ from 4.0.4's.
They inflate the same.
Fixed
- Too-large Integers on .NET 11 raise
NoMemoryError(#198). .NET 11'sBigInteger
shifts no longer check its maximum length, while its other operations still do
(dotnet/runtime#137327). So on .NET 11
1 << 2**31succeeded, and the next operation on the result, such asx | 1, raised a
rawSystem::OverflowException. IronRuby now checks the limit itself, in left shifts,
Integer#**, right shifts by a negative count and on negative Integers, and raises
NoMemoryErroras it does on .NET 10.
For contributors
- CI tests .NET 11 on every pull request and push, and .NET 10 before a release (#198).
ci.ymlrunsnet11.0only on pull requests and pushes.net10.0runs as well on a pull
request from arelease/*branch, on a run by hand (workflow_dispatch,tfmsinput:
both,net10.0ornet11.0) and inrelease.ymlwhen av*tag is pushed. There,
ci.yml's whole test set runs on both frameworks, and nothing is published unless it
passes. Util/package-release.shtakes the framework fromIR_TFM(net10.0by default). A
net11.0archive is namedironruby-<version>-net11-<rid>, and its launchers default to
that build.release.ymlpackages every platform on both frameworks.- The startup library (
Util/aot) is built for both frameworks (#198). A Linux Release
build now installsIronRuby.Startup.dllin thenet10.0and thenet11.0ReadyToRun
host. Before, it built for neither. ir.sh,ironruby(.cmd), theMakefile,default.mspecand theUtilscripts default to
net10.0;IR_TFM=net11.0picks the .NET 11 build.
Download
Self-contained: unpack one and run ./ironruby, ./iirb.sh and ./igem.sh - on Windows
ironruby.cmd, iirb.cmd and igem.cmd. No .NET to install. Or, on Windows, run the
installer.
On .NET 10 (LTS, the default):
- Windows x64 installer:
ironruby-4.0.5-win-x64-setup.exe, the zip below, installed
intoC:\IronRuby40-x64and put on the PATH - Windows x64:
ironruby-4.0.5-win-x64.zip, with Windows Forms, WPF,ironrubyw.exe
andSamples\Notepad\notepad.cmd - Linux x64:
ironruby-4.0.5-linux-x64.tar.gz - macOS arm64:
ironruby-4.0.5-osx-arm64.tar.gz, built in CI, not tested there
On .NET 11:
- Windows x64:
ironruby-4.0.5-net11-win-x64.zip, with the same contents as the
.NET 10 zip - Linux x64:
ironruby-4.0.5-net11-linux-x64.tar.gz - macOS arm64:
ironruby-4.0.5-net11-osx-arm64.tar.gz, built in CI, not tested there
SHA256SUMS lists the checksums of all of them. Each file and SHA256SUMS has a signed
build provenance attestation, which says which workflow built it, from which commit, in
which run:
gh attestation verify ironruby-4.0.5-net11-linux-x64.tar.gz --repo Largo/ironruby
What's Changed
- Drop .NET 8, add .NET 11 by @Largo in #198
- Release 4.0.5 by @Largo in #199
- Release workflow: publish only the archives; retry the flaky macOS publish by @Largo in #200
Full Changelog: v4.0.4...v4.0.5