Install
One binary, and clang.
Installing
curl -fsSL https://raw.githubusercontent.com/bradcypert/plum/main/install.sh | sh
That picks the right archive for your platform, checks it against the
published checksum, installs plum into ~/.local/bin, and runs it to
prove it works. It does not edit your shell configuration. If that
directory is not on your PATH it prints the line to add and stops.
PLUM_PREFIX and PLUM_VERSION override where and which.
You need clang on your PATH; the compiler shells out to it to
assemble and link what it emits. Nothing else is required: the C shims
Plum programs use are embedded in the compiler itself.
Or take an archive from Releases directly. It is a single binary.
Documentation lives at plumlang.org,
including the API reference —
which is generated by plum doc from the standard library’s own
source, the same command any Plum package can run on itself.
New to Plum? TUTORIAL.md is a twenty-minute tour
from plum new to a program with tests. Every snippet in it is a
complete program, and bootstrap/doc-check compiles and runs each one
against the output it claims. The rest of this README is the
reference.
Archives are published for Linux on x86_64 and arm64, macOS on Apple
Silicon and Intel, and Windows x86_64. The Windows one contains
plum.exe and is built for MSYS2/MinGW.
tar -xzf plum-*-arm64-macos.tar.gz
./plum-*-arm64-macos/plum version
The archive unpacks into a directory named for the version it contains,
so the glob saves pasting a version number that this page would then
have to be kept in step with. It was written out once, and said 0.0.7
for nineteen releases.
Platforms
A platform is published only once something in CI builds and runs real programs on it. Nothing here is merely expected to work.
| Platform | Status |
|---|---|
| Linux x86_64 | Full test suite, including leak checking under ASan |
| Linux arm64 | Full test suite, including leak checking under ASan |
| macOS arm64 | the whole execution corpus built and run in CI, plus the language server |
| macOS x86_64 | Same, checked on release tags |
| Windows x86_64 | the whole execution corpus built and run in CI, plus the language server |
macOS and Windows are a step down from Linux and it is worth knowing why: Plum is refcounted, so a leak is a miscompile rather than untidiness, and LeakSanitizer does not exist on Darwin. Both Linux targets run it, which is why arm64 is held to the same bar as x86_64 rather than a lower one: it is a different architecture, and so the likeliest place for a refcounting or alignment miscompile. See PORTING.md for what that costs and what is left.
Building the toolchain
Same requirement: clang, and nothing else.
./bootstrap/from-seed -o plum # clang only, no Rust
./plum build bootstrap/self_host -o plum
The first line builds a compiler from bootstrap/seed/plum.ll, which is the
self-hosted compiler shipped as LLVM IR, because building a compiler
written in Plum requires a Plum compiler to start from. The second line
then rebuilds it with itself, which is the compiler you keep.
The rest of this doc assumes plum is on your PATH; substitute the
full path otherwise.
There is no Rust in this repository
There used to be. Plum began as a Rust compiler, and after the
self-hosted one replaced its code generator on 2026-08-21 a Rust front
end and interpreter stayed on as a test oracle: interp-check ran every
execution fixture through it and compared answers. It earned that place
twice. Integer division by zero was undefined in both code generators
and printed a different wrong number in each, and 0.1 + 0.2 printed
0.3 in both, where the interpreter was right on both counts.
It was retired on 2026-08-25: 44,698 lines, a CI job, and the Rust toolchain dependency. Two things had gone wrong with it:
- It could not see shared bugs. An oracle finds disagreements. On
the day it was retired, property tests found two bugs the interpreter
had identically:
parse_intrejectingInt’s own minimum, andparse_floatlanding one ulp out. It had agreed with the compiler on both for as long as they existed. - It lagged the language, so the newest features (the ones most likely to be wrong) were exactly the ones it could not check.
bootstrap/property-check replaced it. Properties are written in Plum
and run by plum test, so they track the language instead of trailing
it, and they encode invariants known in advance rather than whatever an
implementation happens to produce. See DESIGN.md’s “Properties, and two
bugs an oracle could never find”.
Generated from INSTALL.md in the repository.