5.6 KiB
Allocation and Cost Visibility Decision
Status: Accepted Cycle: Initial allocation-and-cost closure pass
1. Context
PBS v1 needs a minimal but explicit contract for which runtime cost facts matter semantically and which belong only to diagnostics/profiling quality.
Earlier decisions already fixed important inputs:
bind(context, fn_name)has real retention/storage consequences,optional,result,handle,!,if, andswitchare not intended to hide implicit allocation semantics,- host/userland interaction is stack-only across the boundary,
- and value categories already distinguish copied payload from preserved aliasing.
2. Decision
PBS v1 adopts the following cost-visibility baseline:
- The normatively relevant cost facts are:
- whether an operation may allocate VM-owned runtime storage,
- whether an operation retains state beyond the current evaluation,
- whether an operation copies payload versus preserves aliasing,
- whether an operation crosses the host boundary,
- and whether an operation may trap.
bind(context, fn_name)is normatively retention-bearing and requires runtime storage sufficient to keep the callback target and captured context alive.applyis not allocation-bearing by itself.optional,result,handle,!,if, andswitchare not allocation-bearing by themselves.- Host-boundary crossing is a normatively relevant cost fact, but concrete host-side allocation details belong to subsystem-specific contracts rather than to a general PBS rule.
- Quantitative reporting such as exact byte counts, exact object counts, or precise collector timing is not a normative language guarantee in v1.
3. Normatively Relevant Cost Facts
The following cost facts are part of the PBS semantic model and may be relied on by later tooling/spec work:
- VM allocation-bearing versus non-allocation-bearing behavior,
- retention-bearing versus non-retention-bearing behavior,
- copy versus aliasing preservation,
- host-boundary crossing,
- trap possibility.
These facts matter because they affect how advanced tooling, diagnostics, and performance reasoning should interpret a construct.
4. bind
bind(context, fn_name) is the strongest closed cost case in the current PBS core.
Rules:
bindis not semantically free,bindis retention-bearing,bindrequires runtime storage sufficient to preserve the callback target and captured context,- the captured context remains alive while the callback value remains alive.
This decision does not require the spec to freeze the exact runtime layout used to implement that storage.
5. Non-Allocation-Bearing Surfaces
The following constructs are not allocation-bearing by themselves in PBS v1:
optionalresulthandle!ifswitchapply
If allocation or retention occurs while evaluating one of these constructs, that cost arises from:
- subexpression evaluation,
- called targets,
- payload formation already defined elsewhere,
- or runtime behavior outside the surface itself.
6. Copy Versus Aliasing
Copy versus aliasing is a normatively relevant cost fact.
The language already distinguishes:
- pure values copied by value,
- identity-bearing values passed by preserved aliasing,
- carriers that preserve the semantics of their contained values.
Tooling and later specs may rely on these distinctions even if PBS v1 does not require a warning at every such site.
7. Host Boundary
Crossing the host boundary is a normatively relevant cost fact.
However, this decision does not impose a universal rule for:
- host-side allocation volume,
- host-side object count,
- or host-side retention internals.
Those details belong to subsystem-specific contracts when and if they become relevant.
8. Normative Versus Best-Effort Reporting
8.1 Normative facts
The following facts are normative and may be surfaced by diagnostics/tooling:
- whether a construct is retention-bearing,
- whether a construct crosses the host boundary,
- whether semantics preserve aliasing or copy payload,
- whether a construct may trap.
8.2 Best-effort facts
The following facts are not normative language guarantees in v1:
- exact byte counts,
- exact object counts,
- exact collector timing,
- exact host-side allocation volume,
- precise performance ranking beyond the semantic facts above.
These may be surfaced by implementations as profiling or tooling enrichment, but they are not part of the core language contract.
9. Invariants
- The language must not imply hidden allocation semantics where none were intentionally specified.
bindremains the canonical retention-bearing callback-forming construct in v1.- Cost visibility must be strong enough for advanced tooling without forcing exact runtime accounting into the language spec.
- Host-boundary cost reporting must not pretend to know subsystem-specific runtime internals unless those are explicitly specified.
10. Explicit Non-Decisions
This decision record does not yet close:
- the final diagnostics wording for warnings or notes,
- subsystem-specific host cost contracts,
- precise collection/profiling metrics,
- optimizer-facing reporting policy.
11. Spec Impact
This decision should feed at least:
docs/pbs/specs/10. Memory and Lifetime Specification.mddocs/pbs/specs/11. Diagnostics Specification.md
12. Validation Notes
The intended split is:
- semantic cost facts are explicit,
bindis the main retained-storage construct already closed,- most other core surfaces are not allocation-bearing by themselves,
- and quantitative performance reporting remains tooling-quality rather than normative language behavior.