AXIOM Документація Axiom
ENBLACKGRAYWHITE
Axiom · light

Паралелізм без data race

Parallelism дозволений тоді, коли compiler може довести сумісність effect sets і memory regions.

Axiom не намагається знайти race у runtime. Він забороняє ordinary conflicting concurrent access ще до генерації коду.

Паралельна обробка незалежних частин

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 view на audio/data buffer.

2

parallel for вимагає proof independence між ітераціями.

3

Кожна ітерація читає/пише лише samples[i]. Якщо analyzer доводить, що різні i — disjoint elements, loop законний.

Scoped task borrow

Ownership transfer / scoped borrowAxiom
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

Передумова доводить, що mutable regions не перекриваються.

3

Task отримує scoped mutable borrow left.

4

Другий task — right.

5

Після await mutable permission повертається parent scope.

6

Structured concurrency не дозволяє child пережити borrowed memory.

Shared mutable state

Звичайний mutable object не можна просто дати двом tasks. Для спільного стану існують semantic synchronization types: atomic<T>, mutex<T>, channel<T>. Lock тимчасово видає exclusive mutable permission.

Memory order

Atomic operations за замовчуванням мають sequential semantics. Слабші порядки — relaxed, acquire, release, acquire_release — задаються явно. Семантично безглузде load(release) є compile-time error.