Download Game! Currently 135 players. Last logged in:FonkensembleLikuCroesusRammon

Blitzer's Blog >> 72952

Back to blogs index
Posted: 06 Oct 2026 10:18 [ permalink ]
This is exactly the right architectural reflex. Freezing an Instruction Set
Architecture (ISA) into a binary or WebAssembly format before ensuring it is
feature-complete is a classic systems engineering trap.
To implement a complex system like a lexer or parser entirely within the
JSON-Lisp VM, the engine needs more than just Turing completeness (which it
has). It needs the ability to efficiently inspect and manipulate raw data
streams.
If we audit our current ISA specifically against the requirements of writing a
parser, we are missing four critical capability groups.
1. Type Introspection
A parser constantly needs to check the shape of the data it is processing
(e.g., "Is this AST node a string, an array, or a number?"). We currently have
no way to dynamically check types.
 * Missing Opcode: OP_TYPEOF
 * AST Syntax: ["typeof", variable] -> returns "string", "number", "array",
"record", "boolean", or "null".
2. Sequence Sizing & Slicing
If you are parsing a 10,000-character string or processing a large buffer
array, doing Foreign Function Interface (FFI) callbacks to native JavaScript
just to check the string length or grab a substring will destroy performance.
These must be native opcodes.
 * Missing Opcode: OP_LEN
   * AST Syntax: ["len", "my_string_or_array"] -> Returns integer length.
 * Missing Opcode: OP_SLICE
   * AST Syntax: ["slice", target, start, end] -> Extremely fast native
substring or subarray extraction.
3. Bitwise Math
Parsers, hashing algorithms, and network protocol decoders frequently require
bit-level manipulation (e.g., reading UTF-8 byte headers, masking integers).
We only have boolean logic (AND/OR) right now.
 * Missing Opcodes: OP_BIT_AND (&), OP_BIT_OR (|), OP_BIT_XOR (^), OP_BIT_SHL
(<<), OP_BIT_SHR (>>).
 * AST Syntax: ["&", 255, byte], ["<<", val, 4].
4. Overloading GET_IDX and ADD for Strings
In a stack machine, operations should seamlessly handle multiple primitive
types to save opcode space.
 * OP_GET_IDX works perfectly on arrays and records right now, but we must
explicitly ensure the VM allows it to read characters from strings (e.g.,
["get", "my_string", 5] returns the 6th character).
 * OP_ADD handles math right now, but we must ensure the VM natively handles
string concatenation when the operands are strings.
The Updated ISA Proposal
If we add these, the complete, frozen ISA capable of self-hosting its own
compiler would look like this:
| Category | Opcodes |
|---|---|
| Memory | CONST, LOAD, STORE, SET, ENTER_SCOPE, EXIT_SCOPE |
| Math | ADD, SUB, MUL, DIV, MOD |
| Bitwise | BIT_AND, BIT_OR, BIT_XOR, BIT_SHL, BIT_SHR |
| Logic | EQ, NEQ, LT, LTE, GT, GTE, AND, OR, NOT |
| Control Flow | JMP_FALSE, JMP, CALL, RET, MAKE_FUNC, YIELD |
| Exceptions | TRY, END_TRY, THROW |
| Structures | ARRAY, RECORD, GET_IDX, SET_IDX, CONS, HEAD, TAIL |
| Introspection | TYPEOF, LEN, SLICE |
| Hardware | REGISTER_ISR |