4.4 KiB
Technical Outline: Attempt 1
Overview
attempt_1 is a minimal, -nostdlib C program that serves as a proof-of-concept for the "Lottes/Onat" sourceless ColorForth paradigm. It successfully integrates a visual editor, a live JIT compiler, and an execution environment into a single, cohesive Win32 application that runs without any external dependencies or the C runtime.
The application presents a visual grid of 32-bit tokens and allows the user to navigate and edit them directly. On every keypress, the token array is re-compiled into x86-64 machine code and executed, with the results (register states and global memory) displayed instantly in the HUD.
Core Concepts Implemented
-
Sourceless Token Array (
FArenatape):- The "source code" is a contiguous block of
U4(32-bit) integers allocated byVirtualAllocand managed by theFArenafromduffle.h. - Each token is packed with a 4-bit "Color" tag and a 28-bit payload, adhering to the core design.
- The "source code" is a contiguous block of
-
Annotation Layer (
FArenaanno):- A parallel
FArenaofU8(64-bit) integers stores an 8-character string for each corresponding token on the tape. - The UI renderer prioritizes displaying this string, but the compiler only ever sees the 2-character ID packed into the 32-bit token, successfully implementing Lottes' dictionary annotation strategy.
- A parallel
-
2-Register Stack & Global Memory:
- The JIT compiler emits x86-64 that strictly adheres to Onat's
RAX/RDXregister stack. - A
vm_globalsarray is passed by pointer into the JIT'd code (viaRCXon Win64), allowing instructions likeFETCHandSTOREto simulate the "tape drive" memory model.
- The JIT compiler emits x86-64 that strictly adheres to Onat's
-
Handmade x86-64 JIT Emitter:
- A small set of
emit8/emit32functions write raw x86-64 opcodes into aVirtualAllocblock marked as executable (PAGE_EXECUTE_READWRITE). - This buffer is cast to a C function pointer and called directly, bypassing the need for an external assembler like NASM or a complex library like Zydis for this prototype stage.
- A small set of
-
2-Character Mapped Dictionary & Resolver:
- The
ID2(a, b)macro packs two characters into a 16-bit integer for use as a token's payload. - The JIT compiler maintains a simple array-based dictionary. On a
: Definetoken, it records the ID and the current memory offset. On a~ Calltoken, it looks up the ID and emits a relative 32-bitCALLinstruction (0xE8). - It also correctly emits
JMPinstructions to skip over definition bodies during linear execution.
- The
-
Modal Editor (Win32 GDI):
- The UI is built with raw Win32 GDI calls defined in
duffle.h. - It features two modes:
Navigation(gray cursor, arrow key movement) andEdit(orange cursor, text input). - The editor correctly handles token insertion, deletion (Vim-style backspace), tag cycling (Tab), and value editing, all while re-compiling and re-executing on every keystroke.
- The UI is built with raw Win32 GDI calls defined in
What's Missing (TODO)
- Saving/Loading: The tape and annotation arenas are purely in-memory and are lost when the program closes.
- Expanded Instruction Set: The JIT only knows a handful of primitives (
SWAP,MULT,ADD,FETCH,STORE,DEC,RET_IF_ZERO,PRINT). It has no support for floating point, stack manipulation for C FFI, or more complex branches. - Robust Dictionary: The current dictionary is a simple array that is rebuilt on every compile. It doesn't handle collisions, scoping, or namespaces.
- Annotation Editing: Typing into an annotation just appends characters. A proper text-editing cursor within the token is needed.
References Utilized
- Heavily Utilized:
- Onat's Talks: The core architecture (2-register stack, global memory tape, JIT philosophy) is a direct implementation of the concepts from his VAMP/KYRA presentations.
- Lottes' Twitter Notes: The 2-character mapped dictionary,
ret-if-signed(RET_IF_ZERO), and annotation layer concepts were taken directly from his tweets. - User's
duffle.h&fortish-study: The C coding conventions (X-Macros,FArena, byte-width types,ms_prefixes) were adopted from these sources.
- Lightly Utilized:
- Lottes' Blog: Provided the high-level "sourceless" philosophy and inspiration.
- Grok Searches: Served to validate our understanding and provide parallels (like Wasm's linear memory), but did not provide direct implementation details.