Co-authored-by: Nilton Constantino <nilton.constantino@visma.com> Reviewed-on: #8
7.3 KiB
Prometeu PBS v0 — Unified Project, Module, Linking & Execution Specification
Status: Canonical / Replaces all previous module & linking specs
This document fully replaces:
- "PBS – Module and Linking Model"
- Any partial or implicit module/linking descriptions in earlier PBS documents
After this document, there must be no parallel or competing spec describing project structure, modules, imports, or linking for PBS v0.
1. Purpose
This specification defines the single authoritative model for how a Prometeu PBS v0 program is:
- Organized as a project
- Structured into modules
- Resolved and linked at compile time
- Emitted as one executable bytecode blob
- Loaded and executed by the Prometeu Virtual Machine
The primary objective is to eliminate ambiguity by enforcing a strict separation of responsibilities:
- Compiler / Tooling: all symbolic, structural, and linking work
- Runtime / VM: verification and execution only
2. Core Principles
2.1 Compiler Finality Principle
All operations involving names, symbols, structure, or intent must be completed at compile time.
The VM never:
- Resolves symbols or names
- Loads or links multiple modules
- Applies relocations or fixups
- Interprets imports or dependencies
2.2 Single-Blob Execution Principle
A PBS v0 program is executed as one fully linked, self-contained bytecode blob.
At runtime there is no concept of:
- Projects
- Modules
- Imports
- Dependencies
These concepts exist only in the compiler.
3. Project Model
3.1 Project Root
A Prometeu project is defined by a directory containing:
prometeu.json— project manifest (required)- One or more module directories
3.2 prometeu.json Manifest
The project manifest is mandatory and must define:
{
"name": "example_project",
"version": "0.1.0",
"dependencies": {
"core": "../core",
"input": "../input"
}
}
Fields
-
name(string, required)- Canonical project identifier
-
version(string, required) -
dependencies(map, optional)- Key: dependency project name
- Value: filesystem path or resolver hint
Dependency resolution is purely a compiler concern.
4. Module Model (Compile-Time Only)
4.1 Module Definition
- A module is a directory inside a project
- Each module contains one or more
.pbssource files
4.2 Visibility Rules
Visibility is enforced exclusively at compile time:
file: visible only within the same source filemod: visible within the same modulepub: visible to importing modules or projects
The VM has zero awareness of visibility.
5. Imports & Dependency Resolution
5.1 Import Syntax
Imports reference projects and modules, never files:
import @core:math
import @input:pad
5.2 Resolution Pipeline
The compiler performs the following phases:
- Project dependency graph resolution (via
prometeu.json) - Module discovery
- Symbol table construction
- Name and visibility resolution
- Type checking
Any failure aborts compilation and never reaches the VM.
6. Linking Model (Compiler Responsibility)
6.1 Link Stage
After semantic validation, the compiler executes a mandatory link stage.
The linker:
- Assigns final
func_idindices - Assigns constant pool indices
- Computes final
code_offsetandcode_len - Resolves all jumps and calls
- Merges all module bytecode into one contiguous code segment
6.2 Link Output Format
The output of linking is a Linked PBS Program with the following layout:
[ Header ]
[ Constant Pool ]
[ Function Table ]
[ Code Segment ]
All references are:
- Absolute
- Final
- Fully resolved
No relocations or fixups remain.
7. Runtime Execution Contract
7.1 VM Input Requirements
The Prometeu VM accepts only linked PBS blobs.
It assumes:
- All function references are valid
- All jumps target instruction boundaries
- No unresolved imports exist
7.2 VM Responsibilities
The VM is responsible for:
- Loading the bytecode blob
- Structural and control-flow verification
- Stack discipline verification
- Deterministic execution
The VM must not:
- Perform linking
- Resolve symbols
- Modify code offsets
- Load multiple modules
8. Errors and Runtime Traps
8.1 Compile-Time Errors
Handled exclusively by the compiler:
- Unresolved imports
- Visibility violations
- Type errors
- Circular dependencies
These errors never produce bytecode.
8.2 Runtime Traps
Runtime traps represent deterministic execution faults, such as:
- Stack underflow
- Invalid local access
- Invalid syscall invocation
- Explicit
TRAPopcode
Traps are part of the execution model, not debugging.
9. Versioning and Scope
9.1 PBS v0 Guarantees
PBS v0 guarantees:
- Single-blob execution
- No runtime linking
- Deterministic behavior
9.2 Out of Scope for v0
The following are explicitly excluded from PBS v0:
- Dynamic module loading
- Runtime imports
- Hot reloading
- Partial linking
10. Canonical Ownership Summary
| Concern | Owner |
|---|---|
| Project structure | Compiler |
| Dependencies | Compiler |
| Modules & imports | Compiler |
| Linking | Compiler |
| Bytecode format | Bytecode spec |
| Verification | VM |
| Execution | VM |
Rule of thumb: If it requires names, symbols, or intent → compiler. If it requires bytes, slots, or PCs → VM.
11. Final Note
After adoption of this document:
- Any existing or future document describing PBS modules or linking must defer to this spec
- Any behavior conflicting with this spec is considered non-compliant
- The Prometeu VM is formally defined as a pure executor, not a linker
Addendum — prometeu.json and Dependency Management
This specification intentionally does not standardize the full dependency resolution algorithm for prometeu.json.
Scope Clarification
prometeu.jsondefines project identity and declared dependencies only.- Dependency resolution, fetching, version selection, and conflict handling are responsibilities of the Prometeu Compiler, not the VM and not the runtime bytecode format.
- The Virtual Machine never reads or interprets
prometeu.json.
Compiler Responsibility
The compiler is responsible for:
- Resolving dependency sources (
path,git, registry, etc.) - Selecting versions (exact, range, or
latest) - Applying aliasing / renaming rules
- Detecting conflicts and incompatibilities
- Producing a fully linked, closed-world Program Image
After compilation and linking:
- All symbols are resolved
- All function indices are fixed
- All imports are flattened into the final bytecode image
The VM consumes only the resulting bytecode blob and associated metadata.
Separate Specification
A dedicated specification will define:
- The complete schema of
prometeu.json - Dependency version semantics
- Resolution order and override rules
- Tooling expectations (compiler, build system, CI)
This addendum exists to explicitly state the boundary:
prometeu.jsonis a compiler concern; dependency management is not part of the VM or bytecode execution model.