lumbda/Makefile
russell@unturf.com 3348e9b4bd bench-gc-http + asm-gc rows in existing benches; §6.6.4 HTTP validation
New infra:
  - examples/http-server-noarena.lsp: same HTTP server minus the
    heap-snapshot/heap-restore arena loop. Isolates whether the GC
    build actually holds memory under real traffic, independent
    of the portable snapshot pattern.
  - tests/bench-gc-http.sh: drives 5,000 concurrent requests per
    cell across the full 2x2 matrix {no-GC, GC} x {snapshot, no}.
  - Makefile: new `bench-gc-http` target.

Extended benches to exercise both asm binaries:
  - tests/bench-hashset.sh now runs against both asm/uncommonlisp
    and asm/uncommonlisp-gc, with set +e so a GC-build crash on
    one workload doesn't abort the other.
  - tests/web-benchmark.sh adds a dedicated asm-gc row (and prints
    its stripped binary size) so the HTTP throughput comparison
    reports both.

Whitepaper updates:
  - §6.6.4 "Validation: HTTP Server Under Sustained Load" — the
    4-cell memory matrix. 3/4 cells green; cell 4 (GC + no
    snapshot) crashes at first GC trigger — another instance of
    the conservative-scan type-confusion class we already fixed
    once at the env/string boundary. Logged as a known issue
    rather than shipping a partial fix under time pressure.
    heap-snapshot + heap-restore remains the recommended pattern
    for production asm code; the naive GC is diagnostic + control
    group, not a replacement for the arena discipline.
  - §6.5 hash-set speedup table slightly softened to ~15-20x (was
    15-21x) since run-to-run noise on a shared laptop shifts the
    per-phase ratio by a few percent. Ratio is stable to first
    order.
  - §8.6 narrative references the ~1280x symbolic-vs-brute-force
    figure instead of the stale 40x.
  - §6 reproducibility list now lists `make bench-gc-http`.

All 137 asm no-GC + 137 asm GC + 189 shared functional tests
still pass.
2026-04-18 16:13:59 -04:00

