4.9 KiB
GC and Reachability Decision
Status: Accepted (Implemented) Cycle: Initial GC-and-reachability closure pass
1. Context
PBS v1 uses GC as the baseline runtime model, but the language still needs a precise statement of:
- what reachability guarantees are normative,
- what reclamation guarantees are normative,
- what remains implementation-defined,
- how GC interacts with the single normative safepoint at
FRAME_SYNC, - and what user code may or may not observe.
2. Decision
PBS v1 adopts the following GC-and-reachability baseline:
- GC is the baseline runtime model for VM-owned memory in PBS core.
- Reachability is the normative liveness criterion for GC-managed values.
- Eventual reclamation is the strongest reclamation guarantee in v1.
FRAME_SYNCis the only normative safepoint relevant to GC-observable behavior.- User code cannot observe reclamation directly.
- PBS v1 defines no user-authored finalizers, destructors, or reclamation callbacks.
- Implementations may perform internal GC work outside
FRAME_SYNConly if doing so creates no additional user-visible semantic effects.
3. Normative Reachability Contract
For GC-managed VM-owned values, liveness is defined by reachability from the runtime roots that matter to PBS semantics.
At minimum, these roots include:
- currently active local/frame state,
- reachable fields of reachable struct instances,
- service singleton roots,
- retained callback state that remains reachable,
- and any other runtime roots required to preserve already-observable PBS behavior.
If a GC-managed value remains reachable through the normative runtime state, the implementation must preserve its continued semantic availability.
If a value becomes unreachable, user code must not rely on when reclamation occurs.
4. Reclamation Guarantee
PBS v1 guarantees eventual reclamation, not prompt reclamation.
This means:
- unreachable GC-managed memory may be reclaimed later,
- the language does not promise immediate reclamation,
- the language does not promise reclamation at a specific frame boundary,
- and the language does not expose a semantic event when reclamation occurs.
5. Safepoint Relationship
FRAME_SYNC is the only normative safepoint in PBS v1.
For GC semantics, this means:
- the language does not promise any additional observable GC safepoints,
- no user-visible program rule may depend on another safepoint existing,
- and any internal collector work outside
FRAME_SYNCmust remain semantically invisible to PBS userland.
The spec does not require a specific collector architecture. It only constrains what may become observable.
6. Observability
User code cannot observe reclamation directly.
PBS v1 provides no user-visible mechanism for:
- detecting that a value was collected,
- registering a callback on reclamation,
- forcing immediate collection,
- or sequencing user code against GC timing.
GC-related information may appear in diagnostics, profiling, or runtime tooling, but those surfaces are not ordinary language semantics.
7. Finalization and Cleanup
PBS v1 forbids user-authored finalizers and destructor-like reclamation hooks.
GC reclamation of pure VM-owned values does not trigger user code.
Host-backed cleanup policy is not defined by GC finalization semantics in this decision. If host-backed resources require explicit or contract-specific cleanup rules, those belong to the host-boundary decision track rather than to GC finalization in userland.
8. Invariants
- Reachability, not timing, is the normative semantic axis.
- Reclamation timing remains implementation-defined.
- No direct user-visible behavior is allowed to depend on collector timing.
- The only normative safepoint is
FRAME_SYNC. - GC must not create extra user-visible sequencing effects outside the already-closed execution model.
9. Beginner-Facing Model
The user-facing explanation should be:
- if a value can still be reached by the program, it remains alive,
- once it can no longer be reached, the runtime may clean it up later,
- the program does not control or directly observe that cleanup moment.
10. Explicit Non-Decisions
This decision record does not yet close:
- the exact collector algorithm,
- host-backed resource cleanup semantics,
- diagnostics wording for GC-related tooling surfaces,
- the full root-set wording as finally integrated into the memory specification.
11. Spec Impact
This decision should feed at least:
docs/pbs/specs/10. Memory and Lifetime Specification.mddocs/pbs/specs/12. Diagnostics Specification.mddocs/general/specs/16. Runtime Execution and Initialization Specification.md
12. Validation Notes
The intended split is:
- GC defines reachability and eventual reclamation,
FRAME_SYNCis the only normative safepoint,- reclamation timing is not user-observable,
- host-backed cleanup is a separate boundary question rather than a user finalization feature.