Systems programming,
without the GC
Ingle is a statically-typed, brace-delimited language in the lineage of C, C#, and Rust. Memory-safe without a garbage collector. Runs instantly on its VM — or compiles to a standalone native binary. Unusually predictable for both humans and language models.
Executable contracts, a replayable execution tape, structured concurrency with no function coloring — and a compiler that already rebuilds itself byte-for-byte. Systems code that proves itself.
fn main() -> int {
println("Hello, Ingle!")
return 0
}
// The contract is the spec; the body must satisfy it.
fn gcd(a: int, b: int) -> int
requires a > 0
requires b > 0
ensures result > 0
ensures a % result == 0
ensures b % result == 0
{
var x = a, y = b
loop {
if y == 0 { return x }
let t = x % y; x = y; y = t
}
}
// Structured concurrency — no async/sync split.
nursery {
spawn dispatch(jobs)
spawn worker(jobs, results)
spawn worker(jobs, results)
}
// Block exits only when every spawned task finishes.
LLM-first debugging
When a contract breaks, the tape shows exactly where
Executable requires/ensures
contracts emit structured events on the execution tape — machine-readable feedback
for an editor or language model, not just an abort message.
fn half(x: int) -> int
ensures result + result == x
{
return x / 2 // odd x loses remainder
}
fn main() -> int {
return half(7)
}
error[postcondition_failed]:
postcondition failed in 'half'
route: half (line 5) ← main (line 11)
{"event":"contract_violation",
"fn":"half",
"line":5,
"detail":"postcondition failed…",
"stack":[7,3]}
From script to metal
One language, one semantics, three distances from the hardware — the same program, the same contracts, the same tape at every stop.
Run it now
inglec --emit=run app.ig
The bytecode VM is the canonical semantics and the instant dev loop — no build step, contracts checked, tape on demand.
Ship a binary
inglec -o app app.ig
Emits C, compiles, links: a standalone native executable — the whole language, not a subset. The flagship GUI + HTTPS demo app compiles to a single 1.2 MB binary.
Boot bare metal (early)
inglec --emit=c --freestanding
The runtime compiles freestanding — no libc, no OS. A tiny Ingle kernel boots on QEMU (aarch64) with UART output, exception vectors, and timer interrupts. A proof of reach, not an OS.
Why Ingle
Memory-safe without a GC
Ownership, move/borrow checking, and deterministic reference counting. No pauses, no reference cycles. Shared data via rc struct and std/slotmap.
A real type system
Generics with bounds, exhaustive pattern matching, Option/Result with ?, interfaces with static and dynamic dispatch.
Structured concurrency
nursery/spawn with typed channels, running across every core. No function coloring — real stack traces, safe cancellation.
Verification built in
Executable contracts, execution tapes, and a static prover — a closed loop designed for humans and LLMs to debug against.
Two backends, one semantics
Bytecode VM as canonical reference; AST→C for native binaries. Differential tests keep them bit-for-bit identical.
Batteries included
UTF-8 strings, slices, C FFI, explicit-width numerics, stdlib in Ingle (std/http, std/map, …), plus opt-in graphics via Flare.
First-class editor support
inglec --lsp with hover, completion, rename, semantic tokens, inlay hints, signature help, and prover verdicts.
The compiler compiles itself
The full pipeline — lexer, parser, checker, codegen — is also written in Ingle and compiles itself; a self-built native compiler regenerates a byte-identical copy of itself. The C stage-0 compiler stays the reference.
LLM-first by design
Structured JSON diagnostics, a deterministic replayable tape, and the whole language in one file for a model's context: llms-full.txt.
Proof, not promises
A language that sells verification should be able to show its own. Every claim below is a gate that runs in CI on every change.
1,800+ automated checks, green on every commit
Golden tests, VM↔native differentials, doctor and LSP regressions — 431 in the core suite, 1,347 in the self-hosting gate alone.
VM ≡ native, byte for byte
Every test program runs on both backends — the bytecode VM and the compiled C — and their outputs must match exactly. Drift fails the build.
A byte-identical fixed point
The Ingle-written compiler, compiled to native by itself, regenerates its own C output byte-for-byte (N1 → N2). Self-hosting as a regression test, not a slogan.
Sanitizers and purpose-built fuzzers
ASan and TSan clean, plus three in-house fuzzers that attack memory ownership, operand-width limits, and resource linearity. CI on macOS and Linux, arm64 and x86_64.
Install
Runs on macOS and Linux (x86_64 and arm64). Requires a C17 compiler and GNU Make; the installer builds from source — no prebuilt releases yet.
Quick install (macOS & Linux)
curl -fsSL https://ingle-lang.org/install.sh | sh
Build from source
git clone https://github.com/ingle-lang/ingle
cd ingle && make && make install
make test
Installs to ~/.ingle.
Run programs with inglec --emit=run file.ig
or compile native binaries with inglec -o out file.ig.
See the README for details.
Editor support
Extensions drive the same in-tree language server — no reimplemented frontend.
Documentation
- What is Ingle? Plain-language overview — and how it differs from Ember.js
- MANIFESTO.md Design philosophy and founding decisions
- Language reference What runs today — grammar, types, semantics
- The Ingle Book Long-form guided tour
- Ingle from the Inside How the compiler works — the pipeline, the AST, the machinery
- Architecture Compiler and toolchain engineering decisions
- Flare Declarative UI over the graphics backend
-
Examples
Sample
.igprograms - llms-full.txt Working with an LLM? The entire book in one file, sized for a model's context