Plum

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.

PlatformStatus
Linux x86_64Full test suite, including leak checking under ASan
Linux arm64Full test suite, including leak checking under ASan
macOS arm64the whole execution corpus built and run in CI, plus the language server
macOS x86_64Same, checked on release tags
Windows x86_64the 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:

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.