Skip to content
Beskid Platform specification

Beskid

Jump to a Beskid service

Beskid

Jump to a Beskid service

Design model

Spec standingStandard

Owner
Piotr Mikstacki
Submitter
Piotr Mikstacki

Separate who declares foreign calls, who validates signatures, and who resolves addresses at link or run time. User Extern libraries and runtime builtins follow different policy tracks.

ActorRole
Front-end / analysisParses Extern contracts, emits diagnostics for disallowed types (compiler/crates/beskid_analysis).
CodegenLowers approved calls to Cranelift call targets—either runtime builtins or imported extern symbols.
Engine (beskid_engine)Optional extern_dlopen path: dlopen / dlsym with caches (legacy v0.1; Proposed for new work—prefer link-time C ABI profile).
Runtime builtinsinterop_dispatch_unit, interop_dispatch_ptr, interop_dispatch_usize bridge language/runtime interop layouts (beskid_runtime::interop).
flowchart TB
  src[Beskid Extern contract]
  ty[Type + ABI validation]
  link[Link-time symbol]
  dyn[Optional dlopen path]
  rt[Runtime interop_dispatch_*]
  src --> ty
  ty --> link
  ty --> dyn
  ty --> rt

Link-time (Standard v0.3): User libraries resolve when producing AOT/JIT artifacts; addresses are fixed before execution.

Dynamic (legacy): Engine loads Library + Symbol strings from Extern(Abi:"C", Library:"…") metadata when extern_dlopen is enabled.

Runtime dispatch: Compiler-generated thunks call interop_dispatch_* for tagged interop values; layout offsets are stable per ABI version (ABI versioning).

  • Lowering must not embed OS-specific syscall behavior for user externs; syscalls remain in Panic, IO, and syscalls.
  • Allowed Cranelift scalar kinds for engine-validated externs: pointer-width integer, i64, i32, i8, f64 (legacy Extern policy v0.1).
  • High-level Beskid types in extern signatures must be rejected before codegen.