AXIOM Axiom Documentation
UABLACKGRAYWHITE
Axiom · light

Parallelism without data races

Concurrency is allowed only when the compiler can prove compatible effect sets and memory regions.

Independent parallel iterations

Proven independent iterationsAxiom
1normalize(view<f32> samples):2    parallel for usize i = 0; i < samples.size(); i = i + 1:3        samples[i] = clamp(samples[i], -1.0, 1.0)
1

Mutable sample buffer.

2

A parallel loop requires an independence proof.

3

Each iteration touches only one element, so distinct indices can be proven disjoint.

Scoped task borrows

Scoped mutable borrowsAxiom
1process(view<u8> left, view<u8> right):2    require disjoint(left, right)3    const task a = spawn filter(left)4    const task b = spawn filter(right)5    await a6    await b
2

The caller proves the mutable regions do not overlap.

3

Task a borrows left.

4

Task b borrows right.

5

Await returns the permission to the parent scope.

6

Structured concurrency prevents borrowed memory from being outlived.

Shared state

Ordinary mutable data cannot be shared freely. Use semantic synchronization types such as atomic<T>, mutex<T>, and channel<T>. A mutex lock temporarily grants exclusive mutable permission.

Memory order

Atomics default to sequential semantics. Weaker orders such as relaxed, acquire, release, and acquire_release are explicit; nonsense combinations such as load(release) are compile-time errors.