The M9 compiler m9c, the runtime libm9rt.a, the standard library as M9 source, the module reference, the compiler's man page and the VS Code extension files. gcc is the only toolchain any of them needs.
One package per distribution, x86-64, each built ON that distribution (the Ubuntu 26.04 one on a real 26.04 machine rather than a VM) from the one source tarball attached here (m9-0.5.0.tar.gz, sha256 83a4b986bc904ebf279e3204c0d1b2234f3285befeece3fd24f89a51572a7f6c), then installed there and made to compile and run an M9 program with an empty environment before it was allowed to leave the build machine.
That tarball is the same set of files as this repository -- the compiler, runtime, standard library, gates, man page and module reference -- and the release tooling refuses to cut one that is not, checked both against the list and against an independent deny-list of paths that must never be published.
| distribution | package | install |
|---|---|---|
| Ubuntu 24.04 LTS | m9_0.5.0-1_amd64.ubuntu24.04.deb |
sudo apt install ./m9_0.5.0-1_amd64.ubuntu24.04.deb |
| Ubuntu 26.04 LTS | m9_0.5.0-1_amd64.ubuntu26.04.deb |
sudo apt install ./m9_0.5.0-1_amd64.ubuntu26.04.deb |
| Debian 13 | m9_0.5.0-1_amd64.debian13.deb |
sudo apt install ./m9_0.5.0-1_amd64.debian13.deb |
| Fedora 43 | m9-0.5.0-1.fc43.x86_64.rpm |
sudo dnf install ./m9-0.5.0-1.fc43.x86_64.rpm |
| Rocky 9 (RHEL 9, Alma 9) | m9-0.5.0-1.el9.x86_64.rpm |
sudo dnf install ./m9-0.5.0-1.el9.x86_64.rpm |
| Arch | m9-0.5.0-1-x86_64.pkg.tar.zst |
sudo pacman -U ./m9-0.5.0-1-x86_64.pkg.tar.zst |
What changed since the previous release
- STRINGS LEAVE A FRAME ON THEIR OWN (report par 2.3). A
+result lives in the frame arena and used to die with it, so a string that RETURNed or was written to a VAR/OWN STR parameter dangled unless the author copied it into a named pool. The generator now re-homes at the frame's exit: if the string's address lies in the dying arena its bytes are copied into the caller's, otherwise it is left alone -- exact by address, not by analysis. Stores the exit cannot see (a module variable, a component reached through a reference parameter) are refused. - Fmt takes no pool: Fixed, Sci, I64Str and the rest answer their digits from the frame. AN API BREAK -- every caller drops the pool argument -- and the reason this is 0.5.0. Every module, example and tutorial chapter in the tree is updated.
- The runtime recycles minimum-size frame blocks per thread: a frame's first
+was a malloc, a free and a page fault per call, and 100,000 formatted values took 1.54 s against 0.28 s for the pool-taking Fmt. Now 0.26 s and 27.5 MB against 64 MB. - SizeOf (x) and ByteSize (s): a type's byte size and a slice's data bytes, for in-memory questions; wire formats keep the exact-width types and ToBytesLE.
- The checker refuses an undefined bare name (it used to pass
IF alex THENand leave it to the generator), an unknown or undefined exception name, and a second program module in one file (MODULE Hello. MODULE Welcome.compiled and ran Welcome). - m9c -g: an unhandled exception is reported with the file and line of the raising statement (
Over.m9:7: unhandled Overflow); the default generated C is unchanged. - m9fmt, a source formatter in M9: the compiler's own canonical layout with every comment kept in place;
-wrewrites,--checkgates. Ships as library source like m9lsp: build it withm9c --make -o m9fmt M9fmt. - The installed library now actually holds Lsp.m9 and M9fmt.m9. 0.4.1's changelog said m9lsp ships as library source, and /usr/lib/m9 of 0.4.1 held no Lsp.m9 -- the claim had no test. debian/tests/compile-a-program builds both from the installed library, and m9lsp's announced version is gated against this changelog the way m9c --version already was (0.4.1's m9lsp said 0.4.0).
Each .receipt records the distribution the package was built on, its sha256, the tarball's sha256, the gcc that built it, and the smoke line. Nothing here was modified after it came back from the build machine except the 3 debs' file names, which carry their distribution because they would otherwise be the same name (dpkg reads the control file, not the name).
Chapter 0 of the tutorial (M9Tutorial, tutorial.modula9.net) covers installation from these and from source.