Programming Language

Nocter

A self-contained systems language built around simplicity, encapsulation, and foolproof design.

/releases/v0.25.0.md

Nocter v0.25.0 Release Notes

Download nocter-v0.25.0-arm64-darwin.tar.gz

Nocter v0.25.0 introduces source-visible no-allocation contracts and strengthens the compiler ownership boundaries that preserve semantic results for CLI and editor queries. The only implemented host and native target remains arm64-darwin.

No-allocation Contracts

noalloc is an optional callable guarantee. It states that no execution path can request new storage from a Nocter allocator:

pub noalloc func byte_count(text: &str): usize {
    return text.len()
}

instance str {
    pub noalloc method &self.len(): usize
}

The same modifier applies to construction functions, literals, methods, operators, coercions, interface requirements and defaults, primitive functions, callable types, and drop. An unqualified callable remains valid and exports no allocation guarantee; it does not assert that allocation occurs.

The guarantee is independent of result provenance and the hidden allocation-context ABI lane. It does not promise absence of deallocation, traps, blocking, system calls, recoverable failures, or other side effects.

Transitive Proof

The compiler proves noalloc from checked semantic operations rather than names or target instructions. One program-wide least fixed point follows direct calls, callbacks, closures, interface selection, coercions, operators, literals, implicit destruction, recursive components, generic substitutions, and opaque witnesses. Trusted primitive metadata and one selected standard allocation-request role close operations whose implementations cross the language boundary.

Unknown abstract callees remain conservative. A callable value or interface requirement must carry noalloc before another public contract can rely on it. A proven no-allocation callable may erase its guarantee when converted to an unqualified callable type, but the guarantee cannot be reconstructed later from the hidden value.

Standard Library and Tooling

Stable allocation-free standard APIs publish noalloc only where the guarantee is intended as a long-term contract. Generic APIs do not claim it when user-selected operators or destruction can allocate. Primitive declarations are accepted only when the compiler's closed registry certifies the same effect.

Formatting, hover, signature help, completion, navigation, code actions, and normalized declaration presentation retain authored guarantees. Tooling does not synthesize inferred noalloc syntax.

Compiler and Editor Reliability

Semantic query products now preserve typed failures and exact source ownership across checking, session, projection, target, and workspace boundaries. Recovery does not replace an earlier cause with a generic missing-result error. Target validation consumes checked semantics without source projection, and exact body analysis receives one checking-owned source input rather than independently pairable source facts.

Compatibility

Existing unqualified callables remain source-compatible. Adding noalloc creates an enforced API contract, so a declaration is rejected when direct or transitive behavior may allocate. Public contract and private implementation declarations must carry the same guarantee. No compatibility alias, inferred source modifier, or alternate alloc spelling is provided.

v0.25.0 retains the v0.24.0 module, ownership, standard-library, native ABI, package-integrity, and distribution boundaries. It does not add alloc, notrap, noblock, nosuspend, realtime, a general effect list, floating point, a second target, or persistent compiler caches.

Candidate Qualification

Release-content commit 321d171a02bcf2e818bf8a805631872ebbdbdfe1 passed two independent locked workspace test runs, each with 1,501 passed, zero failed, and one ignored public-HTTPS test. The HTTPS Git acquisition test passed separately, and warnings-denied all-target Clippy passed in both clean external targets.

Two independent optimized package builds produced byte-identical archives and recursively identical installed homes. The retained archive is 8,260,880 bytes with SHA-256 c1f0f5e0709b5b2c63ae6a2cee47a2c7926c340dc48c5be9d86c1e83b38036c9. Fresh extraction passed the complete CLI, all public examples, native execution, and framed LSP matrix without changing the installed home. Changing either the compiler or standard-library content was rejected before analysis.