252 lines
11 KiB
TeX
252 lines
11 KiB
TeX
%% SCRAP: architecture/03-architecture/OVERVIEW
|
|
%% SOURCE: docs/working/architecture/03-architecture/OVERVIEW.md
|
|
%% STATUS: CURRENT
|
|
%% FITS: dev-guide/ch-overview
|
|
%% EDITORIAL: lifted — prose rewritten to press voice
|
|
|
|
\section{Architecture Overview}
|
|
|
|
StarForth is a FORTH-79 compliant virtual machine built around a
|
|
physics-driven adaptive runtime, formally proven to achieve 0\% algorithmic
|
|
variance across experimental runs. Its architecture is organized into three
|
|
layers --- the VM core, a hardware abstraction layer, and platform
|
|
implementations --- coordinated by seven physics feedback loops that let the
|
|
runtime self-optimize without surrendering deterministic behavior. The central
|
|
innovation is a physics-grounded modeling vocabulary --- execution heat, the
|
|
rolling window of truth --- that drives adaptive optimization while preserving
|
|
reproducibility.
|
|
|
|
\subsection{Three-Layer Model}
|
|
|
|
The VM core sits atop a Hardware Abstraction Layer (HAL), which in turn rests on
|
|
platform-specific implementations. The VM is platform-agnostic and calls the
|
|
HAL only; it contains no \texttt{\#ifdef PLATFORM\_*} branches.
|
|
|
|
\begin{itemize}
|
|
\item \textbf{Layer 1 --- VM core and physics subsystems.} The FORTH-79
|
|
interpreter (\texttt{vm.c}), dictionary, data and return stacks, the physics
|
|
subsystems (heat, window, cache, pipelining), and the heartbeat coordinator.
|
|
\item \textbf{Layer 2 --- HAL.} Clean interfaces for timing
|
|
(\texttt{hal\_time.h}), interrupts (\texttt{hal\_interrupt.h}), memory
|
|
(\texttt{hal\_memory.h}), console I/O (\texttt{hal\_console.h}), and CPU
|
|
control (\texttt{hal\_cpu.h}).
|
|
\item \textbf{Layer 3 --- platform implementations.} Linux (POSIX
|
|
\texttt{clock\_gettime}, \texttt{malloc}, stdio), L4Re
|
|
(\texttt{L4Re::Clock}, dataspaces, L4Re console), and StarKernel (TSC +
|
|
HPET + APIC timing, PMM + VMM + \texttt{kmalloc}, UART + framebuffer).
|
|
\end{itemize}
|
|
|
|
\subsection{Core Components}
|
|
|
|
\subsubsection{VM Core}
|
|
|
|
The core (\texttt{src/vm.c}) runs the FORTH-79 interpreter loop, manages the
|
|
dictionary and stacks, executes words, and handles compilation through
|
|
\texttt{:} and \texttt{;}.
|
|
|
|
\begin{lstlisting}[language=C]
|
|
typedef struct VM {
|
|
vaddr_t data_stack[STACK_SIZE];
|
|
vaddr_t return_stack[STACK_SIZE];
|
|
vaddr_t dict_ptr; /* Dictionary pointer */
|
|
vaddr_t here; /* Compilation pointer */
|
|
DictEntry *latest; /* Most recent word */
|
|
HeartbeatState heartbeat; /* Timing coordinator */
|
|
RollingWindowOfTruth *window; /* Execution history */
|
|
/* ... */
|
|
} VM;
|
|
\end{lstlisting}
|
|
|
|
Execution proceeds by fetching the next word from the input stream, searching
|
|
the dictionary, then executing or compiling it (governed by
|
|
\texttt{WORD\_IMMEDIATE}) or, failing a dictionary match, parsing it as a
|
|
number. Each execution updates the word's execution heat as physics feedback.
|
|
|
|
\subsubsection{Dictionary System}
|
|
|
|
The dictionary is a linked list of \texttt{DictEntry} nodes, searched linearly
|
|
but accelerated by the hot-words cache. Each entry carries a name, code pointer,
|
|
flags, and physics metadata:
|
|
|
|
\begin{lstlisting}[language=C]
|
|
typedef struct DictEntry {
|
|
char name[32];
|
|
void (*code_ptr)(VM *vm);
|
|
uint32_t flags; /* IMMEDIATE, HIDDEN, etc. */
|
|
float execution_heat; /* Physics: frequency tracking */
|
|
PhysicsMetadata physics; /* Window samples, decay state */
|
|
TransitionMetrics *transitions; /* Pipelining: successor prediction */
|
|
struct DictEntry *next; /* Linked list */
|
|
} DictEntry;
|
|
\end{lstlisting}
|
|
|
|
\subsubsection{Memory Model}
|
|
|
|
VM addresses (\texttt{vaddr\_t}) are byte offsets, never C pointers. The
|
|
dictionary occupies the first 2~MB; user blocks begin at block 2048; the heap
|
|
is allocated through the HAL. All access goes through bounds-aware accessors,
|
|
\texttt{vm\_load\_cell()} and \texttt{vm\_store\_cell()}.
|
|
|
|
\subsection{Physics Subsystems}
|
|
|
|
Six coordinated subsystems implement the adaptive runtime.
|
|
|
|
\begin{itemize}
|
|
\item \textbf{Execution heat} (\texttt{dictionary\_heat\_optimization.c}) ---
|
|
each execution increments a per-word counter, identifying frequently used
|
|
words for optimization (positive feedback).
|
|
\item \textbf{Rolling window of truth}
|
|
(\texttt{rolling\_window\_of\_truth.c}) --- a fixed-size circular buffer of
|
|
execution samples, providing deterministic seeding for statistical metrics
|
|
such as ANOVA and Levene's test.
|
|
\item \textbf{Hot-words cache} (\texttt{physics\_hotwords\_cache.c}) --- sorts
|
|
dictionary entries by heat and moves hot words to the front of the list,
|
|
accelerating linear search. It yields a 10--30\% speedup on realistic
|
|
workloads, and cache updates are triggered by heat decay rather than
|
|
execution order, preserving determinism.
|
|
\item \textbf{Pipelining metrics}
|
|
(\texttt{physics\_pipelining\_metrics.c}) --- records the most common
|
|
successor of each word for future speculative prefetch; transition counts
|
|
update deterministically.
|
|
\item \textbf{Inference engine} (\texttt{inference\_engine.c}) --- adapts
|
|
window width and decay slope using deterministic statistical methods (ANOVA
|
|
early-exit, Levene's test, exponential regression), with no randomness.
|
|
\item \textbf{Heartbeat system} --- a centralized, time-driven coordinator
|
|
that periodically triggers heat decay (Loop \#3) and window-width inference
|
|
(Loop \#5).
|
|
\end{itemize}
|
|
|
|
The heartbeat coordinates the time-dependent loops on a periodic HAL timer:
|
|
|
|
\begin{lstlisting}[language=C]
|
|
void vm_tick(VM *vm) {
|
|
if (!vm->heartbeat.enabled) return;
|
|
vm->heartbeat.tick_count++;
|
|
if (should_decay_heat(vm)) decay_execution_heat(vm); /* Loop #3 */
|
|
if (should_tune_window(vm)) infer_window_width(vm); /* Loop #5 */
|
|
}
|
|
\end{lstlisting}
|
|
|
|
\subsection{Seven Feedback Loops}
|
|
|
|
\begin{tabular}{llll}
|
|
\toprule
|
|
Loop & Name & Type & Effect \\
|
|
\midrule
|
|
\#1 & Execution Heat Tracking & Positive & Increments \texttt{execution\_heat} \\
|
|
\#2 & Rolling Window History & Neutral & Captures sample in circular buffer \\
|
|
\#3 & Linear Decay & Negative & Decays heat over time \\
|
|
\#4 & Pipelining Metrics & Positive & Increments \texttt{transition\_count} \\
|
|
\#5 & Window Width Inference & Adaptive & Adjusts window size (Levene's test) \\
|
|
\#6 & Decay Slope Inference & Adaptive & Adjusts decay rate (regression) \\
|
|
\#7 & Adaptive Heartrate & Adaptive & Adjusts heartbeat frequency (future) \\
|
|
\bottomrule
|
|
\end{tabular}
|
|
|
|
Every loop uses deterministic algorithms; the resulting 0\% algorithmic
|
|
variance has been validated experimentally.
|
|
|
|
\subsection{Boot Sequence}
|
|
|
|
On hosted platforms the path is \texttt{main()} $\rightarrow$ HAL
|
|
initialization $\rightarrow$ \texttt{vm\_create()} $\rightarrow$ dictionary
|
|
population $\rightarrow$ physics initialization $\rightarrow$ heartbeat start
|
|
$\rightarrow$ REPL $\rightarrow$ clean shutdown. On StarKernel the UEFI firmware
|
|
loads \texttt{BOOTX64.EFI}, which collects boot information (memory map, ACPI,
|
|
framebuffer), calls \texttt{ExitBootServices()}, and enters
|
|
\texttt{kernel\_main()}; the kernel HAL initializes, the VM is created in kernel
|
|
mode, and Forth runs as the kernel shell.
|
|
|
|
\subsection{Data Flow}
|
|
|
|
A line of input is tokenized; each word is located (hot-words cache first,
|
|
linear search as fallback), then executed --- which tracks heat, records the
|
|
transition, and updates the rolling window --- and any output is emitted. The
|
|
physics feedback cycle runs alongside: execution raises heat and records a
|
|
sample; the periodic heartbeat tick decays heat (Loop \#3), runs window
|
|
inference (Loop \#5), and, in future, decay inference (Loop \#6); the hot-words
|
|
cache then refreshes and the cycle repeats.
|
|
|
|
\subsection{Control Flow and Interrupt Context}
|
|
|
|
In execute mode --- the default --- words run immediately. Compile mode, entered
|
|
by \texttt{:}, instead compiles words into the dictionary, the exception being
|
|
\texttt{WORD\_IMMEDIATE} words, which execute even while compiling.
|
|
|
|
\begin{lstlisting}[language=Forth]
|
|
: SQUARE ( n -- n^2 ) DUP * ;
|
|
\end{lstlisting}
|
|
|
|
Under StarKernel, certain operations are ISR-safe: \texttt{heartbeat\_tick\_isr()},
|
|
\texttt{vm\_tick()} (no \texttt{malloc} or blocking I/O), and the lock-free
|
|
rolling-window updates. Blocking allocation (\texttt{hal\_mem\_alloc()}),
|
|
blocking console reads (\texttt{hal\_console\_getc()}), and the non-reentrant
|
|
dictionary compiler are \emph{not} ISR-safe.
|
|
|
|
\subsection{Cross-Subsystem Interactions}
|
|
|
|
The HAL heartbeat timer fires a periodic interrupt that drives
|
|
\texttt{vm\_tick()}, which in turn coordinates heat decay and window-width
|
|
inference. Defining a new word invalidates the hot-words cache, triggering a
|
|
rebuild that re-sorts the linked list by heat. As word executions accumulate
|
|
samples and the window fills, inference runs Levene's test and adjusts the
|
|
window width.
|
|
|
|
\subsection{Roadmap}
|
|
|
|
\begin{itemize}
|
|
\item \textbf{Phase 1 --- StarForth (done).} FORTH-79 interpreter,
|
|
physics-driven adaptive runtime, proven 0\% algorithmic variance, the full
|
|
test suite passing, running on Linux and L4Re.
|
|
\item \textbf{Phase 2 --- HAL migration (in progress).} Define HAL interfaces,
|
|
refactor the Linux platform and the VM core onto the HAL, and validate that
|
|
determinism is preserved; an L4Re HAL is optional.
|
|
\item \textbf{Phase 3 --- StarKernel (planned).} Kernel HAL, UEFI loader, PMM,
|
|
VMM, \texttt{kmalloc}, UART and framebuffer console, TSC/HPET/APIC timing,
|
|
boot to the \texttt{ok} prompt on bare metal, and physics validation on
|
|
hardware.
|
|
\item \textbf{Phase 4 --- StarshipOS (future).} Storage drivers, filesystems,
|
|
networking, a Forth-task process model, a unified device model, and
|
|
capability/ACL-based security.
|
|
\end{itemize}
|
|
|
|
%% TODO(bob): this overview cites "780+ tests" while CLAUDE.md states 936+. Reconcile the canonical test count before publication.
|
|
|
|
\subsection{Performance Characteristics}
|
|
|
|
\begin{tabular}{lll}
|
|
\toprule
|
|
Operation & Cycles & Notes \\
|
|
\midrule
|
|
\texttt{DUP} & $\sim$5 & Stack manipulation (hot path) \\
|
|
\texttt{+} & $\sim$8 & Arithmetic (optimized) \\
|
|
Dictionary search (hot) & $\sim$20 & Cache hit \\
|
|
Dictionary search (cold) & $\sim$200 & Linear search \\
|
|
Word call overhead & $\sim$15 & Indirect call \\
|
|
Heat tracking & $\sim$3 & Increment + branch \\
|
|
\bottomrule
|
|
\end{tabular}
|
|
|
|
Physics overhead averages under 5\% on typical workloads.
|
|
|
|
\subsection{Diagnostics}
|
|
|
|
Built-in Forth diagnostics include \texttt{WORD-ENTROPY} (execution-heat
|
|
statistics), \texttt{.S} and \texttt{.R} (data and return stacks), and
|
|
\texttt{WORDS} (dictionary listing). Development builds add \texttt{make debug}
|
|
(\texttt{-g -O0}) and \texttt{make PROFILE=1} (\texttt{gprof}); DoE mode
|
|
(\texttt{./starforth --doe}) runs the experiments and reports metrics with
|
|
determinism validation.
|
|
|
|
\subsection{Key Invariants}
|
|
|
|
\begin{itemize}
|
|
\item Determinism: 0\% algorithmic variance, formally validated.
|
|
\item Platform-agnostic VM code: zero \texttt{\#ifdef PLATFORM\_*} branches.
|
|
\item Memory safety: all addresses are \texttt{vaddr\_t}, bounds-checked under
|
|
\texttt{STRICT\_PTR=1}.
|
|
\item FORTH-79 compliance across all standard words.
|
|
\item Zero warnings under \texttt{-Wall -Werror}.
|
|
\item Strict ANSI C99 --- no GNU extensions, no C++ features.
|
|
\end{itemize}
|