26 Commits

Author SHA1 Message Date
313c513ac1 Count the spike's own files correctly 2026-09-12 20:36:27 +07:00
3f92d420dd The compiler embeds, and the sharpest objection was not there at all
Item 12 asked five questions. All five come back clean, and the answer is
feasible with no obstacle that argues for porting the compiler.

The one that mattered most was signals, and it turned out to be a non-question:
OCaml 5.2 on Linux/amd64 installs no signal handlers at all -- fifteen swept at
four moments, every one SIG_DFL, and a plain ocamlopt executable behaves the
same, so embedding changes nothing. OCaml 5 checks the stack limit explicitly
instead of arming a guard page, so the SIGSEGV the break loop wants was never
taken. The break loop can have it outright and Stack_overflow still works. That
is measured on one platform only, and the entry says so: macOS/arm64 is the one
claim here that must be re-run rather than trusted.

The rest: -output-complete-obj links with dune uninvolved and the existing C
stubs intact, no symbol collides across the four .c files and libasmrun, the
game keeps the main thread while a C-created listener calls into OCaml after
caml_c_thread_register, and a compaction left an 8 MiB arena byte-for-byte
untouched. Startup is 0.6ms and the compiler adds 4.14MB -- which makes the
merged dev build smaller than today's daemon alone, and there is one of it
rather than two.

Written as item 14 with the numbers, the three ways the GC assumption would
break, what the spike does not cover, and the order the real work goes in. The
backend is left exactly where item 13 put it.
2026-09-12 20:35:29 +07:00
4ea089839c Where the next session starts, and what to read first 2026-09-12 17:46:05 +07:00
fbc4aea071 Merge first, measure, then choose a backend 2026-09-12 17:44:19 +07:00
b093de25ff What embedding OCaml 5.2 costs, and why self-hosting is the honest end state 2026-09-12 17:35:38 +07:00
e6b49b7682 Invert it: the compiler moves into the program, beside the server already there 2026-09-12 17:31:44 +07:00
b49160b887 One process or two, which subsumes the backend question and several settled ones 2026-09-12 17:28:13 +07:00
50b3feaa86 A dev backend, ORC, and which one actually answers the want 2026-09-12 17:17:50 +07:00
76ef56343d An instrumented form stays instrumented until it is evaluated plainly 2026-09-12 17:11:30 +07:00
46b3080eda Instrumenting with pause, and the source locations that make it not a pure Emacs job 2026-09-12 17:10:21 +07:00
9d6784f2cd Write down what was read, what was refused, and what it cost
BUILT.md gains "The header is read now", directly under the section whose last
paragraph promised that reading a header was what would convert the trusted
half into a checked one and that it was not built. That sentence is replaced by
a pointer to the one below it, in BUILT.md and in shim.ml's docstring both.

It records the things worth not re-deriving: why the dump and not libclang (and
that Zig left libclang too, which strengthens the argument rather than weakening
it), why the import is bounded by the package's own defstructs, why generating
defstructs would make the check circular in exactly the way a _Static_assert
was rejected for, refusal-by-demotion from Zig's failDecl, the naming rule and
what it must actually guarantee, and both const-vs-non-const char * and the
target-varying widths.

The diff and the costs are stated as measurements, with the table: 16 of 16
defstructs and 172 of 172 declare-c agree against 5.5, ten real differences
against 5.1-dev, release +4ms warm, redefinition 31.0 -> 46.5ms.

DISCUSS.md item 6 is rewritten rather than removed. The mechanism question is
settled and is now in BUILT.md; what is left is narrower and is two decisions
that are the author's — whether the header stays a build-time read or becomes a
committed generator, and whether the 172 hand-written lines migrate. Both have
the argument on each side written out, including what migration would lose:
key-pressed? is a better name than is-key-pressed, and an enum parameter
imports as i32 because nothing tells the importer the package calls KeyboardKey
"Key".
2026-09-12 16:17:30 +07:00
a3fccf440c Handle is the gate on classes, and the allocator just made it buildable 2026-09-12 14:08:20 +07:00
03692c35b5 clojure-mode is the reference to port from, not an ancestor to inherit 2026-09-12 14:06:38 +07:00
f2d80ce8c0 Borrow clojure-mode's binding alignment without inheriting its assumptions 2026-09-12 14:05:40 +07:00
394b656a68 Indentation falls through to Emacs Lisp inside a binding vector 2026-09-12 14:04:10 +07:00
693661c4dd Reading a header need not mean linking libclang 2026-09-12 14:01:12 +07:00
99db8ce73f A JS backend is for web apps, which makes object mapping the right shape 2026-09-12 13:58:29 +07:00
c49286ca01 Structural identity is not implicit conversion, and writability decides the layout question 2026-09-12 13:56:24 +07:00
95b4f1173b Structural typing is a front-end question, except for field order, which is layout 2026-09-12 13:53:44 +07:00
a8a032e340 Three roles want three words, and two of them want the same dependency tracking 2026-09-12 13:51:40 +07:00
f1223cde2e -O0 follows the source and -O2 need not, and what SBCL gets for owning its code 2026-09-12 13:41:34 +07:00
b97a3dbbf1 The inspector walks expressions, which is why it cannot see a frame 2026-09-12 13:36:34 +07:00
f4f61ae8c9 Two questions became decisions, so they move to what is left 2026-09-12 13:30:15 +07:00
244f83fe53 Globals are program state, so they get a section rather than a frame 2026-09-12 13:27:27 +07:00
f231f62f52 Globals go per frame; watching is its own question 2026-09-12 13:26:38 +07:00
ce9ea2f268 Nine questions asked and not answered, with what is already known about each 2026-09-12 13:04:38 +07:00