217 lines
7.8 KiB
Makefile
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# ═══════════════════════════════════════════════════════════════════
# uncommonlisp — Python + C + Assembly implementations
# ═══════════════════════════════════════════════════════════════════
#
# Implementations:
# Python uncommonlisp.py bytecode VM, full continuations, portal
# C c/uncommonlisp tree-walker + bytecode VM + x86_64 JIT
# Assembly asm/uncommonlisp pure x86_64, no libc, 13KB binary
#
# Test suites:
# make test Python unit/integration (571 tests)
# make c-test C unit/integration + JIT (76 tests) + functional (114)
# make asm-test Assembly unit/integration/functional (75 tests)
# make functional-test Shared .lsp suite in Python + C (114 each)
# make test-all Everything (836 total)
#
# Benchmarks (each generates reproducible numbers referenced in the
# whitepaper; hardware-independent commands, safety envelope built in):
# make bench Python bench.py (tree-walker vs bytecode VM)
# make c-bench C unit-level microbenchmarks
# make bench-3way §6.4: Python vs C vs asm on sum-to/ack
# make bench-portal §7.5: S-exp/JSON/binary portal save+load timings
# make bench-portal-cross §7.2: 3x3 cross-impl portal save×load matrix
# make bench-web §11.3: HTTP benchmark vs busybox + python http.server
# make bench-rpc-chain §11.4: Py → C relay → asm backend chain timing
# make bench-proof §8.6: EML proof — Lean 4 vs Lumbda tiers
# make bench-all run every bench above back to back
# make friction head-to-head timing: Python vs C vs CPython
#
# Other:
# make examples Run examples in Python + C, compare output
# make docs Generate architecture diagrams
# make whitepaper Build PDF whitepaper
# make clean-all Clean everything
all: test
# ─── Python implementation ────────────────────────────────────────
test:
python3 tests.py
test-verbose:
python3 tests.py -v
bench:
python3 bench.py
bench-verbose:
python3 bench.py -v
repl:
python3 uncommonlisp.py
lint:
python3 -m py_compile uncommonlisp.py
python3 -m py_compile tests.py
python3 -m py_compile bench.py
# ─── C implementation ─────────────────────────────────────────────
c-build:
$(MAKE) -C c all
c-test: c-build
$(MAKE) -C c test
@echo "── C functional tests (shared .lsp suite) ──"
./c/uncommonlisp tests/functional.lsp
c-bench: c-build
$(MAKE) -C c bench
c-repl: c-build
./c/uncommonlisp
c-clean:
$(MAKE) -C c clean
# ─── Assembly implementation ──────────────────────────────────────
asm-build:
$(MAKE) -C asm all
asm-test: asm-build
$(MAKE) -C asm test
asm-repl: asm-build
./asm/uncommonlisp
asm-clean:
$(MAKE) -C asm clean
# ─── All implementations ─────────────────────────────────────────
functional-test: c-build
@echo "═══ Shared functional tests (114 tests) ═══"
@echo "── Python ──"
@python3 uncommonlisp.py --fast tests/functional.lsp | tail -3
@echo "── C ──"
@./c/uncommonlisp tests/functional.lsp | tail -3
test-all: test c-test asm-test functional-test
@echo "════════════════════════════════════════════════════"
@echo "All tests passed (Python + C + Assembly + functional)"
# ─── Benchmarks (reproducible; referenced in whitepaper §6§11) ───
bench-3way: c-build asm-build
@bash tests/bench-3way.sh
bench-portal: c-build asm-build
@bash tests/portal-benchmark.sh
bench-portal-cross: c-build asm-build
@bash tests/portal-cross-test.sh
bench-web: c-build asm-build
@bash tests/web-benchmark.sh
bench-rpc-chain: c-build asm-build
@bash tests/rpc-chain-bench.sh
bench-proof: c-build asm-build
@bash tests/bench-proof.sh
bench-hashset: asm-build
@bash tests/bench-hashset.sh
bench-gc: asm-build
@bash tests/bench-gc-memory.sh
bench-gc-arena: asm-build
@bash tests/bench-gc-arena.sh
bench-gc-adaptive: asm-build
@bash tests/bench-gc-adaptive.sh
bench-gc-http: asm-build
@bash tests/bench-gc-http.sh
bench-all: bench c-bench bench-3way bench-portal bench-portal-cross bench-web bench-rpc-chain bench-proof
@echo "═══════════════════════════════════════════════════════════"
@echo "All benchmarks complete. Numbers in the whitepaper §6.4,"
@echo "§7.2, §7.5, §11.3, §11.4 are reproducible from these targets."
# ─── Examples ─────────────────────────────────────────────────────
examples: c-build
@echo "═══ fibonacci.lsp ═══"
@echo "--- Python ---" && python3 uncommonlisp.py --fast examples/fibonacci.lsp
@echo "--- C ---" && ./c/uncommonlisp examples/fibonacci.lsp
@echo
@echo "═══ mergesort.lsp ═══"
@echo "--- Python ---" && python3 uncommonlisp.py --fast examples/mergesort.lsp
@echo "--- C ---" && ./c/uncommonlisp examples/mergesort.lsp
@echo
@echo "═══ objects.lsp ═══"
@echo "--- Python ---" && python3 uncommonlisp.py examples/objects.lsp
@echo "--- C ---" && ./c/uncommonlisp examples/objects.lsp
# ─── Friction benchmark ──────────────────────────────────────────
friction: c-build asm-build
bash friction.sh
# ─── Documentation ────────────────────────────────────────────────
DOT_FILES := $(wildcard docs/*.dot)
DOT_PNGS := $(DOT_FILES:.dot=.png)
docs: $(DOT_PNGS)
docs/%.png: docs/%.dot
dot -Tpng $< -o $@
# ─── Whitepaper ───────────────────────────────────────────────────
VENV := whitepaper/.venv
RST := whitepaper/uncommonlisp-whitepaper.rst
PDF := whitepaper/uncommonlisp-whitepaper.pdf
STYLE := whitepaper/whitepaper.style
$(VENV)/bin/rst2pdf:
python3 -m venv $(VENV)
$(VENV)/bin/pip install --upgrade pip
$(VENV)/bin/pip install rst2pdf
whitepaper: $(PDF)
$(PDF): $(RST) $(STYLE) $(VENV)/bin/rst2pdf
cd whitepaper && ../$(<D)/.venv/bin/rst2pdf \
-s whitepaper.style \
--fit-background-mode=scale \
uncommonlisp-whitepaper.rst \
-o uncommonlisp-whitepaper.pdf
@ln -sf uncommonlisp-whitepaper.pdf whitepaper/WHITEPAPER.pdf
@echo "Built: $(PDF)"
# ─── Clean ────────────────────────────────────────────────────────
clean:
rm -rf __pycache__ *.pyc
clean-whitepaper:
rm -rf $(VENV) $(PDF) whitepaper/WHITEPAPER.pdf
clean-docs:
rm -f docs/*.png
clean-all: clean clean-whitepaper clean-docs c-clean asm-clean
.PHONY: all test test-verbose bench bench-verbose repl lint \
c-build c-test c-bench c-repl c-clean \
asm-build asm-test asm-repl asm-clean \
test-all bench-all examples friction functional-test \
bench-3way bench-portal bench-portal-cross bench-web bench-rpc-chain bench-proof \
docs whitepaper clean clean-whitepaper clean-docs clean-all