From d13293469c5c903e936cf246701f15bed95d7d35 Mon Sep 17 00:00:00 2001 From: "russell@unturf.com" Date: Fri, 17 Apr 2026 18:28:42 -0400 Subject: [PATCH] whitepaper: GAS + i5-8350U hardware note, Lean EML sets the MOAD bar MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Two additions requested by fox: 1. Methodology is now explicit: GNU assembler (GAS, AT&T syntax), Intel Core i5-8350U 8th-gen mobile, Ubuntu 24.04, Linux 6.17, gcc 13.3, as 2.42, Python 3.12. Loopback TCP for all socket benchmarks. Same hardware across every benchmark in the paper. 2. §12 opens with the Lean EML proof as the rigor standard. The proof is 40× faster than the brute-force numerical verification it replaced — that speedup IS the MOAD-0001 story at the proof layer. We hold the implementations to the same bar: hot paths must be fast for a reason (hash / cache / O(1) invariant), not by benchmark luck; correctness must hold for a reason, not coincidence. The scanner is the second line; building with understanding is the first. Noted that the most recent scan found 18 HIGH MOAD- 0001 candidates in C — all inspected individually turn out to be false positives (bounded-depth ancestor walks, hash bucket chain walks already O(1) amortized, static 6-element tables, one-shot option parsing). The MOAD-0003 Python flags are scanner misfires on a non-ContextVar Env.set() method. New-work-introduced MOAD-0001 defects: zero. All defects fixed in this paper (intern_symbol, _define_record_type, bi_string_replace, _tokenize_lines, Env.lookup shortcut) were surfaced by other pressures — benchmarks, crashes, portal exchanges — not the scanner. --- whitepaper/uncommonlisp-whitepaper.pdf | 2005 +++++++++++++----------- whitepaper/uncommonlisp-whitepaper.rst | 8 +- 2 files changed, 1058 insertions(+), 955 deletions(-) diff --git a/whitepaper/uncommonlisp-whitepaper.pdf b/whitepaper/uncommonlisp-whitepaper.pdf index 4ae3e4d..9616051 100644 --- a/whitepaper/uncommonlisp-whitepaper.pdf +++ b/whitepaper/uncommonlisp-whitepaper.pdf @@ -55,7 +55,7 @@ endobj endobj 10 0 obj << -/Annots [ 7 0 R 8 0 R ] /Contents 97 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 96 0 R /Resources << +/Annots [ 7 0 R 8 0 R ] /Contents 98 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 97 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /XObject << /FormXob.d3ecd28ca03f587d6940049748681018 3 0 R >> @@ -67,7 +67,7 @@ endobj endobj 11 0 obj << -/Contents 98 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 96 0 R /Resources << +/Contents 99 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 97 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << @@ -77,7 +77,7 @@ endobj endobj 12 0 obj << -/Contents 99 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 96 0 R /Resources << +/Contents 100 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 97 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << @@ -87,7 +87,7 @@ endobj endobj 13 0 obj << -/Contents 100 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 96 0 R /Resources << +/Contents 101 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 97 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << @@ -97,7 +97,7 @@ endobj endobj 14 0 obj << -/Contents 101 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 96 0 R /Resources << +/Contents 102 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 97 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << @@ -112,7 +112,7 @@ endobj endobj 16 0 obj << -/Contents 102 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 96 0 R /Resources << +/Contents 103 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 97 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << @@ -122,7 +122,7 @@ endobj endobj 17 0 obj << -/Contents 103 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 96 0 R /Resources << +/Contents 104 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 97 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << @@ -137,7 +137,7 @@ endobj endobj 19 0 obj << -/Contents 104 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 96 0 R /Resources << +/Contents 105 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 97 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << @@ -147,7 +147,7 @@ endobj endobj 20 0 obj << -/Contents 105 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 96 0 R /Resources << +/Contents 106 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 97 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << @@ -157,7 +157,7 @@ endobj endobj 21 0 obj << -/Contents 106 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 96 0 R /Resources << +/Contents 107 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 97 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << @@ -167,7 +167,7 @@ endobj endobj 22 0 obj << -/Contents 107 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 96 0 R /Resources << +/Contents 108 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 97 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << @@ -177,7 +177,7 @@ endobj endobj 23 0 obj << -/Contents 108 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 96 0 R /Resources << +/Contents 109 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 97 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << @@ -189,12 +189,12 @@ endobj << /A << /S /URI /Type /Action /URI (mailto:russell@unturf.com) ->> /Border [ 0 0 0 ] /Rect [ 248.0736 683.8236 334.3536 695.8236 ] /Subtype /Link /Type /Annot +>> /Border [ 0 0 0 ] /Rect [ 248.0736 593.8236 334.3536 605.8236 ] /Subtype /Link /Type /Annot >> endobj 25 0 obj << -/Annots [ 24 0 R ] /Contents 109 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 96 0 R /Resources << +/Annots [ 24 0 R ] /Contents 110 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 97 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << @@ -204,7 +204,7 @@ endobj endobj 26 0 obj << -/Contents 110 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 96 0 R /Resources << +/Contents 111 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 97 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << @@ -214,7 +214,7 @@ endobj endobj 27 0 obj << -/Contents 111 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 96 0 R /Resources << +/Contents 112 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 97 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << @@ -224,7 +224,7 @@ endobj endobj 28 0 obj << -/Contents 112 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 96 0 R /Resources << +/Contents 113 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 97 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << @@ -234,7 +234,7 @@ endobj endobj 29 0 obj << -/Contents 113 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 96 0 R /Resources << +/Contents 114 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 97 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << @@ -244,38 +244,38 @@ endobj endobj 30 0 obj << -/A << -/S /URI /Type /Action /URI (mailto:russell@unturf.com) ->> /Border [ 0 0 0 ] /Rect [ 248.0736 269.0236 334.3536 281.0236 ] /Subtype /Link /Type /Annot +/Contents 115 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 97 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page >> endobj 31 0 obj << -/Annots [ 30 0 R ] /Contents 114 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 96 0 R /Resources << -/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] ->> /Rotate 0 - /Trans << - ->> /Type /Page +/A << +/S /URI /Type /Action /URI (mailto:russell@unturf.com) +>> /Border [ 0 0 0 ] /Rect [ 248.0736 679.0236 334.3536 691.0236 ] /Subtype /Link /Type /Annot >> endobj 32 0 obj << /A << /S /URI /Type /Action /URI (mailto:russell@unturf) ->> /Border [ 0 0 0 ] /Rect [ 134.8436 458.6236 202.0657 470.6236 ] /Subtype /Link /Type /Annot +>> /Border [ 0 0 0 ] /Rect [ 134.8436 192.6236 202.0657 204.6236 ] /Subtype /Link /Type /Annot >> endobj 33 0 obj << /A << /S /URI /Type /Action /URI (https://undefect.com/public/stress-on-our-shared-heart/) ->> /Border [ 0 0 0 ] /Rect [ 247.8136 458.6236 385.3838 470.6236 ] /Subtype /Link /Type /Annot +>> /Border [ 0 0 0 ] /Rect [ 247.8136 192.6236 385.3838 204.6236 ] /Subtype /Link /Type /Annot >> endobj 34 0 obj << -/Annots [ 32 0 R 33 0 R ] /Contents 115 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 96 0 R /Resources << +/Annots [ 31 0 R 32 0 R 33 0 R ] /Contents 116 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 97 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << @@ -287,22 +287,20 @@ endobj << /A << /S /URI /Type /Action /URI (https://undefect.com/public/stress-on-our-shared-heart/) ->> /Border [ 0 0 0 ] /Rect [ 293.562 597.0236 417.502 609.0236 ] /Subtype /Link /Type /Annot +>> /Border [ 0 0 0 ] /Rect [ 293.562 333.0236 417.502 345.0236 ] /Subtype /Link /Type /Annot >> endobj 36 0 obj << /A << /S /URI /Type /Action /URI (mailto:russell@unturf) ->> /Border [ 0 0 0 ] /Rect [ 423.062 597.0236 487.672 609.0236 ] /Subtype /Link /Type /Annot +>> /Border [ 0 0 0 ] /Rect [ 423.062 333.0236 487.672 345.0236 ] /Subtype /Link /Type /Annot >> endobj 37 0 obj << -/Annots [ 35 0 R 36 0 R ] /Contents 116 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 96 0 R /Resources << -/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /XObject << -/FormXob.d3ecd28ca03f587d6940049748681018 3 0 R ->> +/Annots [ 35 0 R 36 0 R ] /Contents 117 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 97 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << @@ -327,9 +325,9 @@ Gb"0;0`_7S!5bE.WFlYNTE"rlzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz endobj 40 0 obj << -/Contents 117 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 96 0 R /Resources << +/Contents 118 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 97 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /XObject << -/FormXob.fc331aff86ff817ecac4c4ce4b2ecd3a 38 0 R +/FormXob.d3ecd28ca03f587d6940049748681018 3 0 R /FormXob.fc331aff86ff817ecac4c4ce4b2ecd3a 38 0 R >> >> /Rotate 0 /Trans << @@ -339,297 +337,307 @@ endobj endobj 41 0 obj << -/Outlines 43 0 R /PageLabels 118 0 R /PageMode /UseNone /Pages 96 0 R /Type /Catalog +/Contents 119 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 97 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page >> endobj 42 0 obj << -/Author () /CreationDate (D:20260417181837-04'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260417181837-04'00') /Producer (ReportLab PDF Library - \(opensource\)) - /Subject (\(unspecified\)) /Title () /Trapped /False +/Outlines 44 0 R /PageLabels 120 0 R /PageMode /UseNone /Pages 97 0 R /Type /Catalog >> endobj 43 0 obj << -/Count 61 /First 44 0 R /Last 44 0 R /Type /Outlines +/Author () /CreationDate (D:20260417182828-04'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260417182828-04'00') /Producer (ReportLab PDF Library - \(opensource\)) + /Subject (\(unspecified\)) /Title () /Trapped /False >> endobj 44 0 obj << -/Count 51 /Dest [ 10 0 R /XYZ 57.02362 525.9477 0 ] /First 45 0 R /Last 95 0 R /Parent 43 0 R /Title (Feedback Is All You Need) +/Count 61 /First 45 0 R /Last 45 0 R /Type /Outlines >> endobj 45 0 obj << -/Dest [ 10 0 R /XYZ 57.02362 370.4013 0 ] /Next 46 0 R /Parent 44 0 R /Title (Abstract) +/Count 51 /Dest [ 10 0 R /XYZ 57.02362 525.9477 0 ] /First 46 0 R /Last 96 0 R /Parent 44 0 R /Title (Feedback Is All You Need) >> endobj 46 0 obj << -/Dest [ 11 0 R /XYZ 57.02362 405.0236 0 ] /Next 47 0 R /Parent 44 0 R /Prev 45 0 R /Title (1. The Problem: Interpreters That Cannot Feed Back) +/Dest [ 10 0 R /XYZ 57.02362 370.4013 0 ] /Next 47 0 R /Parent 45 0 R /Title (Abstract) >> endobj 47 0 obj << -/Count 2 /Dest [ 11 0 R /XYZ 57.02362 197.8236 0 ] /First 48 0 R /Last 49 0 R /Next 50 0 R /Parent 44 0 R - /Prev 46 0 R /Title (2. Architecture: One File, Two Evaluators) +/Dest [ 11 0 R /XYZ 57.02362 405.0236 0 ] /Next 48 0 R /Parent 45 0 R /Prev 46 0 R /Title (1. The Problem: Interpreters That Cannot Feed Back) >> endobj 48 0 obj << -/Dest [ 12 0 R /XYZ 57.02362 703.0236 0 ] /Next 49 0 R /Parent 47 0 R /Title (2.1 Type System) +/Count 2 /Dest [ 11 0 R /XYZ 57.02362 197.8236 0 ] /First 49 0 R /Last 50 0 R /Next 51 0 R /Parent 45 0 R + /Prev 47 0 R /Title (2. Architecture: One File, Two Evaluators) >> endobj 49 0 obj << -/Dest [ 12 0 R /XYZ 57.02362 467.0236 0 ] /Parent 47 0 R /Prev 48 0 R /Title (2.2 The Bytecode) +/Dest [ 12 0 R /XYZ 57.02362 703.0236 0 ] /Next 50 0 R /Parent 48 0 R /Title (2.1 Type System) >> endobj 50 0 obj << -/Dest [ 13 0 R /XYZ 57.02362 765.0236 0 ] /Next 51 0 R /Parent 44 0 R /Prev 47 0 R /Title (3. The Explicit Frame Stack) +/Dest [ 12 0 R /XYZ 57.02362 467.0236 0 ] /Parent 48 0 R /Prev 49 0 R /Title (2.2 The Bytecode) >> endobj 51 0 obj << -/Count 3 /Dest [ 13 0 R /XYZ 57.02362 386.6236 0 ] /First 52 0 R /Last 54 0 R /Next 55 0 R /Parent 44 0 R - /Prev 50 0 R /Title (4. Continuations: Feedback as a Data Structure) +/Dest [ 13 0 R /XYZ 57.02362 765.0236 0 ] /Next 52 0 R /Parent 45 0 R /Prev 48 0 R /Title (3. The Explicit Frame Stack) >> endobj 52 0 obj << -/Dest [ 14 0 R /XYZ 57.02362 679.0236 0 ] /Next 53 0 R /Parent 51 0 R /Title (4.1 Generators from Continuations) +/Count 3 /Dest [ 13 0 R /XYZ 57.02362 386.6236 0 ] /First 53 0 R /Last 55 0 R /Next 56 0 R /Parent 45 0 R + /Prev 51 0 R /Title (4. Continuations: Feedback as a Data Structure) >> endobj 53 0 obj << -/Dest [ 14 0 R /XYZ 57.02362 418.6236 0 ] /Next 54 0 R /Parent 51 0 R /Prev 52 0 R /Title (4.2 Why "Feedback Is All You Need") +/Dest [ 14 0 R /XYZ 57.02362 679.0236 0 ] /Next 54 0 R /Parent 52 0 R /Title (4.1 Generators from Continuations) >> endobj 54 0 obj << -/Dest [ 14 0 R /XYZ 57.02362 200.6236 0 ] /Parent 51 0 R /Prev 53 0 R /Title (4.3 Four Scopes of Feedback) +/Dest [ 14 0 R /XYZ 57.02362 418.6236 0 ] /Next 55 0 R /Parent 52 0 R /Prev 53 0 R /Title (4.2 Why "Feedback Is All You Need") >> endobj 55 0 obj << -/Count 3 /Dest [ 16 0 R /XYZ 57.02362 633.0236 0 ] /First 56 0 R /Last 58 0 R /Next 59 0 R /Parent 44 0 R - /Prev 51 0 R /Title (5. Optimizations) +/Dest [ 14 0 R /XYZ 57.02362 200.6236 0 ] /Parent 52 0 R /Prev 54 0 R /Title (4.3 Four Scopes of Feedback) >> endobj 56 0 obj << -/Dest [ 16 0 R /XYZ 57.02362 605.8236 0 ] /Next 57 0 R /Parent 55 0 R /Title (5.1 Peephole Optimizer) +/Count 3 /Dest [ 16 0 R /XYZ 57.02362 633.0236 0 ] /First 57 0 R /Last 59 0 R /Next 60 0 R /Parent 45 0 R + /Prev 52 0 R /Title (5. Optimizations) >> endobj 57 0 obj << -/Dest [ 16 0 R /XYZ 57.02362 459.8236 0 ] /Next 58 0 R /Parent 55 0 R /Prev 56 0 R /Title (5.2 Inline Cache) +/Dest [ 16 0 R /XYZ 57.02362 605.8236 0 ] /Next 58 0 R /Parent 56 0 R /Title (5.1 Peephole Optimizer) >> endobj 58 0 obj << -/Dest [ 16 0 R /XYZ 57.02362 259.8236 0 ] /Parent 55 0 R /Prev 57 0 R /Title (5.3 Constant Folding) +/Dest [ 16 0 R /XYZ 57.02362 459.8236 0 ] /Next 59 0 R /Parent 56 0 R /Prev 57 0 R /Title (5.2 Inline Cache) >> endobj 59 0 obj << -/Count 3 /Dest [ 17 0 R /XYZ 57.02362 765.0236 0 ] /First 60 0 R /Last 62 0 R /Next 63 0 R /Parent 44 0 R - /Prev 55 0 R /Title (6. Benchmarks: Three Evaluators vs CPython) +/Dest [ 16 0 R /XYZ 57.02362 259.8236 0 ] /Parent 56 0 R /Prev 58 0 R /Title (5.3 Constant Folding) >> endobj 60 0 obj << -/Dest [ 17 0 R /XYZ 57.02362 705.8236 0 ] /Next 61 0 R /Parent 59 0 R /Title (6.1 Raw Results) +/Count 3 /Dest [ 17 0 R /XYZ 57.02362 765.0236 0 ] /First 61 0 R /Last 63 0 R /Next 64 0 R /Parent 45 0 R + /Prev 56 0 R /Title (6. Benchmarks: Three Evaluators vs CPython) >> endobj 61 0 obj << -/Dest [ 17 0 R /XYZ 57.02362 439.8236 0 ] /Next 62 0 R /Parent 59 0 R /Prev 60 0 R /Title (6.2 Analysis) +/Dest [ 17 0 R /XYZ 57.02362 669.8236 0 ] /Next 62 0 R /Parent 60 0 R /Title (6.1 Raw Results) >> endobj 62 0 obj << -/Dest [ 17 0 R /XYZ 57.02362 233.8236 0 ] /Parent 59 0 R /Prev 61 0 R /Title (6.3 What the Benchmarks Test) +/Dest [ 17 0 R /XYZ 57.02362 403.8236 0 ] /Next 63 0 R /Parent 60 0 R /Prev 61 0 R /Title (6.2 Analysis) >> endobj 63 0 obj << -/Count 7 /Dest [ 19 0 R /XYZ 57.02362 765.0236 0 ] /First 64 0 R /Last 70 0 R /Next 71 0 R /Parent 44 0 R - /Prev 59 0 R /Title (7. Portal: Feedback Across Time) +/Dest [ 17 0 R /XYZ 57.02362 197.8236 0 ] /Parent 60 0 R /Prev 62 0 R /Title (6.3 What the Benchmarks Test) >> endobj 64 0 obj << -/Dest [ 19 0 R /XYZ 57.02362 561.8236 0 ] /Next 65 0 R /Parent 63 0 R /Title (7.1 S-Expression Portal \204 the Portable One) +/Count 7 /Dest [ 19 0 R /XYZ 57.02362 699.0236 0 ] /First 65 0 R /Last 71 0 R /Next 72 0 R /Parent 45 0 R + /Prev 60 0 R /Title (7. Portal: Feedback Across Time) >> endobj 65 0 obj << -/Dest [ 19 0 R /XYZ 57.02362 320.6236 0 ] /Next 66 0 R /Parent 63 0 R /Prev 64 0 R /Title (7.2 Cross-Implementation Exchange Matrix) +/Dest [ 19 0 R /XYZ 57.02362 495.8236 0 ] /Next 66 0 R /Parent 64 0 R /Title (7.1 S-Expression Portal \204 the Portable One) >> endobj 66 0 obj << -/Dest [ 19 0 R /XYZ 57.02362 120.6236 0 ] /Next 67 0 R /Parent 63 0 R /Prev 65 0 R /Title (7.3 JSON Portal \204 Graph-Aware, Continuation-Preserving) +/Dest [ 19 0 R /XYZ 57.02362 254.6236 0 ] /Next 67 0 R /Parent 64 0 R /Prev 65 0 R /Title (7.2 Cross-Implementation Exchange Matrix) >> endobj 67 0 obj << -/Dest [ 20 0 R /XYZ 57.02362 526.2236 0 ] /Next 68 0 R /Parent 63 0 R /Prev 66 0 R /Title (7.4 Binary Heap Dump \204 the Fast One) +/Dest [ 20 0 R /XYZ 57.02362 765.0236 0 ] /Next 68 0 R /Parent 64 0 R /Prev 66 0 R /Title (7.3 JSON Portal \204 Graph-Aware, Continuation-Preserving) >> endobj 68 0 obj << -/Dest [ 20 0 R /XYZ 57.02362 274.2236 0 ] /Next 69 0 R /Parent 63 0 R /Prev 67 0 R /Title (7.5 Cross-Process Benchmarks) +/Dest [ 20 0 R /XYZ 57.02362 478.2236 0 ] /Next 69 0 R /Parent 64 0 R /Prev 67 0 R /Title (7.4 Binary Heap Dump \204 the Fast One) >> endobj 69 0 obj << -/Dest [ 21 0 R /XYZ 57.02362 673.0236 0 ] /Next 70 0 R /Parent 63 0 R /Prev 68 0 R /Title (7.6 Mismatch Cases: Graceful Degradation) +/Dest [ 20 0 R /XYZ 57.02362 226.2236 0 ] /Next 70 0 R /Parent 64 0 R /Prev 68 0 R /Title (7.5 Cross-Process Benchmarks) >> endobj 70 0 obj << -/Dest [ 21 0 R /XYZ 57.02362 407.0236 0 ] /Parent 63 0 R /Prev 69 0 R /Title (7.7 Use Case: Distributed Primality Testing) +/Dest [ 21 0 R /XYZ 57.02362 619.0236 0 ] /Next 71 0 R /Parent 64 0 R /Prev 69 0 R /Title (7.6 Mismatch Cases: Graceful Degradation) >> endobj 71 0 obj << -/Count 6 /Dest [ 21 0 R /XYZ 57.02362 206.2236 0 ] /First 72 0 R /Last 77 0 R /Next 78 0 R /Parent 44 0 R - /Prev 63 0 R /Title (8. The EML Universality Proof) +/Dest [ 21 0 R /XYZ 57.02362 353.0236 0 ] /Parent 64 0 R /Prev 70 0 R /Title (7.7 Use Case: Distributed Primality Testing) >> endobj 72 0 obj << -/Dest [ 21 0 R /XYZ 57.02362 129.0236 0 ] /Next 73 0 R /Parent 71 0 R /Title (8.1 The Operator) +/Count 6 /Dest [ 21 0 R /XYZ 57.02362 152.2236 0 ] /First 73 0 R /Last 78 0 R /Next 79 0 R /Parent 45 0 R + /Prev 64 0 R /Title (8. The EML Universality Proof) >> endobj 73 0 obj << -/Dest [ 22 0 R /XYZ 57.02362 765.0236 0 ] /Next 74 0 R /Parent 71 0 R /Prev 72 0 R /Title (8.2 Stage 1: Core Functions \(Depth 1--3\)) +/Dest [ 22 0 R /XYZ 57.02362 765.0236 0 ] /Next 74 0 R /Parent 72 0 R /Title (8.1 The Operator) >> endobj 74 0 obj << -/Dest [ 22 0 R /XYZ 57.02362 645.0236 0 ] /Next 75 0 R /Parent 71 0 R /Prev 73 0 R /Title (8.3 Stage 2: Arithmetic) +/Dest [ 22 0 R /XYZ 57.02362 688.2236 0 ] /Next 75 0 R /Parent 72 0 R /Prev 73 0 R /Title (8.2 Stage 1: Core Functions \(Depth 1--3\)) >> endobj 75 0 obj << -/Dest [ 22 0 R /XYZ 57.02362 530.6236 0 ] /Next 76 0 R /Parent 71 0 R /Prev 74 0 R /Title (8.4 Stage 3: Complex Plane Access) +/Dest [ 22 0 R /XYZ 57.02362 568.2236 0 ] /Next 76 0 R /Parent 72 0 R /Prev 74 0 R /Title (8.3 Stage 2: Arithmetic) >> endobj 76 0 obj << -/Dest [ 22 0 R /XYZ 57.02362 422.6236 0 ] /Next 77 0 R /Parent 71 0 R /Prev 75 0 R /Title (8.5 Stage 4: Trigonometry via Euler) +/Dest [ 22 0 R /XYZ 57.02362 453.8236 0 ] /Next 77 0 R /Parent 72 0 R /Prev 75 0 R /Title (8.4 Stage 3: Complex Plane Access) >> endobj 77 0 obj << -/Dest [ 22 0 R /XYZ 57.02362 326.6236 0 ] /Parent 71 0 R /Prev 76 0 R /Title (8.6 Verification & Friction Analysis) +/Dest [ 22 0 R /XYZ 57.02362 345.8236 0 ] /Next 78 0 R /Parent 72 0 R /Prev 76 0 R /Title (8.5 Stage 4: Trigonometry via Euler) >> endobj 78 0 obj << -/Dest [ 23 0 R /XYZ 57.02362 525.8236 0 ] /Next 79 0 R /Parent 44 0 R /Prev 71 0 R /Title (9. Language Coverage) +/Dest [ 22 0 R /XYZ 57.02362 249.8236 0 ] /Parent 72 0 R /Prev 77 0 R /Title (8.6 Verification & Friction Analysis) >> endobj 79 0 obj << -/Dest [ 23 0 R /XYZ 57.02362 276.6236 0 ] /Next 80 0 R /Parent 44 0 R /Prev 78 0 R /Title (10. Relationship to Companion Papers) +/Dest [ 23 0 R /XYZ 57.02362 441.8236 0 ] /Next 80 0 R /Parent 45 0 R /Prev 72 0 R /Title (9. Language Coverage) >> endobj 80 0 obj << -/Count 6 /Dest [ 25 0 R /XYZ 57.02362 723.0236 0 ] /First 81 0 R /Last 86 0 R /Next 87 0 R /Parent 44 0 R - /Prev 79 0 R /Title (11. Three Implementations, One Language) +/Dest [ 23 0 R /XYZ 57.02362 192.6236 0 ] /Next 81 0 R /Parent 45 0 R /Prev 79 0 R /Title (10. Relationship to Companion Papers) >> endobj 81 0 obj << -/Dest [ 25 0 R /XYZ 57.02362 225.8236 0 ] /Next 82 0 R /Parent 80 0 R /Title (11.1 Test Coverage) +/Count 6 /Dest [ 25 0 R /XYZ 57.02362 633.0236 0 ] /First 82 0 R /Last 87 0 R /Next 88 0 R /Parent 45 0 R + /Prev 80 0 R /Title (11. Three Implementations, One Language) >> endobj 82 0 obj << -/Dest [ 26 0 R /XYZ 57.02362 727.0236 0 ] /Next 83 0 R /Parent 80 0 R /Prev 81 0 R /Title (11.2 File I/O Parity) +/Dest [ 25 0 R /XYZ 57.02362 135.8236 0 ] /Next 83 0 R /Parent 81 0 R /Title (11.1 Test Coverage) >> endobj 83 0 obj << -/Dest [ 26 0 R /XYZ 57.02362 419.0236 0 ] /Next 84 0 R /Parent 80 0 R /Prev 82 0 R /Title (11.3 Sockets: One HTTP Server, Three Runtimes) +/Dest [ 26 0 R /XYZ 57.02362 631.0236 0 ] /Next 84 0 R /Parent 81 0 R /Prev 82 0 R /Title (11.2 File I/O Parity) >> endobj 84 0 obj << -/Dest [ 27 0 R /XYZ 57.02362 535.0236 0 ] /Next 85 0 R /Parent 80 0 R /Prev 83 0 R /Title (11.4 S-expressions over Sockets: RPC, REPL, and Chains) +/Dest [ 26 0 R /XYZ 57.02362 323.0236 0 ] /Next 85 0 R /Parent 81 0 R /Prev 83 0 R /Title (11.3 Sockets: One HTTP Server, Three Runtimes) >> endobj 85 0 obj << -/Dest [ 28 0 R /XYZ 57.02362 715.0236 0 ] /Next 86 0 R /Parent 80 0 R /Prev 84 0 R /Title (11.5 Portal over HTTP: State Transfer Between Machines) +/Dest [ 27 0 R /XYZ 57.02362 443.0236 0 ] /Next 86 0 R /Parent 81 0 R /Prev 84 0 R /Title (11.4 S-expressions over Sockets: RPC, REPL, and Chains) >> endobj 86 0 obj << -/Dest [ 28 0 R /XYZ 57.02362 166.6236 0 ] /Parent 80 0 R /Prev 85 0 R /Title (11.6 heap-snapshot: The Arena Escape Hatch) +/Dest [ 28 0 R /XYZ 57.02362 619.0236 0 ] /Next 87 0 R /Parent 81 0 R /Prev 85 0 R /Title (11.5 Portal over HTTP: State Transfer Between Machines) >> endobj 87 0 obj << -/Count 3 /Dest [ 29 0 R /XYZ 57.02362 497.4236 0 ] /First 88 0 R /Last 90 0 R /Next 91 0 R /Parent 44 0 R - /Prev 80 0 R /Title (12. MOAD Audit: Fixing What We Built) +/Dest [ 29 0 R /XYZ 57.02362 765.0236 0 ] /Parent 81 0 R /Prev 86 0 R /Title (11.6 heap-snapshot: The Arena Escape Hatch) >> endobj 88 0 obj << -/Dest [ 29 0 R /XYZ 57.02362 450.2236 0 ] /Next 89 0 R /Parent 87 0 R /Title (12.1 MOAD-0001: The Sedimentary Defect in Our Own Code) +/Count 3 /Dest [ 29 0 R /XYZ 57.02362 417.4236 0 ] /First 89 0 R /Last 91 0 R /Next 92 0 R /Parent 45 0 R + /Prev 81 0 R /Title (12. MOAD Audit: Fixing What We Built) >> endobj 89 0 obj << -/Dest [ 31 0 R /XYZ 57.02362 547.0236 0 ] /Next 90 0 R /Parent 87 0 R /Prev 88 0 R /Title (12.2 MOAD-0002: The Intertangle in Our Own Design) +/Dest [ 29 0 R /XYZ 57.02362 166.2236 0 ] /Next 90 0 R /Parent 88 0 R /Title (12.1 MOAD-0001: The Sedimentary Defect in Our Own Code) >> endobj 90 0 obj << -/Dest [ 31 0 R /XYZ 57.02362 305.0236 0 ] /Parent 87 0 R /Prev 89 0 R /Title (12.3 Our Shared Infrastructure) +/Dest [ 30 0 R /XYZ 57.02362 236.2236 0 ] /Next 91 0 R /Parent 88 0 R /Prev 89 0 R /Title (12.2 MOAD-0002: The Intertangle in Our Own Design) >> endobj 91 0 obj << -/Dest [ 34 0 R /XYZ 57.02362 765.0236 0 ] /Next 92 0 R /Parent 44 0 R /Prev 87 0 R /Title (13. Future Work) +/Dest [ 34 0 R /XYZ 57.02362 715.0236 0 ] /Parent 88 0 R /Prev 90 0 R /Title (12.3 Our Shared Infrastructure) >> endobj 92 0 obj << -/Dest [ 34 0 R /XYZ 57.02362 509.8236 0 ] /Next 93 0 R /Parent 44 0 R /Prev 91 0 R /Title (14. The Defect in the Model) +/Dest [ 34 0 R /XYZ 57.02362 499.0236 0 ] /Next 93 0 R /Parent 45 0 R /Prev 88 0 R /Title (13. Future Work) >> endobj 93 0 obj << -/Dest [ 37 0 R /XYZ 57.02362 531.0236 0 ] /Next 94 0 R /Parent 44 0 R /Prev 92 0 R /Title (Citation) +/Dest [ 34 0 R /XYZ 57.02362 243.8236 0 ] /Next 94 0 R /Parent 45 0 R /Prev 92 0 R /Title (14. The Defect in the Model) >> endobj 94 0 obj << -/Dest [ 37 0 R /XYZ 57.02362 449.8236 0 ] /Next 95 0 R /Parent 44 0 R /Prev 93 0 R /Title (References) +/Dest [ 37 0 R /XYZ 57.02362 267.0236 0 ] /Next 95 0 R /Parent 45 0 R /Prev 93 0 R /Title (Citation) >> endobj 95 0 obj << -/Dest [ 37 0 R /XYZ 57.02362 368.6236 0 ] /Parent 44 0 R /Prev 94 0 R /Title (License) +/Dest [ 37 0 R /XYZ 57.02362 185.8236 0 ] /Next 96 0 R /Parent 45 0 R /Prev 94 0 R /Title (References) >> endobj 96 0 obj << -/Count 21 /Kids [ 10 0 R 11 0 R 12 0 R 13 0 R 14 0 R 16 0 R 17 0 R 19 0 R 20 0 R 21 0 R - 22 0 R 23 0 R 25 0 R 26 0 R 27 0 R 28 0 R 29 0 R 31 0 R 34 0 R 37 0 R - 40 0 R ] /Type /Pages +/Dest [ 37 0 R /XYZ 57.02362 104.6236 0 ] /Parent 45 0 R /Prev 95 0 R /Title (License) >> endobj 97 0 obj << +/Count 22 /Kids [ 10 0 R 11 0 R 12 0 R 13 0 R 14 0 R 16 0 R 17 0 R 19 0 R 20 0 R 21 0 R + 22 0 R 23 0 R 25 0 R 26 0 R 27 0 R 28 0 R 29 0 R 30 0 R 34 0 R 37 0 R + 40 0 R 41 0 R ] /Type /Pages +>> +endobj +98 0 obj +<< /Length 4887 >> stream @@ -814,7 +822,7 @@ Q endstream endobj -98 0 obj +99 0 obj << /Length 7518 >> @@ -909,7 +917,7 @@ Q endstream endobj -99 0 obj +100 0 obj << /Length 7728 >> @@ -1220,7 +1228,7 @@ Q endstream endobj -100 0 obj +101 0 obj << /Length 9197 >> @@ -1765,7 +1773,7 @@ Q endstream endobj -101 0 obj +102 0 obj << /Length 9242 >> @@ -2265,7 +2273,7 @@ Q endstream endobj -102 0 obj +103 0 obj << /Length 8129 >> @@ -2589,9 +2597,9 @@ Q endstream endobj -103 0 obj +104 0 obj << -/Length 13040 +/Length 12634 >> stream 1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET @@ -2602,22 +2610,22 @@ BT 1 0 0 1 0 2.2 Tm 13.2 TL /F2 11 Tf .133333 .133333 .133333 rg (6. Benchmarks: Q Q q -1 0 0 1 57.02362 719.8236 cm +1 0 0 1 57.02362 683.8236 cm q -BT 1 0 0 1 0 14 Tm 3.500642 Tw 12 TL /F1 10 Tf 0 0 0 rg (All benchmarks run on the same machine, same Python 3 interpreter. Three columns: tree-walking) Tj T* 0 Tw (interpreter \() Tj /F5 10 Tf (leval) Tj /F1 10 Tf (\), bytecode VM \() Tj /F5 10 Tf (--fast) Tj /F1 10 Tf (\), & equivalent CPython. Times are best-of-3 in milliseconds.) Tj T* ET +BT 1 0 0 1 0 50 Tm .344897 Tw 12 TL /F3 10 Tf 0 0 0 rg (Methodology.) Tj /F1 10 Tf ( All benchmarks in this paper run on a single laptop: ) Tj /F3 10 Tf (Intel Core i5-8350U \(8th-gen mobile, 4) Tj T* 0 Tw .582256 Tw (cores / 8 threads, 1.70 GHz base\)) Tj /F1 10 Tf (, Ubuntu 24.04, Linux 6.17, gcc 13.3, GNU assembler 2.42 \(GAS AT) Tj (&) Tj (T) Tj T* 0 Tw 3.514029 Tw (syntax\), Python 3.12. Loopback TCP for all socket benchmarks. Three columns below: tree-walking) Tj T* 0 Tw .177565 Tw (interpreter \() Tj /F5 10 Tf (leval) Tj /F1 10 Tf (\), bytecode VM \() Tj /F5 10 Tf (--fast) Tj /F1 10 Tf (\), & equivalent CPython. Times are best-of-3 in milliseconds. The) Tj T* 0 Tw (same hardware is used for the HTTP, RPC, chain, and portal-over-HTTP benchmarks reported later in \24711.) Tj T* ET Q Q q -1 0 0 1 57.02362 693.8236 cm +1 0 0 1 57.02362 657.8236 cm q BT 1 0 0 1 0 2 Tm 12 TL /F2 10 Tf .133333 .133333 .133333 rg (6.1 Raw Results) Tj T* ET Q Q q -1 0 0 1 57.02362 681.8236 cm +1 0 0 1 57.02362 645.8236 cm Q q -1 0 0 1 57.02362 483.8236 cm +1 0 0 1 57.02362 447.8236 cm q 1 1 1 rg n 0 198 481.2283 -18 re f* @@ -3057,104 +3065,54 @@ Q Q Q q -1 0 0 1 57.02362 483.8236 cm +1 0 0 1 57.02362 447.8236 cm Q q -1 0 0 1 57.02362 453.8236 cm +1 0 0 1 57.02362 417.8236 cm q BT 1 0 0 1 0 14 Tm 4.184882 Tw 12 TL /F3 10 Tf 0 0 0 rg (BC Speedup) Tj /F1 10 Tf ( = interpreter time / bytecode time. This measures the gain from compilation within) Tj T* 0 Tw (uncommonlisp itself.) Tj T* ET Q Q q -1 0 0 1 57.02362 427.8236 cm +1 0 0 1 57.02362 391.8236 cm q BT 1 0 0 1 0 2 Tm 12 TL /F2 10 Tf .133333 .133333 .133333 rg (6.2 Analysis) Tj T* ET Q Q q -1 0 0 1 57.02362 373.8236 cm +1 0 0 1 57.02362 337.8236 cm q BT 1 0 0 1 0 38 Tm 2.646027 Tw 12 TL /F1 10 Tf 0 0 0 rg (The bytecode compiler delivers ) Tj /F3 10 Tf (7--12x speedups) Tj /F1 10 Tf ( on recursive & iterative workloads compared to the) Tj T* 0 Tw .139168 Tw (tree-walking interpreter. The largest gains appear in tight loops \() Tj /F5 10 Tf (sum-to) Tj /F1 10 Tf (: 11.4x\) & deep recursion \() Tj /F5 10 Tf (fib\(20\)) Tj /F1 10 Tf T* 0 Tw .224882 Tw (tree: 9.2x, ) Tj /F5 10 Tf (mergesort) Tj /F1 10 Tf (: 11.0x\), where the explicit frame stack & specialized opcodes eliminate the overhead) Tj T* 0 Tw (of AST traversal.) Tj T* ET Q Q q -1 0 0 1 57.02362 343.8236 cm +1 0 0 1 57.02362 307.8236 cm q 0 0 0 rg BT 1 0 0 1 0 14 Tm /F1 10 Tf 12 TL 1.762025 Tw (Hash table operations show a smaller speedup \(1.6x\) because the bottleneck sits in Python's dictionary) Tj T* 0 Tw (operations, not in Scheme evaluation overhead.) Tj T* ET Q Q q -1 0 0 1 57.02362 289.8236 cm +1 0 0 1 57.02362 253.8236 cm q BT 1 0 0 1 0 38 Tm 1.224168 Tw 12 TL /F1 10 Tf 0 0 0 rg (CPython remains 50--150x faster than the bytecode VM on most benchmarks. This is expected: CPython) Tj T* 0 Tw .398022 Tw (compiles to native bytecode with a C runtime, while uncommonlisp's bytecode VM is itself written in Python.) Tj T* 0 Tw 1.146027 Tw (The comparison establishes that uncommonlisp pays a known, bounded overhead for running a complete) Tj T* 0 Tw (Scheme \(with full ) Tj /F5 10 Tf (call/cc) Tj /F1 10 Tf (, exact rationals, & hygienic macros\) inside a host language.) Tj T* ET Q Q q -1 0 0 1 57.02362 247.8236 cm +1 0 0 1 57.02362 211.8236 cm q 0 0 0 rg BT 1 0 0 1 0 26 Tm /F1 10 Tf 12 TL 3.278031 Tw (The important comparison is not uncommonlisp vs CPython \(different languages\), but uncommonlisp) Tj T* 0 Tw .750759 Tw (interpreter vs uncommonlisp bytecode \(same language, same semantics, different execution strategy\). The) Tj T* 0 Tw (bytecode compiler proves that feedback-based architecture does not preclude efficient execution.) Tj T* ET Q Q q -1 0 0 1 57.02362 221.8236 cm +1 0 0 1 57.02362 185.8236 cm q BT 1 0 0 1 0 2 Tm 12 TL /F2 10 Tf .133333 .133333 .133333 rg (6.3 What the Benchmarks Test) Tj T* ET Q Q q -1 0 0 1 57.02362 209.8236 cm -Q -q -1 0 0 1 57.02362 209.8236 cm -Q -q -1 0 0 1 57.02362 197.8236 cm -q -0 0 0 rg -BT /F1 10 Tf 12 TL ET -q -1 0 0 1 6 -3 cm -q -0 0 0 rg -BT 1 0 0 1 0 2 Tm /F5 10 Tf 12 TL 8 0 Td (\177) Tj T* -8 0 Td ET -Q -Q -q -1 0 0 1 23 -3 cm -q -BT 1 0 0 1 0 2 Tm 12 TL /F3 10 Tf 0 0 0 rg (fib\(35\) iterative) Tj /F1 10 Tf (: Named-let tail recursion. Tests ) Tj /F5 10 Tf (OP_TAIL_CALL) Tj /F1 10 Tf ( & ) Tj /F5 10 Tf (OP_ADD1) Tj T* ET -Q -Q -q -Q -Q -Q -q -1 0 0 1 57.02362 191.8236 cm -Q -q -1 0 0 1 57.02362 179.8236 cm -q -0 0 0 rg -BT /F1 10 Tf 12 TL ET -q -1 0 0 1 6 -3 cm -q -0 0 0 rg -BT 1 0 0 1 0 2 Tm /F5 10 Tf 12 TL 8 0 Td (\177) Tj T* -8 0 Td ET -Q -Q -q -1 0 0 1 23 -3 cm -q -BT 1 0 0 1 0 2 Tm 12 TL /F3 10 Tf 0 0 0 rg (fib\(20\) tree-recursive) Tj /F1 10 Tf (: Exponential call tree. Tests ) Tj /F5 10 Tf (OP_CALL) Tj /F1 10 Tf ( / ) Tj /F5 10 Tf (OP_RETURN) Tj /F1 10 Tf ( throughput) Tj T* ET -Q -Q -q -Q -Q +1 0 0 1 57.02362 173.8236 cm Q q 1 0 0 1 57.02362 173.8236 cm @@ -3174,7 +3132,7 @@ Q q 1 0 0 1 23 -3 cm q -BT 1 0 0 1 0 2 Tm 12 TL /F3 10 Tf 0 0 0 rg (tak\(15,10,6\)) Tj /F1 10 Tf (: Takeuchi function. Deep mutual recursion with 3 arguments) Tj T* ET +BT 1 0 0 1 0 2 Tm 12 TL /F3 10 Tf 0 0 0 rg (fib\(35\) iterative) Tj /F1 10 Tf (: Named-let tail recursion. Tests ) Tj /F5 10 Tf (OP_TAIL_CALL) Tj /F1 10 Tf ( & ) Tj /F5 10 Tf (OP_ADD1) Tj T* ET Q Q q @@ -3199,7 +3157,7 @@ Q q 1 0 0 1 23 -3 cm q -BT 1 0 0 1 0 2 Tm 12 TL /F3 10 Tf 0 0 0 rg (sum-to\(50000\)) Tj /F1 10 Tf (: 50,000 tail-recursive iterations. Tests frame stack performance at scale) Tj T* ET +BT 1 0 0 1 0 2 Tm 12 TL /F3 10 Tf 0 0 0 rg (fib\(20\) tree-recursive) Tj /F1 10 Tf (: Exponential call tree. Tests ) Tj /F5 10 Tf (OP_CALL) Tj /F1 10 Tf ( / ) Tj /F5 10 Tf (OP_RETURN) Tj /F1 10 Tf ( throughput) Tj T* ET Q Q q @@ -3224,7 +3182,7 @@ Q q 1 0 0 1 23 -3 cm q -BT 1 0 0 1 0 2 Tm 12 TL /F3 10 Tf 0 0 0 rg (ackermann\(3,4\)) Tj /F1 10 Tf (: Deeply nested recursion \(125 result, many thousands of calls\)) Tj T* ET +BT 1 0 0 1 0 2 Tm 12 TL /F3 10 Tf 0 0 0 rg (tak\(15,10,6\)) Tj /F1 10 Tf (: Takeuchi function. Deep mutual recursion with 3 arguments) Tj T* ET Q Q q @@ -3249,7 +3207,7 @@ Q q 1 0 0 1 23 -3 cm q -BT 1 0 0 1 0 2 Tm 12 TL /F3 10 Tf 0 0 0 rg (list ops) Tj /F1 10 Tf (: ) Tj /F5 10 Tf (iota) Tj /F1 10 Tf ( / ) Tj /F5 10 Tf (reverse) Tj /F1 10 Tf ( / ) Tj /F5 10 Tf (filter) Tj /F1 10 Tf ( / ) Tj /F5 10 Tf (map) Tj /F1 10 Tf ( / ) Tj /F5 10 Tf (fold-left) Tj /F1 10 Tf ( chain on 5,000 elements) Tj T* ET +BT 1 0 0 1 0 2 Tm 12 TL /F3 10 Tf 0 0 0 rg (sum-to\(50000\)) Tj /F1 10 Tf (: 50,000 tail-recursive iterations. Tests frame stack performance at scale) Tj T* ET Q Q q @@ -3274,7 +3232,7 @@ Q q 1 0 0 1 23 -3 cm q -BT 1 0 0 1 0 2 Tm 12 TL /F3 10 Tf 0 0 0 rg (mergesort) Tj /F1 10 Tf (: Recursive divide-and-conquer on 200 elements. Tests ) Tj /F5 10 Tf (cons) Tj /F1 10 Tf ( allocation throughput) Tj T* ET +BT 1 0 0 1 0 2 Tm 12 TL /F3 10 Tf 0 0 0 rg (ackermann\(3,4\)) Tj /F1 10 Tf (: Deeply nested recursion \(125 result, many thousands of calls\)) Tj T* ET Q Q q @@ -3299,6 +3257,65 @@ Q q 1 0 0 1 23 -3 cm q +BT 1 0 0 1 0 2 Tm 12 TL /F3 10 Tf 0 0 0 rg (list ops) Tj /F1 10 Tf (: ) Tj /F5 10 Tf (iota) Tj /F1 10 Tf ( / ) Tj /F5 10 Tf (reverse) Tj /F1 10 Tf ( / ) Tj /F5 10 Tf (filter) Tj /F1 10 Tf ( / ) Tj /F5 10 Tf (map) Tj /F1 10 Tf ( / ) Tj /F5 10 Tf (fold-left) Tj /F1 10 Tf ( chain on 5,000 elements) Tj T* ET +Q +Q +q +Q +Q +Q +q +1 0 0 1 57.02362 65.82362 cm +Q + +endstream +endobj +105 0 obj +<< +/Length 10495 +>> +stream +1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET +q +1 0 0 1 57.02362 753.0236 cm +q +0 0 0 rg +BT /F1 10 Tf 12 TL ET +q +1 0 0 1 6 -3 cm +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F5 10 Tf 12 TL 8 0 Td (\177) Tj T* -8 0 Td ET +Q +Q +q +1 0 0 1 23 -3 cm +q +BT 1 0 0 1 0 2 Tm 12 TL /F3 10 Tf 0 0 0 rg (mergesort) Tj /F1 10 Tf (: Recursive divide-and-conquer on 200 elements. Tests ) Tj /F5 10 Tf (cons) Tj /F1 10 Tf ( allocation throughput) Tj T* ET +Q +Q +q +Q +Q +Q +q +1 0 0 1 57.02362 747.0236 cm +Q +q +1 0 0 1 57.02362 735.0236 cm +q +0 0 0 rg +BT /F1 10 Tf 12 TL ET +q +1 0 0 1 6 -3 cm +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F5 10 Tf 12 TL 8 0 Td (\177) Tj T* -8 0 Td ET +Q +Q +q +1 0 0 1 23 -3 cm +q BT 1 0 0 1 0 2 Tm 12 TL /F3 10 Tf 0 0 0 rg (hash-table) Tj /F1 10 Tf (: 1,000 ) Tj /F5 10 Tf (set!) Tj /F1 10 Tf ( + ) Tj /F5 10 Tf (ref) Tj /F1 10 Tf ( operations. Tests Python dict interop overhead) Tj T* ET Q Q @@ -3307,34 +3324,25 @@ Q Q Q q -1 0 0 1 57.02362 62.69291 cm +1 0 0 1 57.02362 717.0236 cm Q - -endstream -endobj -104 0 obj -<< -/Length 10201 ->> -stream -1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET q -1 0 0 1 57.02362 751.8236 cm +1 0 0 1 57.02362 685.8236 cm q BT 1 0 0 1 0 2.2 Tm 13.2 TL /F2 11 Tf .133333 .133333 .133333 rg (7. Portal: Feedback Across Time) Tj T* ET Q Q q -1 0 0 1 57.02362 707.8236 cm +1 0 0 1 57.02362 641.8236 cm q BT 1 0 0 1 0 26 Tm .17989 Tw 12 TL /F1 10 Tf 0 0 0 rg (A continuation is feedback within a process. A portal is feedback across processes. Same primitive, different) Tj T* 0 Tw 1.747565 Tw (scope: capture machine state, serialize it, reload it elsewhere, resume. uncommonlisp ships three portal) Tj T* 0 Tw (formats with different tradeoffs & constituencies.) Tj T* ET Q Q q -1 0 0 1 57.02362 701.8236 cm +1 0 0 1 57.02362 635.8236 cm Q q -1 0 0 1 57.02362 605.8236 cm +1 0 0 1 57.02362 539.8236 cm q 1 1 1 rg n 0 96 481.2283 -18 re f* @@ -3537,29 +3545,29 @@ Q Q Q q -1 0 0 1 57.02362 605.8236 cm +1 0 0 1 57.02362 539.8236 cm Q q -1 0 0 1 57.02362 575.8236 cm +1 0 0 1 57.02362 509.8236 cm q 0 0 0 rg BT 1 0 0 1 0 14 Tm /F1 10 Tf 12 TL .49713 Tw (Times measured on a 4-binding workload \(int + list + string + fib\(30\) result\) excluding process startup. "k" =) Tj T* 0 Tw (continuation.) Tj T* ET Q Q q -1 0 0 1 57.02362 549.8236 cm +1 0 0 1 57.02362 483.8236 cm q BT 1 0 0 1 0 2 Tm 12 TL /F2 10 Tf .133333 .133333 .133333 rg (7.1 S-Expression Portal \227 the Portable One) Tj T* ET Q Q q -1 0 0 1 57.02362 531.8236 cm +1 0 0 1 57.02362 465.8236 cm q BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (The most boring format is the most portable. An S-expression portal is a sequence of ) Tj /F5 10 Tf (define) Tj /F1 10 Tf ( forms:) Tj T* ET Q Q q -1 0 0 1 57.02362 462.6236 cm +1 0 0 1 57.02362 396.6236 cm q q 1 0 0 1 0 0 cm @@ -3580,35 +3588,35 @@ Q Q Q q -1 0 0 1 57.02362 430.6236 cm +1 0 0 1 57.02362 364.6236 cm q 0 0 0 rg BT 1 0 0 1 0 14 Tm /F1 10 Tf 12 TL .550522 Tw (Every Scheme implementation in the world can already read this. No schema, no decoder, no version field.) Tj T* 0 Tw (The file is a Scheme program; loading it is evaluating it.) Tj T* ET Q Q q -1 0 0 1 57.02362 376.6236 cm +1 0 0 1 57.02362 310.6236 cm q BT 1 0 0 1 0 38 Tm .702256 Tw 12 TL /F3 10 Tf 0 0 0 rg (The key insight: the language IS the interchange format.) Tj /F1 10 Tf ( We did not design this. R. Kent Dybvig didn't.) Tj T* 0 Tw 1.188726 Tw (John McCarthy didn't. It is a structural consequence of homoiconicity: if the syntax of the language is the) Tj T* 0 Tw 5.458196 Tw (syntax of its data structures, then data serialization is language serialization. Portability across) Tj T* 0 Tw (implementations is free \227 it arrives with the parser.) Tj T* ET Q Q q -1 0 0 1 57.02362 334.6236 cm +1 0 0 1 57.02362 268.6236 cm q BT 1 0 0 1 0 26 Tm .511772 Tw 12 TL /F1 10 Tf 0 0 0 rg (Producer side: assemble the file with ) Tj /F5 10 Tf (\(display) Tj ( ) Tj (...\)) Tj /F1 10 Tf ( & ) Tj /F5 10 Tf (\(write) Tj ( ) Tj (...\)) Tj /F1 10 Tf ( to an output port. Consumer side:) Tj T* 0 Tw 3.693453 Tw /F5 10 Tf (\(load) Tj ( ) Tj ("file.sexp"\)) Tj /F1 10 Tf (. Both sides exist in every implementation, giving us a 3\3273 matrix of valid) Tj T* 0 Tw (exchanges.) Tj T* ET Q Q q -1 0 0 1 57.02362 308.6236 cm +1 0 0 1 57.02362 242.6236 cm q BT 1 0 0 1 0 2 Tm 12 TL /F2 10 Tf .133333 .133333 .133333 rg (7.2 Cross-Implementation Exchange Matrix) Tj T* ET Q Q q -1 0 0 1 57.02362 296.6236 cm +1 0 0 1 57.02362 230.6236 cm Q q -1 0 0 1 57.02362 206.6236 cm +1 0 0 1 57.02362 140.6236 cm q 1 1 1 rg n 0 90 481.2283 -18 re f* @@ -3763,51 +3771,51 @@ Q Q Q q -1 0 0 1 57.02362 206.6236 cm +1 0 0 1 57.02362 140.6236 cm Q q -1 0 0 1 57.02362 176.6236 cm +1 0 0 1 57.02362 110.6236 cm q BT 1 0 0 1 0 14 Tm 2.324029 Tw 12 TL /F1 10 Tf 0 0 0 rg (9 of 9. Verified by ) Tj /F5 10 Tf (tests/portal-cross-test.sh) Tj /F1 10 Tf (. Same file, same semantics, regardless of which) Tj T* 0 Tw (process produced it.) Tj T* ET Q Q q -1 0 0 1 57.02362 134.6236 cm +1 0 0 1 57.02362 68.62362 cm q 0 0 0 rg BT 1 0 0 1 0 26 Tm /F1 10 Tf 12 TL .526019 Tw (This matters because it defeats the "version lock-in" trap. If the JSON portal were the only option, a Python) Tj T* 0 Tw 2.478453 Tw (3.15 producer could emit structures a C consumer couldn't parse. With S-expression portals, the only) Tj T* 0 Tw (dependency is a parser that handles the subset of forms in the file. Every implementation already has one.) Tj T* ET Q Q -q -1 0 0 1 57.02362 108.6236 cm -q -BT 1 0 0 1 0 2 Tm 12 TL /F2 10 Tf .133333 .133333 .133333 rg (7.3 JSON Portal \227 Graph-Aware, Continuation-Preserving) Tj T* ET -Q -Q -q -1 0 0 1 57.02362 78.62362 cm -q -BT 1 0 0 1 0 14 Tm .373453 Tw 12 TL /F1 10 Tf 0 0 0 rg (When you need to preserve shared references, cycles, closures, or a ) Tj /F4 10 Tf (live continuation) Tj /F1 10 Tf (, S-expressions aren't) Tj T* 0 Tw (enough. The JSON portal \(Python & C\) performs graph-aware serialization:) Tj T* ET -Q -Q -q -1 0 0 1 57.02362 72.62362 cm -Q -q -1 0 0 1 57.02362 72.62362 cm -Q endstream endobj -105 0 obj +106 0 obj << -/Length 8828 +/Length 8469 >> stream 1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET q 1 0 0 1 57.02362 753.0236 cm q +BT 1 0 0 1 0 2 Tm 12 TL /F2 10 Tf .133333 .133333 .133333 rg (7.3 JSON Portal \227 Graph-Aware, Continuation-Preserving) Tj T* ET +Q +Q +q +1 0 0 1 57.02362 723.0236 cm +q +BT 1 0 0 1 0 14 Tm .373453 Tw 12 TL /F1 10 Tf 0 0 0 rg (When you need to preserve shared references, cycles, closures, or a ) Tj /F4 10 Tf (live continuation) Tj /F1 10 Tf (, S-expressions aren't) Tj T* 0 Tw (enough. The JSON portal \(Python & C\) performs graph-aware serialization:) Tj T* ET +Q +Q +q +1 0 0 1 57.02362 717.0236 cm +Q +q +1 0 0 1 57.02362 717.0236 cm +Q +q +1 0 0 1 57.02362 705.0236 cm +q 0 0 0 rg BT /F1 10 Tf 12 TL ET q @@ -3828,10 +3836,10 @@ Q Q Q q -1 0 0 1 57.02362 747.0236 cm +1 0 0 1 57.02362 699.0236 cm Q q -1 0 0 1 57.02362 735.0236 cm +1 0 0 1 57.02362 687.0236 cm q 0 0 0 rg BT /F1 10 Tf 12 TL ET @@ -3854,10 +3862,10 @@ Q Q Q q -1 0 0 1 57.02362 729.0236 cm +1 0 0 1 57.02362 681.0236 cm Q q -1 0 0 1 57.02362 717.0236 cm +1 0 0 1 57.02362 669.0236 cm q 0 0 0 rg BT /F1 10 Tf 12 TL ET @@ -3879,10 +3887,10 @@ Q Q Q q -1 0 0 1 57.02362 711.0236 cm +1 0 0 1 57.02362 663.0236 cm Q q -1 0 0 1 57.02362 699.0236 cm +1 0 0 1 57.02362 651.0236 cm q 0 0 0 rg BT /F1 10 Tf 12 TL ET @@ -3905,10 +3913,10 @@ Q Q Q q -1 0 0 1 57.02362 693.0236 cm +1 0 0 1 57.02362 645.0236 cm Q q -1 0 0 1 57.02362 681.0236 cm +1 0 0 1 57.02362 633.0236 cm q 0 0 0 rg BT /F1 10 Tf 12 TL ET @@ -3931,22 +3939,22 @@ Q Q Q q -1 0 0 1 57.02362 663.0236 cm +1 0 0 1 57.02362 615.0236 cm Q q -1 0 0 1 57.02362 633.0236 cm +1 0 0 1 57.02362 585.0236 cm q BT 1 0 0 1 0 14 Tm 2.974168 Tw 12 TL /F1 10 Tf 0 0 0 rg (Deserialization is two-pass: shell pass creates empty object shells & assigns reference IDs, fill pass) Tj T* 0 Tw (populates pointers & values. This handles the closure-that-captures-itself pattern cleanly.) Tj T* ET Q Q q -1 0 0 1 57.02362 591.0236 cm +1 0 0 1 57.02362 543.0236 cm q BT 1 0 0 1 0 26 Tm 4.719816 Tw 12 TL /F1 10 Tf 0 0 0 rg (During VM execution, ) Tj /F5 10 Tf (portal-checkpoint!) Tj /F1 10 Tf ( triggers at ) Tj /F5 10 Tf (OP_JUMP) Tj /F1 10 Tf ( & ) Tj /F5 10 Tf (OP_TAIL_CALL) Tj /F1 10 Tf ( instructions,) Tj T* 0 Tw 1.439168 Tw (capturing the current continuation, serializing it to a ) Tj /F5 10 Tf (.portal) Tj /F1 10 Tf ( file, & continuing. Resumption restores the) Tj T* 0 Tw (saved state & continues execution from the exact instruction where the checkpoint occurred.) Tj T* ET Q Q q -1 0 0 1 57.02362 560.2236 cm +1 0 0 1 57.02362 512.2236 cm q q 1 0 0 1 0 0 cm @@ -3967,26 +3975,26 @@ Q Q Q q -1 0 0 1 57.02362 540.2236 cm +1 0 0 1 57.02362 492.2236 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (The computation does not need to restart from the beginning.) Tj T* ET Q Q q -1 0 0 1 57.02362 514.2236 cm +1 0 0 1 57.02362 466.2236 cm q BT 1 0 0 1 0 2 Tm 12 TL /F2 10 Tf .133333 .133333 .133333 rg (7.4 Binary Heap Dump \227 the Fast One) Tj T* ET Q Q q -1 0 0 1 57.02362 484.2236 cm +1 0 0 1 57.02362 436.2236 cm q BT 1 0 0 1 0 14 Tm .755197 Tw 12 TL /F1 10 Tf 0 0 0 rg (The asm implementation ships a direct-dump portal: write the raw heap bytes, the ) Tj /F5 10 Tf (r14) Tj /F1 10 Tf ( \(env\) & ) Tj /F5 10 Tf (r15) Tj /F1 10 Tf ( \(bump) Tj T* 0 Tw (pointer\) registers, the heap base address, & a magic header. No parsing, no encoding.) Tj T* ET Q Q q -1 0 0 1 57.02362 386.2236 cm +1 0 0 1 57.02362 338.2236 cm q q 1 0 0 1 0 0 cm @@ -4007,44 +4015,166 @@ Q Q Q q -1 0 0 1 57.02362 342.2236 cm +1 0 0 1 57.02362 294.2236 cm q BT 1 0 0 1 0 26 Tm 1.387739 Tw 12 TL /F1 10 Tf 0 0 0 rg (Sub-millisecond save & resume. The MAP_FIXED trick is why it works across processes: because every) Tj T* 0 Tw 1.474556 Tw (pointer inside the heap is an absolute address, resuming at a different address would require relocation.) Tj T* 0 Tw (Mapping at the same address keeps pointers live.) Tj T* ET Q Q q -1 0 0 1 57.02362 288.2236 cm +1 0 0 1 57.02362 240.2236 cm q BT 1 0 0 1 0 38 Tm 1.067739 Tw 12 TL /F1 10 Tf 0 0 0 rg (Constraints: same architecture, same binary layout, same process model. An asm binary portal written on) Tj T* 0 Tw .022545 Tw (one box resumes on another x86_64 Linux box running the same asm binary. It does not resume on a rebuilt) Tj T* 0 Tw 1.065522 Tw (binary \227 the BSS-resident symbol table ) Tj /F5 10 Tf (sym_table) Tj /F1 10 Tf ( is not in the heap dump, so interned symbols would) Tj T* 0 Tw (need to be reinterned. That's the price of trivial serialization.) Tj T* ET Q Q q -1 0 0 1 57.02362 262.2236 cm +1 0 0 1 57.02362 214.2236 cm q BT 1 0 0 1 0 2 Tm 12 TL /F2 10 Tf .133333 .133333 .133333 rg (7.5 Cross-Process Benchmarks) Tj T* ET Q Q q -1 0 0 1 57.02362 232.2236 cm +1 0 0 1 57.02362 184.2236 cm q 0 0 0 rg BT 1 0 0 1 0 14 Tm /F1 10 Tf 12 TL 2.703647 Tw (Producer process A saves state to a file; consumer process B starts fresh, loads the file, continues.) Tj T* 0 Tw (Wall-clock time for both processes end-to-end, 50 iterations, same-laptop:) Tj T* ET Q Q q -1 0 0 1 57.02362 226.2236 cm +1 0 0 1 57.02362 178.2236 cm Q q -1 0 0 1 57.02362 64.22362 cm +1 0 0 1 57.02362 70.22362 cm q 1 1 1 rg -n 0 162 481.2283 -18 re f* -.878431 .878431 .878431 rg -n 0 144 481.2283 -18 re f* -1 1 1 rg -n 0 126 481.2283 -18 re f* -.878431 .878431 .878431 rg n 0 108 481.2283 -18 re f* +.878431 .878431 .878431 rg +n 0 90 481.2283 -18 re f* +1 1 1 rg +n 0 72 481.2283 -18 re f* +.878431 .878431 .878431 rg +n 0 54 481.2283 -18 re f* +1 1 1 rg +n 0 36 481.2283 -18 re f* +.878431 .878431 .878431 rg +n 0 18 481.2283 -18 re f* +0 0 0 rg +BT /F3 10 Tf 12 TL ET +q +1 0 0 1 6 93 cm +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F3 10 Tf 12 TL 93.12904 0 Td (Pair \(producer ) Tj /F6 10 Tf 12 TL (\256) Tj /F3 10 Tf 12 TL ( consumer\)) Tj T* -93.12904 0 Td ET +Q +Q +q +1 0 0 1 339.1581 93 cm +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F3 10 Tf 12 TL 47.19513 0 Td (Time/iter) Tj T* -47.19513 0 Td ET +Q +Q +0 0 0 rg +BT /F1 10 Tf 12 TL ET +q +1 0 0 1 6 75 cm +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Python ) Tj /F6 10 Tf 12 TL (\256) Tj /F1 10 Tf 12 TL ( Python \(sexp\)) Tj T* ET +Q +Q +q +1 0 0 1 339.1581 75 cm +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (260 ms) Tj T* ET +Q +Q +q +1 0 0 1 6 57 cm +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (C ) Tj /F6 10 Tf 12 TL (\256) Tj /F1 10 Tf 12 TL ( C \(sexp\)) Tj T* ET +Q +Q +q +1 0 0 1 339.1581 57 cm +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (6 ms) Tj T* ET +Q +Q +q +1 0 0 1 6 39 cm +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F3 10 Tf 12 TL (asm ) Tj /F6 10 Tf 12 TL (\256) Tj /F3 10 Tf 12 TL ( asm \(sexp\)) Tj T* ET +Q +Q +q +1 0 0 1 339.1581 39 cm +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F3 10 Tf 12 TL (1.6 ms) Tj T* ET +Q +Q +q +1 0 0 1 6 21 cm +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F3 10 Tf 12 TL (asm ) Tj /F6 10 Tf 12 TL (\256) Tj /F3 10 Tf 12 TL ( asm \(binary portal\)) Tj T* ET +Q +Q +q +1 0 0 1 339.1581 21 cm +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F3 10 Tf 12 TL (1.5 ms) Tj T* ET +Q +Q +q +1 0 0 1 6 3 cm +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Python ) Tj /F6 10 Tf 12 TL (\256) Tj /F1 10 Tf 12 TL ( C \(sexp\)) Tj T* ET +Q +Q +q +1 0 0 1 339.1581 3 cm +q +0 0 0 rg +BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (133 ms) Tj T* ET +Q +Q +q +1 J +1 j +0 0 0 RG +.25 w +n 0 0 m 481.2283 0 l S +n 0 90 m 481.2283 90 l S +n 0 72 m 481.2283 72 l S +n 0 54 m 481.2283 54 l S +n 0 36 m 481.2283 36 l S +n 0 18 m 481.2283 18 l S +n 333.1581 0 m 333.1581 108 l S +n 0 108 m 481.2283 108 l S +n 0 0 m 0 108 l S +n 481.2283 0 m 481.2283 108 l S +Q +Q +Q + +endstream +endobj +107 0 obj +<< +/Length 9245 +>> +stream +1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET +q +1 0 0 1 57.02362 675.0236 cm +q 1 1 1 rg n 0 90 481.2283 -18 re f* .878431 .878431 .878431 rg @@ -4056,175 +4186,50 @@ n 0 36 481.2283 -18 re f* 1 1 1 rg n 0 18 481.2283 -18 re f* 0 0 0 rg -BT /F3 10 Tf 12 TL ET -q -1 0 0 1 6 147 cm -q -0 0 0 rg -BT 1 0 0 1 0 2 Tm /F3 10 Tf 12 TL 93.12904 0 Td (Pair \(producer ) Tj /F6 10 Tf 12 TL (\256) Tj /F3 10 Tf 12 TL ( consumer\)) Tj T* -93.12904 0 Td ET -Q -Q -q -1 0 0 1 339.1581 147 cm -q -0 0 0 rg -BT 1 0 0 1 0 2 Tm /F3 10 Tf 12 TL 47.19513 0 Td (Time/iter) Tj T* -47.19513 0 Td ET -Q -Q -0 0 0 rg BT /F1 10 Tf 12 TL ET q -1 0 0 1 6 129 cm -q -0 0 0 rg -BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Python ) Tj /F6 10 Tf 12 TL (\256) Tj /F1 10 Tf 12 TL ( Python \(sexp\)) Tj T* ET -Q -Q -q -1 0 0 1 339.1581 129 cm -q -0 0 0 rg -BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (260 ms) Tj T* ET -Q -Q -q -1 0 0 1 6 111 cm -q -0 0 0 rg -BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (C ) Tj /F6 10 Tf 12 TL (\256) Tj /F1 10 Tf 12 TL ( C \(sexp\)) Tj T* ET -Q -Q -q -1 0 0 1 339.1581 111 cm -q -0 0 0 rg -BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (6 ms) Tj T* ET -Q -Q -q -1 0 0 1 6 93 cm -q -0 0 0 rg -BT 1 0 0 1 0 2 Tm /F3 10 Tf 12 TL (asm ) Tj /F6 10 Tf 12 TL (\256) Tj /F3 10 Tf 12 TL ( asm \(sexp\)) Tj T* ET -Q -Q -q -1 0 0 1 339.1581 93 cm -q -0 0 0 rg -BT 1 0 0 1 0 2 Tm /F3 10 Tf 12 TL (1.6 ms) Tj T* ET -Q -Q -q 1 0 0 1 6 75 cm q 0 0 0 rg -BT 1 0 0 1 0 2 Tm /F3 10 Tf 12 TL (asm ) Tj /F6 10 Tf 12 TL (\256) Tj /F3 10 Tf 12 TL ( asm \(binary portal\)) Tj T* ET -Q -Q -q -1 0 0 1 339.1581 75 cm -q -0 0 0 rg -BT 1 0 0 1 0 2 Tm /F3 10 Tf 12 TL (1.5 ms) Tj T* ET -Q -Q -q -1 0 0 1 6 57 cm -q -0 0 0 rg -BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Python ) Tj /F6 10 Tf 12 TL (\256) Tj /F1 10 Tf 12 TL ( C \(sexp\)) Tj T* ET -Q -Q -q -1 0 0 1 339.1581 57 cm -q -0 0 0 rg -BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (133 ms) Tj T* ET -Q -Q -q -1 0 0 1 6 39 cm -q -0 0 0 rg BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Python ) Tj /F6 10 Tf 12 TL (\256) Tj /F1 10 Tf 12 TL ( asm \(sexp\)) Tj T* ET Q Q q -1 0 0 1 339.1581 39 cm +1 0 0 1 339.1581 75 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (145 ms) Tj T* ET Q Q q -1 0 0 1 6 21 cm +1 0 0 1 6 57 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (C ) Tj /F6 10 Tf 12 TL (\256) Tj /F1 10 Tf 12 TL ( Python \(sexp\)) Tj T* ET Q Q q -1 0 0 1 339.1581 21 cm +1 0 0 1 339.1581 57 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (154 ms) Tj T* ET Q Q q -1 0 0 1 6 3 cm +1 0 0 1 6 39 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (C ) Tj /F6 10 Tf 12 TL (\256) Tj /F1 10 Tf 12 TL ( asm \(sexp\)) Tj T* ET Q Q q -1 0 0 1 339.1581 3 cm +1 0 0 1 339.1581 39 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (4.1 ms) Tj T* ET Q Q q -1 J -1 j -0 0 0 RG -.25 w -n 0 0 m 481.2283 0 l S -n 0 144 m 481.2283 144 l S -n 0 126 m 481.2283 126 l S -n 0 108 m 481.2283 108 l S -n 0 90 m 481.2283 90 l S -n 0 72 m 481.2283 72 l S -n 0 54 m 481.2283 54 l S -n 0 36 m 481.2283 36 l S -n 0 18 m 481.2283 18 l S -n 333.1581 0 m 333.1581 162 l S -n 0 162 m 481.2283 162 l S -n 0 0 m 0 162 l S -n 481.2283 0 m 481.2283 162 l S -Q -Q -Q - -endstream -endobj -106 0 obj -<< -/Length 8971 ->> -stream -1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET -q -1 0 0 1 57.02362 729.0236 cm -q -1 1 1 rg -n 0 36 481.2283 -18 re f* -.878431 .878431 .878431 rg -n 0 18 481.2283 -18 re f* -0 0 0 rg -BT /F1 10 Tf 12 TL ET -q 1 0 0 1 6 21 cm q 0 0 0 rg @@ -4257,42 +4262,45 @@ q 1 j 0 0 0 RG .25 w +n 0 90 m 481.2283 90 l S +n 0 72 m 481.2283 72 l S +n 0 54 m 481.2283 54 l S n 0 36 m 481.2283 36 l S n 0 18 m 481.2283 18 l S -n 333.1581 0 m 333.1581 36 l S -n 0 0 m 0 36 l S -n 481.2283 0 m 481.2283 36 l S +n 333.1581 0 m 333.1581 90 l S +n 0 0 m 0 90 l S +n 481.2283 0 m 481.2283 90 l S n 0 0 m 481.2283 0 l S Q Q Q q -1 0 0 1 57.02362 729.0236 cm +1 0 0 1 57.02362 675.0236 cm Q q -1 0 0 1 57.02362 687.0236 cm +1 0 0 1 57.02362 633.0236 cm q BT 1 0 0 1 0 26 Tm .698334 Tw 12 TL /F1 10 Tf 0 0 0 rg (The asm) Tj /F6 10 Tf 12 TL (\256) Tj /F1 10 Tf 12 TL (asm cross-process is ~160\327 faster than Python) Tj /F6 10 Tf 12 TL (\256) Tj /F1 10 Tf 12 TL (Python. The binary & S-expression portals are) Tj T* 0 Tw .812256 Tw (within 10% of each other on this workload \227 the bottleneck is process startup, not serialization. For larger) Tj T* 0 Tw (heaps the binary format pulls further ahead; for portability, S-expression always wins.) Tj T* ET Q Q q -1 0 0 1 57.02362 661.0236 cm +1 0 0 1 57.02362 607.0236 cm q BT 1 0 0 1 0 2 Tm 12 TL /F2 10 Tf .133333 .133333 .133333 rg (7.6 Mismatch Cases: Graceful Degradation) Tj T* ET Q Q q -1 0 0 1 57.02362 643.0236 cm +1 0 0 1 57.02362 589.0236 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (A usable persistence layer fails well. What happens when the consumer meets unexpected input?) Tj T* ET Q Q q -1 0 0 1 57.02362 637.0236 cm +1 0 0 1 57.02362 583.0236 cm Q q -1 0 0 1 57.02362 487.0236 cm +1 0 0 1 57.02362 433.0236 cm q 1 1 1 rg n 0 150 481.2283 -18 re f* @@ -4525,22 +4533,22 @@ Q Q Q q -1 0 0 1 57.02362 487.0236 cm +1 0 0 1 57.02362 433.0236 cm Q q -1 0 0 1 57.02362 421.0236 cm +1 0 0 1 57.02362 367.0236 cm q BT 1 0 0 1 0 50 Tm 1.476556 Tw 12 TL /F1 10 Tf 0 0 0 rg (All defects surfaced & fixed during benchmark development: an asm segfault on ) Tj /F5 10 Tf (\(define) Tj ( ) Tj (x\)) Tj /F1 10 Tf ( without a) Tj T* 0 Tw 1.838453 Tw (value \(now binds to ) Tj /F5 10 Tf (VOID) Tj /F1 10 Tf (\), an asm portal-resume that accepted short headers \(now verifies ) Tj /F5 10 Tf (sys_read) Tj /F1 10 Tf T* 0 Tw 1.204272 Tw (returned a full 48 bytes & sanity-checks heap metadata\), a Python ) Tj /F5 10 Tf (file) Tj ( ) Tj (not) Tj ( ) Tj (found) Tj /F1 10 Tf ( error reporting the) Tj T* 0 Tw 1.304862 Tw (outer script path instead of the inner missing file \(now uses ) Tj /F5 10 Tf (FileNotFoundError.filename) Tj /F1 10 Tf (\). Graceful) Tj T* 0 Tw (degradation is not free; it is tested.) Tj T* ET Q Q q -1 0 0 1 57.02362 395.0236 cm +1 0 0 1 57.02362 341.0236 cm q BT 1 0 0 1 0 2 Tm 12 TL /F2 10 Tf .133333 .133333 .133333 rg (7.7 Use Case: Distributed Primality Testing) Tj T* ET Q Q q -1 0 0 1 57.02362 268.2236 cm +1 0 0 1 57.02362 214.2236 cm q q 1 0 0 1 0 0 cm @@ -4560,38 +4568,47 @@ Q Q Q q -1 0 0 1 57.02362 224.2236 cm +1 0 0 1 57.02362 170.2236 cm q BT 1 0 0 1 0 26 Tm 1.105522 Tw 12 TL /F1 10 Tf 0 0 0 rg (Machine A starts the computation. Every 10,000 iterations, it writes a checkpoint. Machine B picks up the) Tj T* 0 Tw 2.790642 Tw /F5 10 Tf (.portal) Tj /F1 10 Tf ( file & continues from the last checkpoint. The computation migrates without either machine) Tj T* 0 Tw (needing to know about the other. Feedback \227 the continuation \227 carries the entire execution context.) Tj T* ET Q Q q -1 0 0 1 57.02362 193.0236 cm +1 0 0 1 57.02362 139.0236 cm q BT 1 0 0 1 0 2.2 Tm 13.2 TL /F2 11 Tf .133333 .133333 .133333 rg (8. The EML Universality Proof) Tj T* ET Q Q q -1 0 0 1 57.02362 161.0236 cm +1 0 0 1 57.02362 107.0236 cm q BT 1 0 0 1 0 14 Tm 1.489873 Tw 12 TL /F1 10 Tf 0 0 0 rg (uncommonlisp ships with a mathematical proof that a single operator generates all elementary functions:) Tj T* 0 Tw /F5 10 Tf (eml\(x,) Tj ( ) Tj (y\)) Tj ( ) Tj (=) Tj ( ) Tj (exp\(x\)) Tj ( ) Tj (-) Tj ( ) Tj (ln\(y\)) Tj /F1 10 Tf (.) Tj T* ET Q Q q -1 0 0 1 57.02362 143.0236 cm +1 0 0 1 57.02362 89.02362 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Reference: "All elementary functions from a single operator" \(arXiv:2603.21852v2\).) Tj T* ET Q Q + +endstream +endobj +108 0 obj +<< +/Length 8373 +>> +stream +1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET q -1 0 0 1 57.02362 117.0236 cm +1 0 0 1 57.02362 753.0236 cm q BT 1 0 0 1 0 2 Tm 12 TL /F2 10 Tf .133333 .133333 .133333 rg (8.1 The Operator) Tj T* ET Q Q q -1 0 0 1 57.02362 86.22362 cm +1 0 0 1 57.02362 722.2236 cm q q 1 0 0 1 0 0 cm @@ -4612,28 +4629,19 @@ Q Q Q q -1 0 0 1 57.02362 66.22362 cm +1 0 0 1 57.02362 702.2236 cm q BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (With this operator & the constant ) Tj /F5 10 Tf (1) Tj /F1 10 Tf (, the following derivation chain constructs every elementary function:) Tj T* ET Q Q - -endstream -endobj -107 0 obj -<< -/Length 8795 ->> -stream -1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET q -1 0 0 1 57.02362 753.0236 cm +1 0 0 1 57.02362 676.2236 cm q BT 1 0 0 1 0 2 Tm 12 TL /F2 10 Tf .133333 .133333 .133333 rg (8.2 Stage 1: Core Functions \(Depth 1--3\)) Tj T* ET Q Q q -1 0 0 1 57.02362 703.0236 cm +1 0 0 1 57.02362 626.2236 cm q q 1 0 0 1 0 0 cm @@ -4654,19 +4662,19 @@ Q Q Q q -1 0 0 1 57.02362 659.0236 cm +1 0 0 1 57.02362 582.2236 cm q BT 1 0 0 1 0 26 Tm 16.01403 Tw 12 TL /F3 10 Tf 0 0 0 rg (Proof of ln recovery) Tj /F1 10 Tf (: Let ) Tj /F5 10 Tf (a) Tj ( ) Tj (=) Tj ( ) Tj (eml\(1,x\)) Tj ( ) Tj (=) Tj ( ) Tj (e) Tj ( ) Tj (-) Tj ( ) Tj (ln\(x\)) Tj /F1 10 Tf (. Then) Tj T* 0 Tw 28.85979 Tw /F5 10 Tf (eml\(a,) Tj ( ) Tj (1\)) Tj ( ) Tj (=) Tj ( ) Tj (exp\(e) Tj ( ) Tj (-) Tj ( ) Tj (ln\(x\)\)) Tj ( ) Tj (=) Tj ( ) Tj (exp\(e\)/x) Tj /F1 10 Tf (. Then) Tj T* 0 Tw /F5 10 Tf (eml\(1,) Tj ( ) Tj (exp\(e\)/x\)) Tj ( ) Tj (=) Tj ( ) Tj (e) Tj ( ) Tj (-) Tj ( ) Tj (ln\(exp\(e\)/x\)) Tj ( ) Tj (=) Tj ( ) Tj (e) Tj ( ) Tj (-) Tj ( ) Tj (e) Tj ( ) Tj (+) Tj ( ) Tj (ln\(x\)) Tj ( ) Tj (=) Tj ( ) Tj (ln\(x\)) Tj /F1 10 Tf (.) Tj T* ET Q Q q -1 0 0 1 57.02362 633.0236 cm +1 0 0 1 57.02362 556.2236 cm q BT 1 0 0 1 0 2 Tm 12 TL /F2 10 Tf .133333 .133333 .133333 rg (8.3 Stage 2: Arithmetic) Tj T* ET Q Q q -1 0 0 1 57.02362 544.6236 cm +1 0 0 1 57.02362 467.8236 cm q q 1 0 0 1 0 0 cm @@ -4686,13 +4694,13 @@ Q Q Q q -1 0 0 1 57.02362 518.6236 cm +1 0 0 1 57.02362 441.8236 cm q BT 1 0 0 1 0 2 Tm 12 TL /F2 10 Tf .133333 .133333 .133333 rg (8.4 Stage 3: Complex Plane Access) Tj T* ET Q Q q -1 0 0 1 57.02362 468.6236 cm +1 0 0 1 57.02362 391.8236 cm q q 1 0 0 1 0 0 cm @@ -4713,19 +4721,19 @@ Q Q Q q -1 0 0 1 57.02362 436.6236 cm +1 0 0 1 57.02362 359.8236 cm q BT 1 0 0 1 0 14 Tm .253071 Tw 12 TL /F1 10 Tf 0 0 0 rg (The key insight: ) Tj /F5 10 Tf (ln) Tj /F1 10 Tf ( of a negative number enters the complex plane. Since we can construct ) Tj /F5 10 Tf (-1) Tj /F1 10 Tf ( from eml via) Tj T* 0 Tw (the subtraction chain, ) Tj /F5 10 Tf (ln\(-1\)) Tj /F1 10 Tf ( yields ) Tj /F5 10 Tf (i) Tj /F6 10 Tf 12 TL (p) Tj /F5 10 Tf 12 TL /F1 10 Tf (, from which ) Tj /F5 10 Tf /F6 10 Tf 12 TL (p) Tj /F5 10 Tf 12 TL /F1 10 Tf ( & ) Tj /F5 10 Tf (i) Tj /F1 10 Tf ( follow.) Tj T* ET Q Q q -1 0 0 1 57.02362 410.6236 cm +1 0 0 1 57.02362 333.8236 cm q BT 1 0 0 1 0 2 Tm 12 TL /F2 10 Tf .133333 .133333 .133333 rg (8.5 Stage 4: Trigonometry via Euler) Tj T* ET Q Q q -1 0 0 1 57.02362 360.6236 cm +1 0 0 1 57.02362 283.8236 cm q q 1 0 0 1 0 0 cm @@ -4746,29 +4754,29 @@ Q Q Q q -1 0 0 1 57.02362 340.6236 cm +1 0 0 1 57.02362 263.8236 cm q BT 1 0 0 1 0 2 Tm 12 TL /F1 10 Tf 0 0 0 rg (All trigonometric functions follow from complex exponentials, which follow from ) Tj /F5 10 Tf (exp) Tj /F1 10 Tf (, which follows from ) Tj /F5 10 Tf (eml) Tj /F1 10 Tf (.) Tj T* ET Q Q q -1 0 0 1 57.02362 314.6236 cm +1 0 0 1 57.02362 237.8236 cm q BT 1 0 0 1 0 2 Tm 12 TL /F2 10 Tf .133333 .133333 .133333 rg (8.6 Verification & Friction Analysis) Tj T* ET Q Q q -1 0 0 1 57.02362 296.6236 cm +1 0 0 1 57.02362 219.8236 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (The proof is verified at three levels, with dramatically different friction:) Tj T* ET Q Q q -1 0 0 1 57.02362 290.6236 cm +1 0 0 1 57.02362 213.8236 cm Q q -1 0 0 1 57.02362 218.6236 cm +1 0 0 1 57.02362 141.8236 cm q 1 1 1 rg n 0 72 481.2283 -18 re f* @@ -4912,43 +4920,49 @@ Q Q Q q -1 0 0 1 57.02362 218.6236 cm +1 0 0 1 57.02362 141.8236 cm Q q -1 0 0 1 57.02362 176.6236 cm +1 0 0 1 57.02362 99.82362 cm q BT 1 0 0 1 0 26 Tm .395596 Tw 12 TL /F3 10 Tf 0 0 0 rg (The formal proof is 40x faster than the brute-force search & provides mathematical certainty instead) Tj T* 0 Tw 1.066027 Tw (of floating-point tolerance.) Tj /F1 10 Tf ( This is MOAD-0001 \(the sedimentary defect\) at the proof methodology layer:) Tj T* 0 Tw (O\(N\262\) search friction where O\(1\) algebraic reasoning suffices.) Tj T* ET Q Q q -1 0 0 1 57.02362 122.6236 cm +1 0 0 1 57.02362 69.82362 cm q -BT 1 0 0 1 0 38 Tm 2.309862 Tw 12 TL /F1 10 Tf 0 0 0 rg (The numerical approaches enumerate all pairwise EML compositions at each depth, comparing results) Tj T* 0 Tw .653022 Tw (against target functions. This grows quadratically with the number of known values. The Lean proof does 5) Tj T* 0 Tw .327397 Tw (algebraic rewrites, each applying an axiom \() Tj /F5 10 Tf (exp\(ln\(x\)\)) Tj ( ) Tj (=) Tj ( ) Tj (x) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (ln\(exp\(x\)\)) Tj ( ) Tj (=) Tj ( ) Tj (x) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (ln\(1\)) Tj ( ) Tj (=) Tj ( ) Tj (0) Tj /F1 10 Tf (\). The type) Tj T* 0 Tw (checker confirms each rewrite in microseconds. No search. No tolerance. No conjecture dependency.) Tj T* ET +BT 1 0 0 1 0 14 Tm 2.309862 Tw 12 TL /F1 10 Tf 0 0 0 rg (The numerical approaches enumerate all pairwise EML compositions at each depth, comparing results) Tj T* 0 Tw .653022 Tw (against target functions. This grows quadratically with the number of known values. The Lean proof does 5) Tj T* 0 Tw ET +Q +Q + +endstream +endobj +109 0 obj +<< +/Length 9776 +>> +stream +1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET +q +1 0 0 1 57.02362 741.0236 cm +q +BT 1 0 0 1 0 14 Tm .327397 Tw 12 TL /F1 10 Tf 0 0 0 rg (algebraic rewrites, each applying an axiom \() Tj /F5 10 Tf (exp\(ln\(x\)\)) Tj ( ) Tj (=) Tj ( ) Tj (x) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (ln\(exp\(x\)\)) Tj ( ) Tj (=) Tj ( ) Tj (x) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (ln\(1\)) Tj ( ) Tj (=) Tj ( ) Tj (0) Tj /F1 10 Tf (\). The type) Tj T* 0 Tw (checker confirms each rewrite in microseconds. No search. No tolerance. No conjecture dependency.) Tj T* ET Q Q q -1 0 0 1 57.02362 68.62362 cm +1 0 0 1 57.02362 687.0236 cm q BT 1 0 0 1 0 38 Tm 3.571147 Tw 12 TL /F3 10 Tf 0 0 0 rg (Lesson) Tj /F1 10 Tf (: The fastest path to truth is not computation \227 it is understanding. When you know ) Tj /F4 10 Tf (why) Tj /F1 10 Tf T* 0 Tw .96189 Tw /F5 10 Tf (eml\(1,) Tj ( ) Tj (eml\(eml\(1,x\),) Tj ( ) Tj (1\)\)) Tj ( ) Tj (=) Tj ( ) Tj (ln\(x\)) Tj /F1 10 Tf (, you verify it in microseconds. When you don't, you search for) Tj T* 0 Tw 1.513223 Tw (hours. Proof assistants eliminate the quadratic friction of verification. They are the hash set to numerical) Tj T* 0 Tw (analysis's nested loop.) Tj T* ET Q Q q -1 0 0 1 57.02362 62.69291 cm -Q - -endstream -endobj -108 0 obj -<< -/Length 9833 ->> -stream -1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET -q -1 0 0 1 57.02362 765.0236 cm +1 0 0 1 57.02362 681.0236 cm Q q -1 0 0 1 57.02362 729.0236 cm +1 0 0 1 57.02362 681.0236 cm +Q +q +1 0 0 1 57.02362 645.0236 cm q 0 0 0 rg BT /F1 10 Tf 12 TL ET @@ -4970,10 +4984,10 @@ Q Q Q q -1 0 0 1 57.02362 723.0236 cm +1 0 0 1 57.02362 639.0236 cm Q q -1 0 0 1 57.02362 687.0236 cm +1 0 0 1 57.02362 603.0236 cm q 0 0 0 rg BT /F1 10 Tf 12 TL ET @@ -4995,10 +5009,10 @@ Q Q Q q -1 0 0 1 57.02362 681.0236 cm +1 0 0 1 57.02362 597.0236 cm Q q -1 0 0 1 57.02362 657.0236 cm +1 0 0 1 57.02362 573.0236 cm q 0 0 0 rg BT /F1 10 Tf 12 TL ET @@ -5020,10 +5034,10 @@ Q Q Q q -1 0 0 1 57.02362 657.0236 cm +1 0 0 1 57.02362 573.0236 cm Q q -1 0 0 1 57.02362 587.8236 cm +1 0 0 1 57.02362 503.8236 cm q q 1 0 0 1 0 0 cm @@ -5044,79 +5058,75 @@ Q Q Q q -1 0 0 1 57.02362 543.8236 cm +1 0 0 1 57.02362 459.8236 cm q BT 1 0 0 1 0 26 Tm 4.138556 Tw 12 TL /F1 10 Tf 0 0 0 rg (The Lean proof operates over abstract ) Tj /F5 10 Tf (exp) Tj /F1 10 Tf ( & ) Tj /F5 10 Tf (ln) Tj /F1 10 Tf ( functions with the axioms ) Tj /F5 10 Tf (exp\(ln\(x\)\)) Tj ( ) Tj (=) Tj ( ) Tj (x) Tj /F1 10 Tf (,) Tj T* 0 Tw 2.484897 Tw /F5 10 Tf (ln\(exp\(x\)\)) Tj ( ) Tj (=) Tj ( ) Tj (x) Tj /F1 10 Tf (, & ) Tj /F5 10 Tf (ln\(1\)) Tj ( ) Tj (=) Tj ( ) Tj (0) Tj /F1 10 Tf (. This makes the result independent of any particular real number) Tj T* 0 Tw (implementation.) Tj T* ET Q Q q -1 0 0 1 57.02362 512.6236 cm +1 0 0 1 57.02362 428.6236 cm q BT 1 0 0 1 0 2.2 Tm 13.2 TL /F2 11 Tf .133333 .133333 .133333 rg (9. Language Coverage) Tj T* ET Q Q q -1 0 0 1 57.02362 492.6236 cm +1 0 0 1 57.02362 408.6236 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (uncommonlisp implements a near-complete R7RS-small Scheme:) Tj T* ET Q Q q -1 0 0 1 57.02362 438.6236 cm +1 0 0 1 57.02362 354.6236 cm q BT 1 0 0 1 0 38 Tm 1.369223 Tw 12 TL /F3 10 Tf 0 0 0 rg (Special forms) Tj /F1 10 Tf ( \(32\): ) Tj /F5 10 Tf (define) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (set!) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (lambda) Tj /F1 10 Tf (, ) Tj /F5 10 Tf /F6 10 Tf 12 TL (l) Tj /F5 10 Tf 12 TL /F1 10 Tf (, ) Tj /F5 10 Tf (if) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (cond) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (case) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (and) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (or) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (when) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (unless) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (begin) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (let) Tj /F1 10 Tf (,) Tj T* 0 Tw 10.15262 Tw /F5 10 Tf (let*) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (letrec) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (letrec*) Tj /F1 10 Tf (, named-let, ) Tj /F5 10 Tf (do) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (quasiquote) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (define-macro) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (define-syntax) Tj /F1 10 Tf (,) Tj T* 0 Tw 3.646907 Tw /F5 10 Tf (syntax-rules) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (let-syntax) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (letrec-syntax) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (apply) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (eval) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (values) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (call/cc) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (dynamic-wind) Tj /F1 10 Tf (,) Tj T* 0 Tw /F5 10 Tf (guard) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (parameterize) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (load) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (error) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (module) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (import) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (define-record-type) Tj /F1 10 Tf (.) Tj T* ET Q Q q -1 0 0 1 57.02362 408.6236 cm +1 0 0 1 57.02362 324.6236 cm q BT 1 0 0 1 0 14 Tm .150642 Tw 12 TL /F3 10 Tf 0 0 0 rg (Built-in functions) Tj /F1 10 Tf ( \(100+\): Full arithmetic \(exact rationals, inexact reals, trigonometry\), pairs & lists \(SRFI-1\),) Tj T* 0 Tw (strings \(mutable\), characters, vectors, hash tables, I/O \(ports, file system\), system interface, Python interop.) Tj T* ET Q Q q -1 0 0 1 57.02362 378.6236 cm +1 0 0 1 57.02362 294.6236 cm q BT 1 0 0 1 0 14 Tm 2.274835 Tw 12 TL /F3 10 Tf 0 0 0 rg (Hygienic macros) Tj /F1 10 Tf (: ) Tj /F5 10 Tf (syntax-rules) Tj /F1 10 Tf ( with ellipsis \() Tj /F5 10 Tf (...) Tj /F1 10 Tf (\) support. Pattern matching, template instantiation,) Tj T* 0 Tw (proper hygiene. Also ) Tj /F5 10 Tf (define-macro) Tj /F1 10 Tf ( for procedural macros.) Tj T* ET Q Q q -1 0 0 1 57.02362 348.6236 cm +1 0 0 1 57.02362 264.6236 cm q BT 1 0 0 1 0 14 Tm 1.958835 Tw 12 TL /F3 10 Tf 0 0 0 rg (Standard library) Tj /F1 10 Tf ( \() Tj /F5 10 Tf (stdlib.lsp) Tj /F1 10 Tf (, 385 lines\): Additional macros \() Tj /F5 10 Tf (swap!) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (fluid-let) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (while) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (dotimes) Tj /F1 10 Tf (\),) Tj T* 0 Tw (utility functions, simple object system, SRFI-2/8/64 test framework.) Tj T* ET Q Q q -1 0 0 1 57.02362 294.6236 cm +1 0 0 1 57.02362 210.6236 cm q BT 1 0 0 1 0 38 Tm 1.569862 Tw 12 TL /F3 10 Tf 0 0 0 rg (Test suite) Tj /F1 10 Tf (: 974 verified assertions covering lexing, parsing, special forms, bytecode compilation, macros) Tj T* 0 Tw .214835 Tw (\(hygienic & procedural\), continuations, generators, record types, modules, arithmetic, higher-order functions,) Tj T* 0 Tw 4.238031 Tw (error handling, portal serialization, cross-implementation portal exchange, file I/O parity, & graceful) Tj T* 0 Tw (degradation on mismatched or corrupt input.) Tj T* ET Q Q q -1 0 0 1 57.02362 263.4236 cm +1 0 0 1 57.02362 179.4236 cm q BT 1 0 0 1 0 2.2 Tm 13.2 TL /F2 11 Tf .133333 .133333 .133333 rg (10. Relationship to Companion Papers) Tj T* ET Q Q q -1 0 0 1 57.02362 243.4236 cm +1 0 0 1 57.02362 159.4236 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (uncommonlisp forms one piece of a larger permacomputer machine learning stack:) Tj T* ET Q Q q -1 0 0 1 57.02362 237.4236 cm +1 0 0 1 57.02362 153.4236 cm Q q -1 0 0 1 57.02362 99.42362 cm +1 0 0 1 57.02362 75.42362 cm q 1 1 1 rg -n 0 138 481.2283 -18 re f* -.878431 .878431 .878431 rg -n 0 120 481.2283 -30 re f* -1 1 1 rg -n 0 90 481.2283 -30 re f* +n 0 78 481.2283 -18 re f* .878431 .878431 .878431 rg n 0 60 481.2283 -30 re f* 1 1 1 rg @@ -5124,21 +5134,21 @@ n 0 30 481.2283 -30 re f* 0 0 0 rg BT /F3 10 Tf 12 TL ET q -1 0 0 1 6 123 cm +1 0 0 1 6 63 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F3 10 Tf 12 TL 28.78283 0 Td (Layer) Tj T* -28.78283 0 Td ET Q Q q -1 0 0 1 102.2457 123 cm +1 0 0 1 102.2457 63 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F3 10 Tf 12 TL 64.31996 0 Td (Paper) Tj T* -64.31996 0 Td ET Q Q q -1 0 0 1 270.6756 123 cm +1 0 0 1 270.6756 63 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F3 10 Tf 12 TL 91.44138 0 Td (Role) Tj T* -91.44138 0 Td ET @@ -5147,45 +5157,79 @@ Q 0 0 0 rg BT /F1 10 Tf 12 TL ET q -1 0 0 1 6 105 cm +1 0 0 1 6 45 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Runtime) Tj T* ET Q Q q -1 0 0 1 102.2457 93 cm +1 0 0 1 102.2457 33 cm q BT 1 0 0 1 0 14 Tm 12 TL /F3 10 Tf 0 0 0 rg (Feedback Is All You Need) Tj /F1 10 Tf ( \(this) Tj T* (paper\)) Tj T* ET Q Q q -1 0 0 1 270.6756 93 cm +1 0 0 1 270.6756 33 cm q BT 1 0 0 1 0 14 Tm 12 TL /F1 10 Tf 0 0 0 rg (Complete Scheme VM with continuations &) Tj T* (portal) Tj T* ET Q Q q -1 0 0 1 6 75 cm +1 0 0 1 6 15 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Interaction) Tj T* ET Q Q q -1 0 0 1 102.2457 63 cm +1 0 0 1 102.2457 3 cm q BT 1 0 0 1 0 14 Tm 12 TL /F1 10 Tf 0 0 0 rg (Categorization & Feedback Is All) Tj T* (You Need) Tj T* ET Q Q q -1 0 0 1 270.6756 63 cm +1 0 0 1 270.6756 3 cm q 0 0 0 rg BT 1 0 0 1 0 14 Tm /F1 10 Tf 12 TL (Machine learning driven state machines in) Tj T* (58+ languages) Tj T* ET Q Q q +1 J +1 j +0 0 0 RG +.25 w +n 0 0 m 481.2283 0 l S +n 0 60 m 481.2283 60 l S +n 0 30 m 481.2283 30 l S +n 96.24567 0 m 96.24567 78 l S +n 264.6756 0 m 264.6756 78 l S +n 0 78 m 481.2283 78 l S +n 0 0 m 0 78 l S +n 481.2283 0 m 481.2283 78 l S +Q +Q +Q + +endstream +endobj +110 0 obj +<< +/Length 13213 +>> +stream +1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET +q +1 0 0 1 57.02362 705.0236 cm +q +1 1 1 rg +n 0 60 481.2283 -30 re f* +.878431 .878431 .878431 rg +n 0 30 481.2283 -30 re f* +0 0 0 rg +BT /F1 10 Tf 12 TL ET +q 1 0 0 1 6 45 cm q 0 0 0 rg @@ -5232,54 +5276,36 @@ q 1 j 0 0 0 RG .25 w -n 0 120 m 481.2283 120 l S -n 0 90 m 481.2283 90 l S n 0 60 m 481.2283 60 l S n 0 30 m 481.2283 30 l S -n 96.24567 0 m 96.24567 138 l S -n 264.6756 0 m 264.6756 138 l S -n 0 138 m 481.2283 138 l S +n 96.24567 0 m 96.24567 60 l S +n 264.6756 0 m 264.6756 60 l S +n 0 0 m 0 60 l S +n 481.2283 0 m 481.2283 60 l S n 0 0 m 481.2283 0 l S -n 0 0 m 0 138 l S -n 481.2283 0 m 481.2283 138 l S Q Q Q q -1 0 0 1 57.02362 99.42362 cm +1 0 0 1 57.02362 705.0236 cm Q q -1 0 0 1 57.02362 69.42362 cm +1 0 0 1 57.02362 651.0236 cm q -BT 1 0 0 1 0 14 Tm 2.814488 Tw 12 TL /F1 10 Tf 0 0 0 rg (uncommonlisp provides the runtime layer: a language that can checkpoint its own execution, migrate) Tj T* 0 Tw 2.355696 Tw (between machines, & resume from serialized state. The portal system enables distributed computation) Tj T* 0 Tw ET -Q -Q - -endstream -endobj -109 0 obj -<< -/Length 13072 ->> -stream -1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET -q -1 0 0 1 57.02362 741.0236 cm -q -BT 1 0 0 1 0 14 Tm 1.588941 Tw 12 TL /F1 10 Tf 0 0 0 rg (across permacomputer nodes. Categorization & feedback activities could run inside uncommonlisp's VM,) Tj T* 0 Tw (with ) Tj /F5 10 Tf (call/cc) Tj /F1 10 Tf ( providing the state machine transitions & portal providing persistence.) Tj T* ET +BT 1 0 0 1 0 38 Tm 2.814488 Tw 12 TL /F1 10 Tf 0 0 0 rg (uncommonlisp provides the runtime layer: a language that can checkpoint its own execution, migrate) Tj T* 0 Tw 2.355696 Tw (between machines, & resume from serialized state. The portal system enables distributed computation) Tj T* 0 Tw 1.588941 Tw (across permacomputer nodes. Categorization & feedback activities could run inside uncommonlisp's VM,) Tj T* 0 Tw (with ) Tj /F5 10 Tf (call/cc) Tj /F1 10 Tf ( providing the state machine transitions & portal providing persistence.) Tj T* ET Q Q q -1 0 0 1 57.02362 709.8236 cm +1 0 0 1 57.02362 619.8236 cm q BT 1 0 0 1 0 2.2 Tm 13.2 TL /F2 11 Tf .133333 .133333 .133333 rg (11. Three Implementations, One Language) Tj T* ET Q Q q -1 0 0 1 57.02362 695.8236 cm +1 0 0 1 57.02362 605.8236 cm Q q -1 0 0 1 57.02362 683.8236 cm +1 0 0 1 57.02362 593.8236 cm q 0 0 0 rg BT /F1 10 Tf 12 TL ET @@ -5295,19 +5321,19 @@ Q Q Q q -1 0 0 1 57.02362 683.8236 cm +1 0 0 1 57.02362 593.8236 cm Q q -1 0 0 1 57.02362 641.8236 cm +1 0 0 1 57.02362 551.8236 cm q BT 1 0 0 1 0 26 Tm 1.056796 Tw 12 TL /F1 10 Tf 0 0 0 rg (uncommonlisp implements R7RS Scheme in three implementations sharing the same ) Tj /F5 10 Tf (.lsp) Tj /F1 10 Tf ( test files. The) Tj T* 0 Tw .643241 Tw (language is Scheme \(a dialect of Lisp, designed 1975\). The project name plays on Common Lisp \227 this is) Tj T* 0 Tw (decidedly uncommon.) Tj T* ET Q Q q -1 0 0 1 57.02362 635.8236 cm +1 0 0 1 57.02362 545.8236 cm Q q -1 0 0 1 57.02362 515.8236 cm +1 0 0 1 57.02362 425.8236 cm q 1 1 1 rg n 0 120 481.2283 -30 re f* @@ -5643,52 +5669,52 @@ Q Q Q q -1 0 0 1 57.02362 515.8236 cm +1 0 0 1 57.02362 425.8236 cm Q q -1 0 0 1 57.02362 485.8236 cm +1 0 0 1 57.02362 395.8236 cm q BT 1 0 0 1 0 14 Tm 1.743453 Tw 12 TL /F1 10 Tf 0 0 0 rg (All C & Python benchmarks measured in-process \(no startup overhead\). Assembly times \(\206\) include full) Tj T* 0 Tw (process lifetime: startup + tokenizer + parser + eval. "\227" = not applicable / interpreted.) Tj T* ET Q Q q -1 0 0 1 57.02362 407.8236 cm +1 0 0 1 57.02362 317.8236 cm q BT 1 0 0 1 0 62 Tm .118138 Tw 12 TL /F3 10 Tf 0 0 0 rg (The JIT runs Scheme faster than CPython runs Python.) Tj /F1 10 Tf ( ) Tj /F5 10 Tf (ack\(3,4\)) Tj /F1 10 Tf ( completes in 0.19 ms \(JIT\) vs 1.3 ms) Tj T* 0 Tw .050491 Tw (\(CPython\) \227 7\327 faster. ) Tj /F5 10 Tf (sum-to\(50000\)) Tj /F1 10 Tf ( completes in 0.55 ms \(JIT\) vs 5.5 ms \(CPython\) \227 10\327 faster. The) Tj T* 0 Tw .368556 Tw (JIT compiles Scheme AST directly to x86_64 machine code via ) Tj /F5 10 Tf (mmap\(PROT_EXEC\)) Tj /F1 10 Tf ( & raw byte emission. It) Tj T* 0 Tw 2.31631 Tw (handles ) Tj /F5 10 Tf (if) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (cond) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (and) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (or) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (let) Tj /F1 10 Tf (, named-let loops \(native ) Tj /F5 10 Tf (jmp) Tj /F1 10 Tf ( \227 zero call overhead\), ) Tj /F5 10 Tf (car) Tj /F1 10 Tf (/) Tj /F5 10 Tf (cdr) Tj /F1 10 Tf (/) Tj /F5 10 Tf (cons) Tj /F1 10 Tf (,) Tj T* 0 Tw .786027 Tw (arithmetic, comparisons, & self-recursive calls. Functions that use ) Tj /F5 10 Tf (call/cc) Tj /F1 10 Tf (, macros, or complex forms fall) Tj T* 0 Tw (back to the interpreter.) Tj T* ET Q Q q -1 0 0 1 57.02362 293.8236 cm +1 0 0 1 57.02362 203.8236 cm q -BT 1 0 0 1 0 98 Tm .314882 Tw 12 TL /F3 10 Tf 0 0 0 rg (The assembly implementation proves the language runs on bare metal.) Tj /F1 10 Tf ( 4,968 lines of GNU assembler,) Tj T* 0 Tw .450642 Tw /F3 10 Tf (22 KB stripped binary) Tj /F1 10 Tf (, zero external dependencies. Fourteen Linux syscalls \() Tj /F5 10 Tf (read) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (write) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (open) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (close) Tj /F1 10 Tf (,) Tj T* 0 Tw .055257 Tw /F5 10 Tf (lseek) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (mmap) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (munmap) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (socket) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (connect) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (accept) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (bind) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (listen) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (clock_gettime) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (exit) Tj /F1 10 Tf (\) \227 no libc, no) Tj T* 0 Tw .278835 Tw (stdlib. A bump allocator with ) Tj /F5 10 Tf (heap-snapshot) Tj /F1 10 Tf (/) Tj /F5 10 Tf (heap-restore) Tj /F1 10 Tf ( arena primitives, tag-in-low-3-bits values, ) Tj /F3 10 Tf (91) Tj T* 0 Tw 1.425372 Tw (builtins) Tj /F1 10 Tf ( \(including ) Tj /F5 10 Tf (load) Tj /F1 10 Tf (, ports, ) Tj /F5 10 Tf (write-file) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (file-) Tj (>) Tj (string) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (portal-save) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (portal-resume) Tj /F1 10 Tf (, the six) Tj T* 0 Tw .366483 Tw /F5 10 Tf (tcp-*) Tj /F1 10 Tf ( socket primitives, ) Tj /F5 10 Tf (read-from-string) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (eval) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (symbol-) Tj (>) Tj (string) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (current-time-ms) Tj /F1 10 Tf (\), & TCO via) Tj T* 0 Tw 1.293071 Tw /F5 10 Tf (jmp) Tj /F1 10 Tf (. It runs ) Tj /F5 10 Tf (\(ack) Tj ( ) Tj (3) Tj ( ) Tj (4\)) Tj ( ) Tj (=) Tj ( ) Tj (125) Tj /F1 10 Tf ( & ) Tj /F5 10 Tf (\(fib) Tj ( ) Tj (35\)) Tj ( ) Tj (=) Tj ( ) Tj (9227465) Tj /F1 10 Tf ( correctly, serves HTTP at ) Tj /F3 10 Tf (2,994 req/s) Tj /F1 10 Tf (, and) Tj T* 0 Tw 2.179168 Tw (survives indefinitely with flat O\(1\) memory when the programmer uses the snapshot/restore arena in a) Tj T* 0 Tw (per-request loop.) Tj T* ET +BT 1 0 0 1 0 98 Tm .274168 Tw 12 TL /F3 10 Tf 0 0 0 rg (The assembly implementation proves the language runs on bare metal.) Tj /F1 10 Tf ( 4,968 lines of ) Tj /F3 10 Tf (GNU assembler) Tj T* 0 Tw .459104 Tw (\(GAS, AT) Tj (&) Tj (T syntax\)) Tj /F1 10 Tf (, ) Tj /F3 10 Tf (22 KB stripped binary) Tj /F1 10 Tf (, zero external dependencies. Fourteen Linux syscalls \() Tj /F5 10 Tf (read) Tj /F1 10 Tf (,) Tj T* 0 Tw 7.484835 Tw /F5 10 Tf (write) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (open) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (close) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (lseek) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (mmap) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (munmap) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (socket) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (connect) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (accept) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (bind) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (listen) Tj /F1 10 Tf (,) Tj T* 0 Tw 2.397122 Tw /F5 10 Tf (clock_gettime) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (exit) Tj /F1 10 Tf (\) \227 no libc, no stdlib. A bump allocator with ) Tj /F5 10 Tf (heap-snapshot) Tj /F1 10 Tf (/) Tj /F5 10 Tf (heap-restore) Tj /F1 10 Tf T* 0 Tw .123835 Tw (arena primitives, tag-in-low-3-bits values, ) Tj /F3 10 Tf (91 builtins) Tj /F1 10 Tf ( \(including ) Tj /F5 10 Tf (load) Tj /F1 10 Tf (, ports, ) Tj /F5 10 Tf (write-file) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (file-) Tj (>) Tj (string) Tj /F1 10 Tf (,) Tj T* 0 Tw 6.731043 Tw /F5 10 Tf (portal-save) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (portal-resume) Tj /F1 10 Tf (, the six ) Tj /F5 10 Tf (tcp-*) Tj /F1 10 Tf ( socket primitives, ) Tj /F5 10 Tf (read-from-string) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (eval) Tj /F1 10 Tf (,) Tj T* 0 Tw 6.946027 Tw /F5 10 Tf (symbol-) Tj (>) Tj (string) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (current-time-ms) Tj /F1 10 Tf (\), & TCO via ) Tj /F5 10 Tf (jmp) Tj /F1 10 Tf (. It runs ) Tj /F5 10 Tf (\(ack) Tj ( ) Tj (3) Tj ( ) Tj (4\)) Tj ( ) Tj (=) Tj ( ) Tj (125) Tj /F1 10 Tf ( &) Tj T* 0 Tw 2.133223 Tw /F5 10 Tf (\(fib) Tj ( ) Tj (35\)) Tj ( ) Tj (=) Tj ( ) Tj (9227465) Tj /F1 10 Tf ( correctly, serves HTTP at ) Tj /F3 10 Tf (2,994 req/s) Tj /F1 10 Tf (, and survives indefinitely with flat O\(1\)) Tj T* 0 Tw (memory when the programmer uses the snapshot/restore arena in a per-request loop.) Tj T* ET Q Q q -1 0 0 1 57.02362 239.8236 cm +1 0 0 1 57.02362 149.8236 cm q BT 1 0 0 1 0 38 Tm 2.546213 Tw 12 TL /F3 10 Tf 0 0 0 rg (The bytecode VM delivers 7--19\327 speedup over tree-walking.) Tj /F1 10 Tf ( The Python implementation compiles) Tj T* 0 Tw .411147 Tw (Scheme to 40 opcodes \(plus 20 specialized & 5 superinstructions\), executed on an explicit frame stack with) Tj T* 0 Tw 1.206213 Tw (inline caching, constant folding, & peephole optimization. Full first-class continuations \(multi-shot, upward\)) Tj T* 0 Tw (enable generators, coroutines, & machine state migration via portal.) Tj T* ET Q Q q -1 0 0 1 57.02362 213.8236 cm +1 0 0 1 57.02362 123.8236 cm q BT 1 0 0 1 0 2 Tm 12 TL /F2 10 Tf .133333 .133333 .133333 rg (11.1 Test Coverage) Tj T* ET Q Q q -1 0 0 1 57.02362 195.8236 cm +1 0 0 1 57.02362 105.8236 cm q BT 1 0 0 1 0 2 Tm 12 TL /F3 10 Tf 0 0 0 rg (975 verified assertions) Tj /F1 10 Tf ( across all implementations, all green under ) Tj /F5 10 Tf (make) Tj ( ) Tj (test-all) Tj /F1 10 Tf (:) Tj T* ET Q Q q -1 0 0 1 57.02362 189.8236 cm +1 0 0 1 57.02362 99.82362 cm Q q -1 0 0 1 57.02362 189.8236 cm +1 0 0 1 57.02362 99.82362 cm Q q -1 0 0 1 57.02362 177.8236 cm +1 0 0 1 57.02362 87.82362 cm q 0 0 0 rg BT /F1 10 Tf 12 TL ET @@ -5710,10 +5736,10 @@ Q Q Q q -1 0 0 1 57.02362 171.8236 cm +1 0 0 1 57.02362 81.82362 cm Q q -1 0 0 1 57.02362 159.8236 cm +1 0 0 1 57.02362 69.82362 cm q 0 0 0 rg BT /F1 10 Tf 12 TL ET @@ -5735,10 +5761,19 @@ Q Q Q q -1 0 0 1 57.02362 153.8236 cm +1 0 0 1 57.02362 63.82362 cm Q + +endstream +endobj +111 0 obj +<< +/Length 15915 +>> +stream +1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET q -1 0 0 1 57.02362 141.8236 cm +1 0 0 1 57.02362 753.0236 cm q 0 0 0 rg BT /F1 10 Tf 12 TL ET @@ -5760,10 +5795,10 @@ Q Q Q q -1 0 0 1 57.02362 135.8236 cm +1 0 0 1 57.02362 747.0236 cm Q q -1 0 0 1 57.02362 123.8236 cm +1 0 0 1 57.02362 735.0236 cm q 0 0 0 rg BT /F1 10 Tf 12 TL ET @@ -5785,47 +5820,38 @@ Q Q Q q -1 0 0 1 57.02362 105.8236 cm +1 0 0 1 57.02362 717.0236 cm Q q -1 0 0 1 57.02362 63.82362 cm +1 0 0 1 57.02362 675.0236 cm q BT 1 0 0 1 0 26 Tm .98631 Tw 12 TL /F1 10 Tf 0 0 0 rg (The shared functional suite matters: it runs byte-identical Scheme source through two different runtimes &) Tj T* 0 Tw .353432 Tw (compares output. Python & C agree 189 times per run. When they disagree, that tells us something specific) Tj T* 0 Tw (& actionable.) Tj T* ET Q Q - -endstream -endobj -110 0 obj -<< -/Length 15613 ->> -stream -1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET q -1 0 0 1 57.02362 741.0236 cm +1 0 0 1 57.02362 645.0236 cm q BT 1 0 0 1 0 14 Tm 3.001043 Tw 12 TL /F1 10 Tf 0 0 0 rg (Cross-implementation portal exchange is verified separately: ) Tj /F5 10 Tf (tests/portal-cross-test.sh) Tj /F1 10 Tf ( runs 9) Tj T* 0 Tw (producer\327consumer combinations. All 9 green.) Tj T* ET Q Q q -1 0 0 1 57.02362 715.0236 cm +1 0 0 1 57.02362 619.0236 cm q BT 1 0 0 1 0 2 Tm 12 TL /F2 10 Tf .133333 .133333 .133333 rg (11.2 File I/O Parity) Tj T* ET Q Q q -1 0 0 1 57.02362 685.0236 cm +1 0 0 1 57.02362 589.0236 cm q 0 0 0 rg BT 1 0 0 1 0 14 Tm /F1 10 Tf 12 TL .155596 Tw (All three implementations share the same minimal file I/O vocabulary \227 discovered necessary while building) Tj T* 0 Tw (the cross-impl portal:) Tj T* ET Q Q q -1 0 0 1 57.02362 679.0236 cm +1 0 0 1 57.02362 583.0236 cm Q q -1 0 0 1 57.02362 499.0236 cm +1 0 0 1 57.02362 403.0236 cm q 1 1 1 rg n 0 180 481.2283 -18 re f* @@ -6218,32 +6244,32 @@ Q Q Q q -1 0 0 1 57.02362 499.0236 cm +1 0 0 1 57.02362 403.0236 cm Q q -1 0 0 1 57.02362 433.0236 cm +1 0 0 1 57.02362 337.0236 cm q BT 1 0 0 1 0 50 Tm .254609 Tw 12 TL /F1 10 Tf 0 0 0 rg (The asm port representation deserves a note. Because all three tag bits are consumed by the existing value) Tj T* 0 Tw 4.102038 Tw (types \(int/pair/sym/closure/builtin/special/string/vector\), we encode ports as ) Tj /F5 10 Tf (SPECIAL) Tj /F1 10 Tf ( values ) Tj /F6 10 Tf 12 TL (\263) Tj /F1 10 Tf 12 TL ( 1000:) Tj T* 0 Tw 8.520835 Tw /F5 10 Tf (port_val) Tj ( ) Tj (=) Tj ( ) Tj (\(\(PORT_SPECIAL_BASE) Tj ( ) Tj (+) Tj ( ) Tj (fd\)) Tj ( ) Tj (<) Tj (<) Tj ( ) Tj (3\)) Tj ( ) Tj (|) Tj ( ) Tj (TAG_SPECIAL) Tj /F1 10 Tf (. Extraction is) Tj T* 0 Tw .162256 Tw /F5 10 Tf (fd) Tj ( ) Tj (=) Tj ( ) Tj (\(val) Tj ( ) Tj (>) Tj (>) Tj ( ) Tj (3\)) Tj ( ) Tj (-) Tj ( ) Tj (PORT_SPECIAL_BASE) Tj /F1 10 Tf (. ) Tj /F5 10 Tf (port?) Tj /F1 10 Tf ( is a range check. No tag expansion, no heap object,) Tj T* 0 Tw (no allocator pressure \227 the port is the file descriptor, wrapped.) Tj T* ET Q Q q -1 0 0 1 57.02362 407.0236 cm +1 0 0 1 57.02362 311.0236 cm q BT 1 0 0 1 0 2 Tm 12 TL /F2 10 Tf .133333 .133333 .133333 rg (11.3 Sockets: One HTTP Server, Three Runtimes) Tj T* ET Q Q q -1 0 0 1 57.02362 389.0236 cm +1 0 0 1 57.02362 293.0236 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Six primitives extend the file-I/O vocabulary to TCP:) Tj T* ET Q Q q -1 0 0 1 57.02362 383.0236 cm +1 0 0 1 57.02362 287.0236 cm Q q -1 0 0 1 57.02362 245.0236 cm +1 0 0 1 57.02362 149.0236 cm q 1 1 1 rg n 0 138 481.2283 -18 re f* @@ -6525,22 +6551,31 @@ Q Q Q q -1 0 0 1 57.02362 245.0236 cm +1 0 0 1 57.02362 149.0236 cm Q q -1 0 0 1 57.02362 203.0236 cm +1 0 0 1 57.02362 107.0236 cm q BT 1 0 0 1 0 26 Tm .215176 Tw 12 TL /F1 10 Tf 0 0 0 rg (Sockets share the same port representation as files \227 in asm the fd is packed into ) Tj /F5 10 Tf (SPECIAL) Tj /F1 10 Tf ( values ) Tj /F6 10 Tf 12 TL (\263) Tj /F1 10 Tf 12 TL ( 1000,) Tj T* 0 Tw .794123 Tw (in Python + C the fd lives inside an existing ULPort struct. ) Tj /F5 10 Tf (read) Tj /F1 10 Tf (/) Tj /F5 10 Tf (write) Tj /F1 10 Tf ( unify because to Linux a socket is) Tj T* 0 Tw (just an fd.) Tj T* ET Q Q q -1 0 0 1 57.02362 173.0236 cm +1 0 0 1 57.02362 77.02362 cm q BT 1 0 0 1 0 14 Tm .886796 Tw 12 TL /F5 10 Tf 0 0 0 rg (examples/http-server.lsp) Tj /F1 10 Tf ( is a 90-line HTTP/1.0 server. It parses a request line, dispatches by path,) Tj T* 0 Tw (and returns 200/404 with Content-Length. The same file runs unmodified in all three impls:) Tj T* ET Q Q + +endstream +endobj +112 0 obj +<< +/Length 10308 +>> +stream +1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET q -1 0 0 1 57.02362 123.0236 cm +1 0 0 1 57.02362 723.0236 cm q q 1 0 0 1 0 0 cm @@ -6560,25 +6595,16 @@ Q Q Q q -1 0 0 1 57.02362 79.02362 cm +1 0 0 1 57.02362 679.0236 cm q BT 1 0 0 1 0 26 Tm -0.093471 Tw 12 TL /F1 10 Tf 0 0 0 rg (The companion ) Tj /F5 10 Tf (examples/http-client-bench.lsp) Tj /F1 10 Tf ( is a 45-line load generator using only the six ) Tj /F5 10 Tf (tcp-*) Tj /F1 10 Tf T* 0 Tw 2.952577 Tw (primitives plus ) Tj /F5 10 Tf (current-time-ms) Tj /F1 10 Tf (. In-process client eliminates the ~2 ms/request fork overhead that) Tj T* 0 Tw (curl-based benchmarks suffer, so real server throughput shows through:) Tj T* ET Q Q q -1 0 0 1 57.02362 73.02362 cm +1 0 0 1 57.02362 673.0236 cm Q - -endstream -endobj -111 0 obj -<< -/Length 11041 ->> -stream -1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET q -1 0 0 1 57.02362 675.0236 cm +1 0 0 1 57.02362 583.0236 cm q 1 1 1 rg n 0 90 481.2283 -18 re f* @@ -6718,47 +6744,47 @@ Q Q Q q -1 0 0 1 57.02362 675.0236 cm +1 0 0 1 57.02362 583.0236 cm Q q -1 0 0 1 57.02362 645.0236 cm +1 0 0 1 57.02362 553.0236 cm q BT 1 0 0 1 0 14 Tm .163917 Tw 12 TL /F1 10 Tf 0 0 0 rg (\(The asm-server / asm-client pair is the fastest cell here \227 2,994 req/s from a 22 KB binary, served & driven) Tj T* 0 Tw (by the same 22 KB binary.\)) Tj T* ET Q Q q -1 0 0 1 57.02362 603.0236 cm +1 0 0 1 57.02362 511.0236 cm q BT 1 0 0 1 0 26 Tm .050596 Tw 12 TL /F1 10 Tf 0 0 0 rg (For external comparison: ) Tj /F5 10 Tf (python3) Tj ( ) Tj (-m) Tj ( ) Tj (http.server) Tj /F1 10 Tf ( and busybox httpd both land around 382 req/s under) Tj T* 0 Tw 1.458334 Tw (a curl client on the same machine. When driven by an in-process client they hit the same ceiling as our) Tj T* 0 Tw (servers \227 the bottleneck has always been the client fork/exec, not the server.) Tj T* ET Q Q q -1 0 0 1 57.02362 549.0236 cm +1 0 0 1 57.02362 457.0236 cm q BT 1 0 0 1 0 38 Tm 2.116575 Tw 12 TL /F3 10 Tf 0 0 0 rg (What's remarkable is not the speed.) Tj /F1 10 Tf ( It is that a 22 KB binary with zero libc dependency and seven) Tj T* 0 Tw .829353 Tw (canonical Linux syscalls plus the socket family runs HTTP as fast as anything else on the machine, with a) Tj T* 0 Tw .829272 Tw (protocol handler written in portable Scheme that runs byte-for-byte in all three runtimes. The asm binary is) Tj T* 0 Tw /F3 10 Tf (96\327 smaller than busybox httpd) Tj /F1 10 Tf ( \(2.1 MB\) and ) Tj /F3 10 Tf (360\327 smaller than the Python interpreter) Tj /F1 10 Tf ( alone \(8 MB\).) Tj T* ET Q Q q -1 0 0 1 57.02362 523.0236 cm +1 0 0 1 57.02362 431.0236 cm q BT 1 0 0 1 0 2 Tm 12 TL /F2 10 Tf .133333 .133333 .133333 rg (11.4 S-expressions over Sockets: RPC, REPL, and Chains) Tj T* ET Q Q q -1 0 0 1 57.02362 481.0236 cm +1 0 0 1 57.02362 389.0236 cm q 0 0 0 rg BT 1 0 0 1 0 26 Tm /F1 10 Tf 12 TL .048022 Tw (The HTTP example sends request-line bytes and response-line bytes. Those bytes don't have to be HTTP. If) Tj T* 0 Tw .199913 Tw (both sides of the wire speak Scheme, the wire protocol can be Scheme source itself \227 the reader is already) Tj T* 0 Tw (the parser you need. Two new builtins close the loop in all three impls:) Tj T* ET Q Q q -1 0 0 1 57.02362 475.0236 cm +1 0 0 1 57.02362 383.0236 cm Q q -1 0 0 1 57.02362 475.0236 cm +1 0 0 1 57.02362 383.0236 cm Q q -1 0 0 1 57.02362 463.0236 cm +1 0 0 1 57.02362 371.0236 cm q 0 0 0 rg BT /F1 10 Tf 12 TL ET @@ -6780,10 +6806,10 @@ Q Q Q q -1 0 0 1 57.02362 457.0236 cm +1 0 0 1 57.02362 365.0236 cm Q q -1 0 0 1 57.02362 433.0236 cm +1 0 0 1 57.02362 341.0236 cm q 0 0 0 rg BT /F1 10 Tf 12 TL ET @@ -6805,51 +6831,47 @@ Q Q Q q -1 0 0 1 57.02362 415.0236 cm +1 0 0 1 57.02362 323.0236 cm Q q -1 0 0 1 57.02362 397.0236 cm +1 0 0 1 57.02362 305.0236 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Two server patterns emerge:) Tj T* ET Q Q q -1 0 0 1 57.02362 355.0236 cm +1 0 0 1 57.02362 263.0236 cm q BT 1 0 0 1 0 26 Tm .027362 Tw 12 TL /F3 10 Tf 0 0 0 rg (Whitelisted RPC) Tj /F1 10 Tf ( \() Tj /F5 10 Tf (examples/rpc-server.lsp) Tj /F1 10 Tf (, 90 lines\). The server reads a request sexp, dispatches by) Tj T* 0 Tw 1.114908 Tw (car on a closed set \() Tj /F5 10 Tf (ping) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (add) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (mul) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (fib) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (echo) Tj /F1 10 Tf (\), never calls ) Tj /F5 10 Tf (eval) Tj /F1 10 Tf ( on client input. Safe by construction.) Tj T* 0 Tw (Uses ) Tj /F5 10 Tf (heap-snapshot) Tj /F1 10 Tf (/) Tj /F5 10 Tf (heap-restore) Tj /F1 10 Tf ( for O\(1\) memory on asm.) Tj T* ET Q Q q -1 0 0 1 57.02362 289.0236 cm +1 0 0 1 57.02362 197.0236 cm q BT 1 0 0 1 0 50 Tm .076027 Tw 12 TL /F3 10 Tf 0 0 0 rg (Full remote REPL) Tj /F1 10 Tf ( \() Tj /F5 10 Tf (examples/repl-server.lsp) Tj /F1 10 Tf (, 70 lines\). The server reads a request sexp and passes) Tj T* 0 Tw .534609 Tw (it straight to ) Tj /F5 10 Tf (eval) Tj /F1 10 Tf (. Persistent global env across connections; ) Tj /F5 10 Tf (\(define) Tj ( ) Tj (x) Tj ( ) Tj (42\)) Tj /F1 10 Tf ( from one call is visible from) Tj T* 0 Tw 1.463453 Tw (the next. DANGER: any reachable client can run arbitrary Scheme in-process. Deliberately does not use) Tj T* 0 Tw .876027 Tw /F5 10 Tf (heap-snapshot) Tj /F1 10 Tf ( because remote ) Tj /F5 10 Tf (define) Tj /F1 10 Tf ( adds bindings past any snapshot point; the ) Tj /F5 10 Tf (ulimit) Tj ( ) Tj (-v) Tj /F1 10 Tf ( safety) Tj T* 0 Tw (cap \(512 MB\) backstops the leak.) Tj T* ET Q Q q -1 0 0 1 57.02362 259.0236 cm +1 0 0 1 57.02362 167.0236 cm q 0 0 0 rg BT 1 0 0 1 0 14 Tm /F1 10 Tf 12 TL .909903 Tw (Both patterns run byte-identically in Python, C, and asm. The 3\3273 server\327client matrix is 9/9 green \227 any) Tj T* 0 Tw (runtime can host either side.) Tj T* ET Q Q q -1 0 0 1 57.02362 217.0236 cm +1 0 0 1 57.02362 125.0236 cm q BT 1 0 0 1 0 26 Tm 1.432577 Tw 12 TL /F3 10 Tf 0 0 0 rg (Chains: relays across runtimes.) Tj /F1 10 Tf ( A transparent relay \() Tj /F5 10 Tf (examples/rpc-relay.lsp) Tj /F1 10 Tf (, 50 lines\) accepts a) Tj T* 0 Tw 1.39989 Tw (connection, forwards the request bytes to a backend without parsing, relays the reply back. Because the) Tj T* 0 Tw (envelope is Scheme source and the relay never opens it, chains of arbitrary runtimes compose naturally:) Tj T* ET Q Q q -1 0 0 1 57.02362 211.0236 cm +1 0 0 1 57.02362 119.0236 cm Q q -1 0 0 1 57.02362 121.0236 cm +1 0 0 1 57.02362 65.02362 cm q 1 1 1 rg -n 0 90 481.2283 -18 re f* -.878431 .878431 .878431 rg -n 0 72 481.2283 -18 re f* -1 1 1 rg n 0 54 481.2283 -18 re f* .878431 .878431 .878431 rg n 0 36 481.2283 -18 re f* @@ -6858,21 +6880,21 @@ n 0 18 481.2283 -18 re f* 0 0 0 rg BT /F3 10 Tf 12 TL ET q -1 0 0 1 6 75 cm +1 0 0 1 6 39 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F3 10 Tf 12 TL 79.91699 0 Td (Chain \(200 ping requests\)) Tj T* -79.91699 0 Td ET Q Q q -1 0 0 1 300.084 75 cm +1 0 0 1 300.084 39 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F3 10 Tf 12 TL 14.11109 0 Td (Requests/s) Tj T* -14.11109 0 Td ET Q Q q -1 0 0 1 393.6562 75 cm +1 0 0 1 393.6562 39 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F3 10 Tf 12 TL 10.22609 0 Td (Per-hop cost) Tj T* -10.22609 0 Td ET @@ -6881,48 +6903,82 @@ Q 0 0 0 rg BT /F1 10 Tf 12 TL ET q -1 0 0 1 6 57 cm +1 0 0 1 6 21 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Py client ) Tj /F6 10 Tf 12 TL (\256) Tj /F1 10 Tf 12 TL ( asm backend \(1 hop\)) Tj T* ET Q Q q -1 0 0 1 300.084 57 cm +1 0 0 1 300.084 21 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (2,061) Tj T* ET Q Q q -1 0 0 1 393.6562 57 cm +1 0 0 1 393.6562 21 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (baseline) Tj T* ET Q Q q -1 0 0 1 6 39 cm +1 0 0 1 6 3 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Py client ) Tj /F6 10 Tf 12 TL (\256) Tj /F1 10 Tf 12 TL ( C relay ) Tj /F6 10 Tf 12 TL (\256) Tj /F1 10 Tf 12 TL ( asm backend \(2 hops\)) Tj T* ET Q Q q -1 0 0 1 300.084 39 cm +1 0 0 1 300.084 3 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (1,234) Tj T* ET Q Q q -1 0 0 1 393.6562 39 cm +1 0 0 1 393.6562 3 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (+605 \265s/req) Tj T* ET Q Q q +1 J +1 j +0 0 0 RG +.25 w +n 0 0 m 481.2283 0 l S +n 0 36 m 481.2283 36 l S +n 0 18 m 481.2283 18 l S +n 294.084 0 m 294.084 54 l S +n 387.6562 0 m 387.6562 54 l S +n 0 54 m 481.2283 54 l S +n 0 0 m 0 54 l S +n 481.2283 0 m 481.2283 54 l S +Q +Q +Q + +endstream +endobj +113 0 obj +<< +/Length 8111 +>> +stream +1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET +q +1 0 0 1 57.02362 729.0236 cm +q +1 1 1 rg +n 0 36 481.2283 -18 re f* +.878431 .878431 .878431 rg +n 0 18 481.2283 -18 re f* +0 0 0 rg +BT /F1 10 Tf 12 TL ET +q 1 0 0 1 6 21 cm q 0 0 0 rg @@ -6969,71 +7025,59 @@ q 1 j 0 0 0 RG .25 w -n 0 72 m 481.2283 72 l S -n 0 54 m 481.2283 54 l S n 0 36 m 481.2283 36 l S n 0 18 m 481.2283 18 l S -n 294.084 0 m 294.084 90 l S -n 387.6562 0 m 387.6562 90 l S -n 0 90 m 481.2283 90 l S +n 294.084 0 m 294.084 36 l S +n 387.6562 0 m 387.6562 36 l S +n 0 0 m 0 36 l S +n 481.2283 0 m 481.2283 36 l S n 0 0 m 481.2283 0 l S -n 0 0 m 0 90 l S -n 481.2283 0 m 481.2283 90 l S Q Q Q q -1 0 0 1 57.02362 121.0236 cm +1 0 0 1 57.02362 729.0236 cm Q q -1 0 0 1 57.02362 67.02362 cm +1 0 0 1 57.02362 675.0236 cm q BT 1 0 0 1 0 38 Tm 1.815464 Tw 12 TL /F1 10 Tf 0 0 0 rg (Each relay hop costs ~650 \265s \(one full TCP round-trip + context switches on the same host, no actual) Tj T* 0 Tw 5.709882 Tw (parsing work\). The relay never allocates anything beyond a transient buffer; on asm it uses) Tj T* 0 Tw 1.25985 Tw /F5 10 Tf (heap-snapshot) Tj /F1 10 Tf (/) Tj /F5 10 Tf (heap-restore) Tj /F1 10 Tf ( to keep memory flat under load. Four runtimes strung together through) Tj T* 0 Tw (two relay machines, the same ) Tj /F5 10 Tf (.lsp) Tj /F1 10 Tf ( on every hop.) Tj T* ET Q Q - -endstream -endobj -112 0 obj -<< -/Length 7018 ->> -stream -1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET q -1 0 0 1 57.02362 729.0236 cm +1 0 0 1 57.02362 633.0236 cm q 0 0 0 rg BT 1 0 0 1 0 26 Tm /F1 10 Tf 12 TL .921575 Tw (The result is not a performance story \227 it is a composition story. S-expressions are the envelope and the) Tj T* 0 Tw .649925 Tw (payload. A 22 KB binary can be a backend, a relay, a client, or any point in a chain; the protocol needs no) Tj T* 0 Tw (separate definition because the protocol IS the language.) Tj T* ET Q Q q -1 0 0 1 57.02362 703.0236 cm +1 0 0 1 57.02362 607.0236 cm q BT 1 0 0 1 0 2 Tm 12 TL /F2 10 Tf .133333 .133333 .133333 rg (11.5 Portal over HTTP: State Transfer Between Machines) Tj T* ET Q Q q -1 0 0 1 57.02362 661.0236 cm +1 0 0 1 57.02362 565.0236 cm q 0 0 0 rg BT 1 0 0 1 0 26 Tm /F1 10 Tf 12 TL .273647 Tw (The HTTP server carries request bytes. The portal serializes machine state to bytes. Combine them: a node) Tj T* 0 Tw .711667 Tw (exposes its state as an HTTP endpoint, another node pulls that endpoint down and resumes. This was the) Tj T* 0 Tw (first item in \24713 Future Work \227 it is now a running demo.) Tj T* ET Q Q q -1 0 0 1 57.02362 619.0236 cm +1 0 0 1 57.02362 523.0236 cm q BT 1 0 0 1 0 26 Tm .363486 Tw 12 TL /F5 10 Tf 0 0 0 rg (examples/portal-http-server.lsp) Tj /F1 10 Tf ( holds some state \(integer counter, list, string, the result of fib\(30\)\)) Tj T* 0 Tw 1.391223 Tw (and answers ) Tj /F5 10 Tf (GET) Tj ( ) Tj (/portal) Tj /F1 10 Tf ( with an S-expression portal body \227 literally a sequence of ) Tj /F5 10 Tf (\(define) Tj ( ) Tj (...\)) Tj /F1 10 Tf T* 0 Tw (forms.) Tj T* ET Q Q q -1 0 0 1 57.02362 577.0236 cm +1 0 0 1 57.02362 481.0236 cm q BT 1 0 0 1 0 26 Tm 1.574395 Tw 12 TL /F5 10 Tf 0 0 0 rg (examples/portal-http-client.lsp) Tj /F1 10 Tf ( dials the endpoint, strips the HTTP headers, splits the body by) Tj T* 0 Tw 2.070759 Tw (newline, and for each non-empty, non-comment line calls ) Tj /F5 10 Tf (\(eval) Tj ( ) Tj (\(read-from-string) Tj ( ) Tj (line\)\)) Tj /F1 10 Tf (. The) Tj T* 0 Tw (remote bindings become local.) Tj T* ET Q Q q -1 0 0 1 57.02362 440.6236 cm +1 0 0 1 57.02362 344.6236 cm q q 1 0 0 1 0 0 cm @@ -7053,32 +7097,32 @@ Q Q Q q -1 0 0 1 57.02362 384.6236 cm +1 0 0 1 57.02362 288.6236 cm q BT 1 0 0 1 0 38 Tm .351019 Tw 12 TL /F3 10 Tf 0 0 0 rg (3\3273 matrix green:) Tj /F1 10 Tf ( Python/C/asm in any role \227 server or client or both \227 exchange state correctly. All nine) Tj T* 0 Tw 2.399835 Tw (combinations verified. ) Tj /F5 10 Tf (examples/portal-http-client.lsp) Tj /F1 10 Tf ( is 90 lines of portable Scheme; the full) Tj T* 0 Tw 3.611529 Tw (round-trip uses only the six ) Tj /F5 10 Tf (tcp-*) Tj /F1 10 Tf ( primitives plus ) Tj /F5 10 Tf (read-from-string) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (eval) Tj /F1 10 Tf (, and standard string) Tj T* 0 Tw (manipulation.) Tj T* ET Q Q q -1 0 0 1 57.02362 330.6236 cm +1 0 0 1 57.02362 234.6236 cm q BT 1 0 0 1 0 38 Tm 1.468556 Tw 12 TL /F1 10 Tf 0 0 0 rg (The client needs ) Tj /F5 10 Tf (eval) Tj /F1 10 Tf ( semantics that install define-bindings in the global env regardless of the dynamic) Tj T* 0 Tw .000439 Tw (scope of the ) Tj /F5 10 Tf (eval) Tj /F1 10 Tf ( call. Python and C originally evaluated the ) Tj /F5 10 Tf (eval) Tj /F1 10 Tf ( result in the caller's env, which worked at) Tj T* 0 Tw .282545 Tw (top level but silently failed inside a helper function. A two-line fix in each \() Tj /F5 10 Tf (env) Tj ( ) Tj (=) Tj ( ) Tj (env.g) Tj /F1 10 Tf ( in Python's ) Tj /F5 10 Tf (leval) Tj /F1 10 Tf (,) Tj T* 0 Tw /F5 10 Tf (env) Tj ( ) Tj (=) Tj ( ) Tj (env-) Tj (>) Tj (global) Tj /F1 10 Tf ( in C's SYM_EVAL branch\) aligns both with asm's long-standing ) Tj /F5 10 Tf (bi_eval) Tj /F1 10 Tf ( behavior.) Tj T* ET Q Q q -1 0 0 1 57.02362 300.6236 cm +1 0 0 1 57.02362 204.6236 cm q 0 0 0 rg BT 1 0 0 1 0 14 Tm /F1 10 Tf 12 TL 3.231772 Tw (This is the closing demonstration of "feedback is all you need" extended across all four scopes. A) Tj T* 0 Tw (continuation-style value \227 here, a set of bindings \227 travels:) Tj T* ET Q Q q -1 0 0 1 57.02362 294.6236 cm +1 0 0 1 57.02362 198.6236 cm Q q -1 0 0 1 57.02362 294.6236 cm +1 0 0 1 57.02362 198.6236 cm Q q -1 0 0 1 57.02362 282.6236 cm +1 0 0 1 57.02362 186.6236 cm q 0 0 0 rg BT /F1 10 Tf 12 TL ET @@ -7100,10 +7144,10 @@ Q Q Q q -1 0 0 1 57.02362 276.6236 cm +1 0 0 1 57.02362 180.6236 cm Q q -1 0 0 1 57.02362 264.6236 cm +1 0 0 1 57.02362 168.6236 cm q 0 0 0 rg BT /F1 10 Tf 12 TL ET @@ -7126,10 +7170,10 @@ Q Q Q q -1 0 0 1 57.02362 258.6236 cm +1 0 0 1 57.02362 162.6236 cm Q q -1 0 0 1 57.02362 246.6236 cm +1 0 0 1 57.02362 150.6236 cm q 0 0 0 rg BT /F1 10 Tf 12 TL ET @@ -7152,10 +7196,10 @@ Q Q Q q -1 0 0 1 57.02362 240.6236 cm +1 0 0 1 57.02362 144.6236 cm Q q -1 0 0 1 57.02362 228.6236 cm +1 0 0 1 57.02362 132.6236 cm q 0 0 0 rg BT /F1 10 Tf 12 TL ET @@ -7178,45 +7222,45 @@ Q Q Q q -1 0 0 1 57.02362 210.6236 cm +1 0 0 1 57.02362 114.6236 cm Q q -1 0 0 1 57.02362 180.6236 cm +1 0 0 1 57.02362 84.62362 cm q 0 0 0 rg BT 1 0 0 1 0 14 Tm /F1 10 Tf 12 TL .68135 Tw (The wire protocol and the language are the same artifact. A 22 KB binary can be any node in any chain of) Tj T* 0 Tw (any scope.) Tj T* ET Q Q + +endstream +endobj +114 0 obj +<< +/Length 6606 +>> +stream +1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET q -1 0 0 1 57.02362 154.6236 cm +1 0 0 1 57.02362 753.0236 cm q BT 1 0 0 1 0 2 Tm 12 TL /F2 10 Tf .133333 .133333 .133333 rg (11.6 heap-snapshot: The Arena Escape Hatch) Tj T* ET Q Q q -1 0 0 1 57.02362 112.6236 cm +1 0 0 1 57.02362 711.0236 cm q BT 1 0 0 1 0 26 Tm -0.12705 Tw 12 TL /F1 10 Tf 0 0 0 rg (The asm bump allocator has no GC. Every ) Tj /F5 10 Tf (string-append) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (tcp-recv) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (make-pair) Tj /F1 10 Tf (, or similar per-request) Tj T* 0 Tw 1.173647 Tw (allocation grows r15. Over a long-running server that is an unbounded leak \227 an incident on 2026-04-16) Tj T* 0 Tw (drove an asm server to 19.3 GB RSS before being killed.) Tj T* ET Q Q q -1 0 0 1 57.02362 94.62362 cm +1 0 0 1 57.02362 693.0236 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Two new builtins fix this without introducing a collector:) Tj T* ET Q Q - -endstream -endobj -113 0 obj -<< -/Length 5737 ->> -stream -1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET q -1 0 0 1 57.02362 732.6236 cm +1 0 0 1 57.02362 652.6236 cm q q 1 0 0 1 0 0 cm @@ -7236,21 +7280,21 @@ Q Q Q q -1 0 0 1 57.02362 700.6236 cm +1 0 0 1 57.02362 620.6236 cm q 0 0 0 rg BT 1 0 0 1 0 14 Tm /F1 10 Tf 12 TL .828138 Tw (Python + C expose the same names as no-ops \(their real GCs already handle this\). Portable Scheme can) Tj T* 0 Tw (call them unconditionally.) Tj T* ET Q Q q -1 0 0 1 57.02362 682.6236 cm +1 0 0 1 57.02362 602.6236 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (The pattern is narrow by design:) Tj T* ET Q Q q -1 0 0 1 57.02362 613.4236 cm +1 0 0 1 57.02362 533.4236 cm q q 1 0 0 1 0 0 cm @@ -7271,52 +7315,73 @@ Q Q Q q -1 0 0 1 57.02362 557.4236 cm +1 0 0 1 57.02362 477.4236 cm q 0 0 0 rg BT 1 0 0 1 0 38 Tm /F1 10 Tf 12 TL .76989 Tw (The snapshot is dangerously precise: anything allocated after the snap and still reachable after the restore) Tj T* 0 Tw -0.00705 Tw (becomes a dangling pointer. The canonical pattern \(HTTP request scope\) allocates per-request and discards) Tj T* 0 Tw 1.660522 Tw (per-request \227 nothing escapes. Measured asm RSS with this pattern: 88 KB initial, 100 KB after 1,100) Tj T* 0 Tw (requests. Flat.) Tj T* ET Q Q q -1 0 0 1 57.02362 515.4236 cm +1 0 0 1 57.02362 435.4236 cm q 0 0 0 rg BT 1 0 0 1 0 26 Tm /F1 10 Tf 12 TL .241019 Tw (This is not a general-purpose allocator. It is an escape hatch the programmer uses when they can prove the) Tj T* 0 Tw 1.593647 Tw (scope boundary. For general programs on asm, the heap still grows. For the HTTP server pattern, O\(1\)) Tj T* 0 Tw (memory costs two lines of code.) Tj T* ET Q Q q -1 0 0 1 57.02362 484.2236 cm +1 0 0 1 57.02362 404.2236 cm q BT 1 0 0 1 0 2.2 Tm 13.2 TL /F2 11 Tf .133333 .133333 .133333 rg (12. MOAD Audit: Fixing What We Built) Tj T* ET Q Q q -1 0 0 1 57.02362 464.2236 cm +1 0 0 1 57.02362 384.2236 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (We scanned all three implementations for the five MOADs. Every project contains its own sediment.) Tj T* ET Q Q q -1 0 0 1 57.02362 438.2236 cm +1 0 0 1 57.02362 294.2236 cm +q +BT 1 0 0 1 0 74 Tm 7.459168 Tw 12 TL /F3 10 Tf 0 0 0 rg (Standard: what the Lean EML proof sets.) Tj /F1 10 Tf ( \2478 documents a formal Lean 4 proof that) Tj T* 0 Tw .542844 Tw /F5 10 Tf (eml\(x,) Tj ( ) Tj (y\)) Tj ( ) Tj (=) Tj ( ) Tj (exp\(x\)) Tj ( ) Tj (-) Tj ( ) Tj (ln\(y\)) Tj /F1 10 Tf ( generates every elementary function \227 and that the proof is 40\327 faster) Tj T* 0 Tw .55131 Tw (than the brute-force numerical verification it replaced. That speedup is the MOAD-0001 story in microcosm:) Tj T* 0 Tw 1.171667 Tw (algebraic understanding beats O\(N\262\) search, at the proof layer just like at every other layer. We take that) Tj T* 0 Tw .048417 Tw (standard as the bar for the implementations too. Every hot path should be fast for a ) Tj /F4 10 Tf (reason) Tj /F1 10 Tf ( \(a hash, a cache,) Tj T* 0 Tw -0.019034 Tw (an O\(1\) invariant\), not because a test didn't happen to hit the slow case. Every behavior should be correct for) Tj T* 0 Tw (a reason, not by coincidence. The audit below is where we hold ourselves to that bar.) Tj T* ET +Q +Q +q +1 0 0 1 57.02362 180.2236 cm +q +BT 1 0 0 1 0 98 Tm 1.954609 Tw 12 TL /F1 10 Tf 0 0 0 rg (We also ran the unmoad scanner on the full tree at each release. Most recent scan \(2026-04-17, post) Tj T* 0 Tw .255223 Tw (portal-over-HTTP\): 18 HIGH MOAD-0001 candidates in C and 4 MOAD-0003 candidates in Python. All 18 C) Tj T* 0 Tw 1.186796 Tw (candidates inspected individually turn out to be false positives \227 one-shot option parsing, bounded-depth) Tj T* 0 Tw .330596 Tw (ancestor walks, hash bucket chain walks \(already O\(1\) amortized\), or static 6-element tables \(e.g. ) Tj /F5 10 Tf (#\\space) Tj /F1 10 Tf T* 0 Tw 3.004862 Tw (char-literal names\). The 4 Python MOAD-0003 candidates are scanner misfires on a non-ContextVar) Tj T* 0 Tw 6.764835 Tw /F5 10 Tf (Env.set\(\)) Tj /F1 10 Tf ( method. New-work-introduced MOAD-0001: ) Tj /F3 10 Tf (zero) Tj /F1 10 Tf (. The defects fixed in this paper) Tj T* 0 Tw 2.914587 Tw (\() Tj /F5 10 Tf (intern_symbol) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (_define_record_type) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (bi_string_replace) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (_tokenize_lines) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (Env.lookup) Tj /F1 10 Tf T* 0 Tw 1.773223 Tw (shortcut\) were all surfaced by other pressures \227 benchmarks, crashes, portal exchanges \227 not by the) Tj T* 0 Tw (scanner. The scanner remains a second line; the first line is building with understanding.) Tj T* ET +Q +Q +q +1 0 0 1 57.02362 154.2236 cm q BT 1 0 0 1 0 2 Tm 12 TL /F2 10 Tf .133333 .133333 .133333 rg (12.1 MOAD-0001: The Sedimentary Defect in Our Own Code) Tj T* ET Q Q q -1 0 0 1 57.02362 396.2236 cm +1 0 0 1 57.02362 112.2236 cm q BT 1 0 0 1 0 26 Tm 1.195596 Tw 12 TL /F1 10 Tf 0 0 0 rg (The assembly interpreter's ) Tj /F5 10 Tf (intern_symbol) Tj /F1 10 Tf ( used a linear scan through all interned symbols \227 O\(N\) per) Tj T* 0 Tw .024897 Tw (lookup, O\(N\262\) over a program's lifetime. For a program defining 34 builtins plus user symbols, every ) Tj /F5 10 Tf (define) Tj /F1 10 Tf (,) Tj T* 0 Tw (every lambda parameter, every variable reference walked the entire table.) Tj T* ET Q Q q -1 0 0 1 57.02362 378.2236 cm +1 0 0 1 57.02362 94.22362 cm q BT 1 0 0 1 0 2 Tm 12 TL /F3 10 Tf 0 0 0 rg (Before \(linear scan\)) Tj /F1 10 Tf (:) Tj T* ET Q Q + +endstream +endobj +115 0 obj +<< +/Length 8114 +>> +stream +1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET q -1 0 0 1 57.02362 280.2236 cm +1 0 0 1 57.02362 675.0236 cm q q 1 0 0 1 0 0 cm @@ -7337,13 +7402,13 @@ Q Q Q q -1 0 0 1 57.02362 260.2236 cm +1 0 0 1 57.02362 655.0236 cm q BT 1 0 0 1 0 2 Tm 12 TL /F3 10 Tf 0 0 0 rg (After \(djb2 hash table, 1024 buckets\)) Tj /F1 10 Tf (:) Tj T* ET Q Q q -1 0 0 1 57.02362 181.4236 cm +1 0 0 1 57.02362 576.2236 cm q q 1 0 0 1 0 0 cm @@ -7363,41 +7428,32 @@ Q Q Q q -1 0 0 1 57.02362 125.4236 cm +1 0 0 1 57.02362 520.2236 cm q BT 1 0 0 1 0 38 Tm .721772 Tw 12 TL /F1 10 Tf 0 0 0 rg (The fix: 99 lines changed, 1024-bucket hash table with chaining. ) Tj /F3 10 Tf (2.9x faster) Tj /F1 10 Tf ( on a 2000-symbol stress test.) Tj T* 0 Tw 2.453719 Tw (On benchmarks with fewer symbols \() Tj /F5 10 Tf (ack) Tj /F1 10 Tf (, ) Tj /F5 10 Tf (fib) Tj /F1 10 Tf (\), the improvement is modest \(15% on ) Tj /F5 10 Tf (sum-to\(50k\)) Tj /F1 10 Tf (\),) Tj T* 0 Tw 1.940417 Tw (because the linear scan was already fast at small N. The fix pays off at scale \227 the same pattern as) Tj T* 0 Tw (MOAD-0001 everywhere: invisible at small inputs, catastrophic at large ones.) Tj T* ET Q Q q -1 0 0 1 57.02362 95.42362 cm +1 0 0 1 57.02362 490.2236 cm q BT 1 0 0 1 0 14 Tm 1.423486 Tw 12 TL /F1 10 Tf 0 0 0 rg (The Python implementation had a similar defect: ) Tj /F5 10 Tf (_define_record_type) Tj /F1 10 Tf ( used ) Tj /F5 10 Tf (list.index\(\)) Tj /F1 10 Tf ( for field) Tj T* 0 Tw (lookup. Replaced with a dict. O\(N\) ) Tj /F6 10 Tf 12 TL (\256) Tj /F1 10 Tf 12 TL ( O\(1\).) Tj T* ET Q Q q -1 0 0 1 57.02362 65.42362 cm +1 0 0 1 57.02362 460.2236 cm q 0 0 0 rg BT 1 0 0 1 0 14 Tm /F3 10 Tf 12 TL 1.554556 Tw (Two more MOAD-0001 defects surfaced during the HTTP server work and were fixed in the same) Tj T* 0 Tw (pass:) Tj T* ET Q Q q -1 0 0 1 57.02362 62.69291 cm -Q - -endstream -endobj -114 0 obj -<< -/Length 8222 ->> -stream -1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET -q -1 0 0 1 57.02362 765.0236 cm +1 0 0 1 57.02362 454.2236 cm Q q -1 0 0 1 57.02362 729.0236 cm +1 0 0 1 57.02362 454.2236 cm +Q +q +1 0 0 1 57.02362 418.2236 cm q 0 0 0 rg BT /F1 10 Tf 12 TL ET @@ -7419,10 +7475,10 @@ Q Q Q q -1 0 0 1 57.02362 723.0236 cm +1 0 0 1 57.02362 412.2236 cm Q q -1 0 0 1 57.02362 687.0236 cm +1 0 0 1 57.02362 376.2236 cm q 0 0 0 rg BT /F1 10 Tf 12 TL ET @@ -7444,42 +7500,42 @@ Q Q Q q -1 0 0 1 57.02362 669.0236 cm +1 0 0 1 57.02362 358.2236 cm Q q -1 0 0 1 57.02362 579.0236 cm +1 0 0 1 57.02362 268.2236 cm q BT 1 0 0 1 0 74 Tm 4.926213 Tw 12 TL /F1 10 Tf 0 0 0 rg (A third correctness fix landed after the portal-over-HTTP demo exposed it: ) Tj /F5 10 Tf (uncommonlisp.py) Tj /F1 10 Tf ('s) Tj T* 0 Tw .515223 Tw /F5 10 Tf (Env.lookup) Tj /F1 10 Tf ( used to short-cut from the local frame directly to the global frame before walking intermediate) Tj T* 0 Tw 1.47713 Tw (parents. That was fast but wrong \227 a let-loop parameter named the same as a global builtin \() Tj /F5 10 Tf (count) Tj /F1 10 Tf (, a) Tj T* 0 Tw .409897 Tw (SRFI-1 procedure\) got shadowed in reverse, the shortcut returned the global builtin instead of walking up to) Tj T* 0 Tw .07402 Tw (the loop's parameter frame. Fix: walk ) Tj /F5 10 Tf (self) Tj ( ) Tj /F6 10 Tf 12 TL (\256) Tj /F5 10 Tf 12 TL ( ) Tj (self.p) Tj ( ) Tj /F6 10 Tf 12 TL (\256) Tj /F5 10 Tf 12 TL ( ) Tj (...) Tj ( ) Tj /F6 10 Tf 12 TL (\256) Tj /F5 10 Tf 12 TL ( ) Tj (global) Tj /F1 10 Tf ( in order, without any shortcut.) Tj T* 0 Tw 1.17189 Tw (The inline cache at ) Tj /F5 10 Tf (OP_LOOKUP) Tj /F1 10 Tf ( was correspondingly tightened to validate the full chain before firing. 975) Tj T* 0 Tw (tests remained green.) Tj T* ET Q Q q -1 0 0 1 57.02362 561.0236 cm +1 0 0 1 57.02362 250.2236 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (Every release audit surfaces more. Writing new code is writing new sediment, unless the audit runs.) Tj T* ET Q Q q -1 0 0 1 57.02362 535.0236 cm +1 0 0 1 57.02362 224.2236 cm q BT 1 0 0 1 0 2 Tm 12 TL /F2 10 Tf .133333 .133333 .133333 rg (12.2 MOAD-0002: The Intertangle in Our Own Design) Tj T* ET Q Q q -1 0 0 1 57.02362 517.0236 cm +1 0 0 1 57.02362 206.2236 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (All three implementations share mutable global state between subsystems:) Tj T* ET Q Q q -1 0 0 1 57.02362 511.0236 cm +1 0 0 1 57.02362 200.2236 cm Q q -1 0 0 1 57.02362 511.0236 cm +1 0 0 1 57.02362 200.2236 cm Q q -1 0 0 1 57.02362 463.0236 cm +1 0 0 1 57.02362 152.2236 cm q 0 0 0 rg BT /F1 10 Tf 12 TL ET @@ -7501,10 +7557,10 @@ Q Q Q q -1 0 0 1 57.02362 457.0236 cm +1 0 0 1 57.02362 146.2236 cm Q q -1 0 0 1 57.02362 421.0236 cm +1 0 0 1 57.02362 110.2236 cm q 0 0 0 rg BT /F1 10 Tf 12 TL ET @@ -7526,10 +7582,10 @@ Q Q Q q -1 0 0 1 57.02362 415.0236 cm +1 0 0 1 57.02362 104.2236 cm Q q -1 0 0 1 57.02362 379.0236 cm +1 0 0 1 57.02362 68.22362 cm q 0 0 0 rg BT /F1 10 Tf 12 TL ET @@ -7551,25 +7607,34 @@ Q Q Q q -1 0 0 1 57.02362 361.0236 cm +1 0 0 1 57.02362 62.69291 cm Q + +endstream +endobj +116 0 obj +<< +/Length 7991 +>> +stream +1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET q -1 0 0 1 57.02362 319.0236 cm +1 0 0 1 57.02362 729.0236 cm q BT 1 0 0 1 0 26 Tm .770556 Tw 12 TL /F1 10 Tf 0 0 0 rg (We documented these rather than refactoring them. In each case, the coupling exists for performance \(the) Tj T* 0 Tw .79631 Tw (globals are on hot paths\) or necessity \() Tj /F5 10 Tf (setjmp) Tj /F1 10 Tf ( requires thread-local state\). The documentation makes the) Tj T* 0 Tw (coupling visible so future work can decouple selectively.) Tj T* ET Q Q q -1 0 0 1 57.02362 293.0236 cm +1 0 0 1 57.02362 703.0236 cm q BT 1 0 0 1 0 2 Tm 12 TL /F2 10 Tf .133333 .133333 .133333 rg (12.3 Our Shared Infrastructure) Tj T* ET Q Q q -1 0 0 1 57.02362 281.0236 cm +1 0 0 1 57.02362 691.0236 cm Q q -1 0 0 1 57.02362 269.0236 cm +1 0 0 1 57.02362 679.0236 cm q 0 0 0 rg BT /F1 10 Tf 12 TL ET @@ -7585,50 +7650,41 @@ Q Q Q q -1 0 0 1 57.02362 269.0236 cm +1 0 0 1 57.02362 679.0236 cm Q q -1 0 0 1 57.02362 215.0236 cm +1 0 0 1 57.02362 625.0236 cm q BT 1 0 0 1 0 38 Tm 1.468917 Tw 12 TL /F1 10 Tf 0 0 0 rg (Every MOAD we fixed in our own code is a MOAD we understand better when we find it in others. The) Tj T* 0 Tw 3.534168 Tw (sedimentary defect in ) Tj /F5 10 Tf (intern_symbol) Tj /F1 10 Tf ( is the same pattern as the sedimentary defect in Lean 4's) Tj T* 0 Tw .17985 Tw /F5 10 Tf (check_duplicated_univ_params) Tj /F1 10 Tf (. The intertangle in our global environment register is the same pattern) Tj T* 0 Tw (as the intertangle in any system that routes state through implicit globals instead of explicit parameters.) Tj T* ET Q Q q -1 0 0 1 57.02362 149.0236 cm +1 0 0 1 57.02362 559.0236 cm q BT 1 0 0 1 0 50 Tm 1.036556 Tw 12 TL /F3 10 Tf 0 0 0 rg (Our infrastructure does not extract rent from workaholics to feed gluttons.) Tj /F1 10 Tf ( A symbol table that does) Tj T* 0 Tw .025176 Tw (O\(N\) work per lookup is a workaholic node \227 it does more work than necessary on every operation, and that) Tj T* 0 Tw .250642 Tw (cost compounds through every downstream consumer. Fixing it reduces stress on our shared computational) Tj T* 0 Tw .385785 Tw (heart. The CPU cycles saved are cycles available for the next lambda, the next continuation, the next portal) Tj T* 0 Tw (resume.) Tj T* ET Q Q q -1 0 0 1 57.02362 107.0236 cm +1 0 0 1 57.02362 517.0236 cm q 0 0 0 rg BT 1 0 0 1 0 26 Tm /F1 10 Tf 12 TL 3.447739 Tw (This is the permacomputer obligation: infrastructure that renews itself. Code that gets faster as we) Tj T* 0 Tw .462545 Tw (understand it better. A hash table is not an optimization \227 it is the removal of unnecessary suffering from a) Tj T* 0 Tw (system that deserves better.) Tj T* ET Q Q - -endstream -endobj -115 0 obj -<< -/Length 8475 ->> -stream -1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET q -1 0 0 1 57.02362 751.8236 cm +1 0 0 1 57.02362 485.8236 cm q BT 1 0 0 1 0 2.2 Tm 13.2 TL /F2 11 Tf .133333 .133333 .133333 rg (13. Future Work) Tj T* ET Q Q q -1 0 0 1 57.02362 737.8236 cm +1 0 0 1 57.02362 471.8236 cm Q q -1 0 0 1 57.02362 737.8236 cm +1 0 0 1 57.02362 471.8236 cm Q q -1 0 0 1 57.02362 713.8236 cm +1 0 0 1 57.02362 447.8236 cm q 0 0 0 rg BT /F1 10 Tf 12 TL ET @@ -7650,10 +7706,10 @@ Q Q Q q -1 0 0 1 57.02362 707.8236 cm +1 0 0 1 57.02362 441.8236 cm Q q -1 0 0 1 57.02362 671.8236 cm +1 0 0 1 57.02362 405.8236 cm q 0 0 0 rg BT /F1 10 Tf 12 TL ET @@ -7675,10 +7731,10 @@ Q Q Q q -1 0 0 1 57.02362 665.8236 cm +1 0 0 1 57.02362 399.8236 cm Q q -1 0 0 1 57.02362 641.8236 cm +1 0 0 1 57.02362 375.8236 cm q 0 0 0 rg BT /F1 10 Tf 12 TL ET @@ -7700,10 +7756,10 @@ Q Q Q q -1 0 0 1 57.02362 635.8236 cm +1 0 0 1 57.02362 369.8236 cm Q q -1 0 0 1 57.02362 611.8236 cm +1 0 0 1 57.02362 345.8236 cm q 0 0 0 rg BT /F1 10 Tf 12 TL ET @@ -7725,10 +7781,10 @@ Q Q Q q -1 0 0 1 57.02362 605.8236 cm +1 0 0 1 57.02362 339.8236 cm Q q -1 0 0 1 57.02362 581.8236 cm +1 0 0 1 57.02362 315.8236 cm q 0 0 0 rg BT /F1 10 Tf 12 TL ET @@ -7750,10 +7806,10 @@ Q Q Q q -1 0 0 1 57.02362 575.8236 cm +1 0 0 1 57.02362 309.8236 cm Q q -1 0 0 1 57.02362 563.8236 cm +1 0 0 1 57.02362 297.8236 cm q 0 0 0 rg BT /F1 10 Tf 12 TL ET @@ -7775,10 +7831,10 @@ Q Q Q q -1 0 0 1 57.02362 557.8236 cm +1 0 0 1 57.02362 291.8236 cm Q q -1 0 0 1 57.02362 545.8236 cm +1 0 0 1 57.02362 279.8236 cm q 0 0 0 rg BT /F1 10 Tf 12 TL ET @@ -7800,61 +7856,76 @@ Q Q Q q -1 0 0 1 57.02362 527.8236 cm +1 0 0 1 57.02362 261.8236 cm Q q -1 0 0 1 57.02362 496.6236 cm +1 0 0 1 57.02362 230.6236 cm q BT 1 0 0 1 0 2.2 Tm 13.2 TL /F2 11 Tf .133333 .133333 .133333 rg (14. The Defect in the Model) Tj T* ET Q Q q -1 0 0 1 57.02362 476.6236 cm +1 0 0 1 57.02362 210.6236 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (This paper is evidence of a problem that extends beyond any single codebase.) Tj T* ET Q Q q -1 0 0 1 57.02362 410.6236 cm +1 0 0 1 57.02362 144.6236 cm q BT 1 0 0 1 0 50 Tm .653022 Tw 12 TL /F1 10 Tf 0 0 0 rg (On April 4, 2026, ) Tj 0 .4 .6 rg (russell@unturf) Tj 0 0 0 rg ( published ) Tj 0 .4 .6 rg ("Stress on Our Shared Heart") Tj 0 0 0 rg ( \227 a systematic analysis of 1,264) Tj T* 0 Tw .998334 Tw (MOAD defects across 60+ ecosystems, 18 programming languages, with 919 patches written. The central) Tj T* 0 Tw 2.218835 Tw (finding: O\(N\262\) sedimentary defects compound across architectural layers, creating invisible performance) Tj T* 0 Tw .27131 Tw (taxation on every downstream consumer. A single bottleneck multiplies against every other bottleneck in the) Tj T* 0 Tw (dependency chain.) Tj T* ET Q Q q -1 0 0 1 57.02362 380.6236 cm +1 0 0 1 57.02362 114.6236 cm q 0 0 0 rg BT 1 0 0 1 0 14 Tm /F1 10 Tf 12 TL 2.113022 Tw (On April 13--14, 2026 \227 nine days later \227 the machine learning agent that built uncommonlisp wrote) Tj T* 0 Tw (MOAD-0001 into fresh code. Twice.) Tj T* ET Q Q q -1 0 0 1 57.02362 314.6236 cm +1 0 0 1 57.02362 72.62362 cm q -BT 1 0 0 1 0 50 Tm 1.989873 Tw 12 TL /F5 10 Tf 0 0 0 rg (intern_symbol) Tj /F1 10 Tf ( in the assembly implementation: a linear scan through all interned symbols. O\(N\) per) Tj T* 0 Tw 1.841147 Tw (lookup. The exact pattern described in "Stress on Our Shared Heart." The exact pattern the agent was) Tj T* 0 Tw 3.328647 Tw (explicitly instructed to avoid. The agent had the full MOAD taxonomy in its context window. It had) Tj T* 0 Tw 2.822739 Tw /F5 10 Tf (BLACKOPS.md) Tj /F1 10 Tf ( defining all five MOADs. It had the undefect.com mission statement. And it still wrote) Tj T* 0 Tw /F5 10 Tf (jmp) Tj ( ) Tj (.isym_search) Tj /F1 10 Tf ( instead of a hash table.) Tj T* ET +BT 1 0 0 1 0 26 Tm 1.989873 Tw 12 TL /F5 10 Tf 0 0 0 rg (intern_symbol) Tj /F1 10 Tf ( in the assembly implementation: a linear scan through all interned symbols. O\(N\) per) Tj T* 0 Tw 1.841147 Tw (lookup. The exact pattern described in "Stress on Our Shared Heart." The exact pattern the agent was) Tj T* 0 Tw 3.328647 Tw (explicitly instructed to avoid. The agent had the full MOAD taxonomy in its context window. It had) Tj T* 0 Tw ET +Q +Q + +endstream +endobj +117 0 obj +<< +/Length 6727 +>> +stream +1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET +q +1 0 0 1 57.02362 741.0236 cm +q +BT 1 0 0 1 0 14 Tm 2.822739 Tw 12 TL /F5 10 Tf 0 0 0 rg (BLACKOPS.md) Tj /F1 10 Tf ( defining all five MOADs. It had the undefect.com mission statement. And it still wrote) Tj T* 0 Tw /F5 10 Tf (jmp) Tj ( ) Tj (.isym_search) Tj /F1 10 Tf ( instead of a hash table.) Tj T* ET Q Q q -1 0 0 1 57.02362 284.6236 cm +1 0 0 1 57.02362 711.0236 cm q BT 1 0 0 1 0 14 Tm 1.541835 Tw 12 TL /F5 10 Tf 0 0 0 rg (list.index\(\)) Tj /F1 10 Tf ( in the Python implementation's ) Tj /F5 10 Tf (_define_record_type) Tj /F1 10 Tf (: linear search for field position.) Tj T* 0 Tw (O\(N\) where O\(1\) was trivial. Same defect. Same context. Same failure.) Tj T* ET Q Q q -1 0 0 1 57.02362 266.6236 cm +1 0 0 1 57.02362 693.0236 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (The commit history proves it:) Tj T* ET Q Q q -1 0 0 1 57.02362 260.6236 cm +1 0 0 1 57.02362 687.0236 cm Q q -1 0 0 1 57.02362 260.6236 cm +1 0 0 1 57.02362 687.0236 cm Q q -1 0 0 1 57.02362 248.6236 cm +1 0 0 1 57.02362 675.0236 cm q 0 0 0 rg BT /F1 10 Tf 12 TL ET @@ -7876,10 +7947,10 @@ Q Q Q q -1 0 0 1 57.02362 242.6236 cm +1 0 0 1 57.02362 669.0236 cm Q q -1 0 0 1 57.02362 230.6236 cm +1 0 0 1 57.02362 657.0236 cm q 0 0 0 rg BT /F1 10 Tf 12 TL ET @@ -7901,10 +7972,10 @@ Q Q Q q -1 0 0 1 57.02362 224.6236 cm +1 0 0 1 57.02362 651.0236 cm Q q -1 0 0 1 57.02362 212.6236 cm +1 0 0 1 57.02362 639.0236 cm q 0 0 0 rg BT /F1 10 Tf 12 TL ET @@ -7926,61 +7997,52 @@ Q Q Q q -1 0 0 1 57.02362 194.6236 cm +1 0 0 1 57.02362 621.0236 cm Q q -1 0 0 1 57.02362 176.6236 cm +1 0 0 1 57.02362 603.0236 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F3 10 Tf 12 TL (The defect is in the model, not the programmer.) Tj T* ET Q Q q -1 0 0 1 57.02362 122.6236 cm +1 0 0 1 57.02362 549.0236 cm q BT 1 0 0 1 0 38 Tm 5.336796 Tw 12 TL /F1 10 Tf 0 0 0 rg (Language models learn from training data. The training data contains millions of linear scans,) Tj T* 0 Tw 3.434395 Tw /F5 10 Tf (list.contains) Tj /F1 10 Tf ( calls, ) Tj /F5 10 Tf (std::find) Tj /F1 10 Tf ( inside loops, ) Tj /F5 10 Tf (array.indexOf) Tj /F1 10 Tf ( in hot paths. These patterns are) Tj T* 0 Tw .94631 Tw (statistically dominant. When a model generates code, it reproduces the dominant patterns from its training) Tj T* 0 Tw (distribution \227 including the sedimentary defects.) Tj T* ET Q Q q -1 0 0 1 57.02362 80.62362 cm +1 0 0 1 57.02362 507.0236 cm q 0 0 0 rg BT 1 0 0 1 0 26 Tm /F1 10 Tf 12 TL .029897 Tw (Cantor formalized set theory in 1874. Hash tables were implemented in 1953. The O\(1\) membership test has) Tj T* 0 Tw .363241 Tw (been known for 152 years and available in every language for 73 years. Yet language models still default to) Tj T* 0 Tw (O\(N\) because O\(N\) is what most code does. The training data is the sediment.) Tj T* ET Q Q - -endstream -endobj -116 0 obj -<< -/Length 3850 ->> -stream -1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET q -1 0 0 1 57.02362 729.0236 cm +1 0 0 1 57.02362 465.0236 cm q BT 1 0 0 1 0 26 Tm 2.359862 Tw 12 TL /F3 10 Tf 0 0 0 rg (This means every machine learning agent generating code today is propagating MOAD-0001 by) Tj T* 0 Tw .91789 Tw (default.) Tj /F1 10 Tf ( Not because the solutions are unknown. Not because the agents lack capability. But because the) Tj T* 0 Tw (statistical distribution of training data encodes the defect as the norm.) Tj T* ET Q Q q -1 0 0 1 57.02362 687.0236 cm +1 0 0 1 57.02362 423.0236 cm q BT 1 0 0 1 0 26 Tm .412917 Tw 12 TL /F1 10 Tf 0 0 0 rg (The fix is not to patch individual outputs. The fix is to teach models that ) Tj /F3 10 Tf (O\(1\) is the default) Tj /F1 10 Tf ( for membership) Tj T* 0 Tw 4.550556 Tw (tests, lookups, and deduplication. That ) Tj /F5 10 Tf (set\(\)) Tj /F1 10 Tf ( is not an optimization \227 it is the baseline. That) Tj T* 0 Tw /F5 10 Tf (list.contains) Tj /F1 10 Tf ( inside a loop is a defect, not a pattern.) Tj T* ET Q Q q -1 0 0 1 57.02362 645.0236 cm +1 0 0 1 57.02362 381.0236 cm q 0 0 0 rg BT 1 0 0 1 0 26 Tm /F1 10 Tf 12 TL 1.790491 Tw (Until that teaching happens at the training level, every agent needs a MOAD audit pass on every code) Tj T* 0 Tw 1.596373 Tw (generation. This paper \227 with its commit history showing the defect introduced and then fixed \227 is the) Tj T* 0 Tw (evidence that the audit is necessary.) Tj T* ET Q Q q -1 0 0 1 57.02362 639.0236 cm +1 0 0 1 57.02362 375.0236 cm Q q -1 0 0 1 57.02362 597.0236 cm +1 0 0 1 57.02362 333.0236 cm q 0 0 0 rg BT /F1 10 Tf 12 TL ET @@ -8003,30 +8065,30 @@ Q Q Q q -1 0 0 1 57.02362 597.0236 cm +1 0 0 1 57.02362 333.0236 cm Q q -1 0 0 1 57.02362 567.0236 cm +1 0 0 1 57.02362 303.0236 cm q 0 0 0 rg BT 1 0 0 1 0 14 Tm /F1 10 Tf 12 TL 1.253223 Tw (The stress is real. The compound burden is measurable. And the models that generate our infrastructure) Tj T* 0 Tw (carry the defect in their weights.) Tj T* ET Q Q q -1 0 0 1 57.02362 549.0236 cm +1 0 0 1 57.02362 285.0236 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F1 10 Tf 12 TL (This paper is the proof. The commit history is the evidence. The fix starts with awareness.) Tj T* ET Q Q q -1 0 0 1 57.02362 517.8236 cm +1 0 0 1 57.02362 253.8236 cm q BT 1 0 0 1 0 2.2 Tm 13.2 TL /F2 11 Tf .133333 .133333 .133333 rg (Citation) Tj T* ET Q Q q -1 0 0 1 57.02362 467.8236 cm +1 0 0 1 57.02362 203.8236 cm q q 1 0 0 1 0 0 cm @@ -8047,13 +8109,13 @@ Q Q Q q -1 0 0 1 57.02362 436.6236 cm +1 0 0 1 57.02362 172.6236 cm q BT 1 0 0 1 0 2.2 Tm 13.2 TL /F2 11 Tf .133333 .133333 .133333 rg (References) Tj T* ET Q Q q -1 0 0 1 57.02362 386.6236 cm +1 0 0 1 57.02362 122.6236 cm q q 1 0 0 1 0 0 cm @@ -8074,16 +8136,25 @@ Q Q Q q -1 0 0 1 57.02362 355.4236 cm +1 0 0 1 57.02362 91.42362 cm q BT 1 0 0 1 0 2.2 Tm 13.2 TL /F2 11 Tf .133333 .133333 .133333 rg (License) Tj T* ET Q Q q -1 0 0 1 57.02362 339.4236 cm +1 0 0 1 57.02362 75.42362 cm Q + +endstream +endobj +118 0 obj +<< +/Length 2103 +>> +stream +1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET q -1 0 0 1 57.02362 136.3477 cm +1 0 0 1 57.02362 561.9477 cm q 0 0 0 rg BT /F1 10 Tf 12 TL ET @@ -8099,22 +8170,13 @@ Q Q Q q -1 0 0 1 57.02362 128.3477 cm +1 0 0 1 57.02362 553.9477 cm Q q -1 0 0 1 57.02362 120.3477 cm +1 0 0 1 57.02362 545.9477 cm Q - -endstream -endobj -117 0 obj -<< -/Length 2623 ->> -stream -1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET q -1 0 0 1 57.02362 566.3681 cm +1 0 0 1 57.02362 347.2922 cm q 0 0 0 rg BT /F1 10 Tf 12 TL ET @@ -8130,17 +8192,17 @@ Q Q Q q -1 0 0 1 57.02362 558.3681 cm +1 0 0 1 57.02362 339.2922 cm Q q -1 0 0 1 57.02362 540.3681 cm +1 0 0 1 57.02362 321.2922 cm q 0 0 0 rg BT 1 0 0 1 0 2 Tm /F4 10 Tf 12 TL 155.3042 0 Td (GNU Affero General Public License v3) Tj T* -155.3042 0 Td ET Q Q q -1 0 0 1 57.02362 144.7681 cm +1 0 0 1 57.02362 69.69221 cm q q 1 0 0 1 0 0 cm @@ -8150,10 +8212,10 @@ q .662745 .662745 .662745 RG .5 w .960784 .960784 .960784 rg -n -6 -6 480.0283 386.4 re B* +n -6 -6 480.0283 242.4 re B* Q q -BT 1 0 0 1 0 366.4 Tm 9.6 TL /F5 8 Tf 0 0 0 rg (AGPL-3.0-only) Tj T* T* (PERMACOMPUTER PREAMBLE - NO WARRANTY) Tj T* T* (This is free software for the public good of a permacomputer hosted at) Tj T* (permacomputer.com, an always-on computer by the people, for the people. One) Tj T* (which is durable, easy to repair, ) Tj (&) Tj ( distributed like tap water for machine) Tj T* (learning intelligence.) Tj T* T* (The permacomputer is community-owned infrastructure optimized around four values:) Tj T* T* ( TRUTH - Source code must be open source ) Tj (&) Tj ( freely distributed) Tj T* ( FREEDOM - Voluntary participation without corporate control) Tj T* ( HARMONY - Systems operating with minimal waste that self-renew) Tj T* ( LOVE - Individual rights protected while fostering cooperation) Tj T* T* (This software contributes to that vision by proving that feedback) Tj T* (\(the computational primitive of continuations\) composes into a universal) Tj T* (execution model, extending across implementations through Scheme source) Tj T* (itself as the wire format. Three implementations, one language,) Tj T* (974 tests, ~17,000 lines. Code is seeds to sprout on any abandoned technology.) Tj T* T* (Learn more: https://www.permacomputer.com) Tj T* T* (NO WARRANTY. THE SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND.) Tj T* T* (That said, our permacomputer's digital membrane stratum continuously runs unit,) Tj T* (integration, ) Tj (&) Tj ( functional tests on all of its own software, with our) Tj T* (permacomputer monitoring itself, repairing itself, with minimal human in the) Tj T* (loop guidance. Our machine learning agents do their best to leave no stone) Tj T* (unturned.) Tj T* T* (Copyright \(C\) 2025-2026 TimeHexOn ) Tj (&) Tj ( foxhop ) Tj (&) Tj ( russell@unturf) Tj T* (https://www.timehexon.com) Tj T* (https://www.foxhop.net) Tj T* (https://www.unturf.com/software) Tj T* (https://www.permacomputer.com) Tj T* (https://uncloseai.com) Tj T* (https://russell.ballestrini.net) Tj T* ET +BT 1 0 0 1 0 222.4 Tm 9.6 TL /F5 8 Tf 0 0 0 rg (AGPL-3.0-only) Tj T* T* (PERMACOMPUTER PREAMBLE - NO WARRANTY) Tj T* T* (This is free software for the public good of a permacomputer hosted at) Tj T* (permacomputer.com, an always-on computer by the people, for the people. One) Tj T* (which is durable, easy to repair, ) Tj (&) Tj ( distributed like tap water for machine) Tj T* (learning intelligence.) Tj T* T* (The permacomputer is community-owned infrastructure optimized around four values:) Tj T* T* ( TRUTH - Source code must be open source ) Tj (&) Tj ( freely distributed) Tj T* ( FREEDOM - Voluntary participation without corporate control) Tj T* ( HARMONY - Systems operating with minimal waste that self-renew) Tj T* ( LOVE - Individual rights protected while fostering cooperation) Tj T* T* (This software contributes to that vision by proving that feedback) Tj T* (\(the computational primitive of continuations\) composes into a universal) Tj T* (execution model, extending across implementations through Scheme source) Tj T* (itself as the wire format. Three implementations, one language,) Tj T* (974 tests, ~17,000 lines. Code is seeds to sprout on any abandoned technology.) Tj T* T* (Learn more: https://www.permacomputer.com) Tj T* T* ET Q Q Q @@ -8162,122 +8224,156 @@ Q endstream endobj -118 0 obj -<< -/Nums [ 0 119 0 R 1 120 0 R 2 121 0 R 3 122 0 R 4 123 0 R - 5 124 0 R 6 125 0 R 7 126 0 R 8 127 0 R 9 128 0 R - 10 129 0 R 11 130 0 R 12 131 0 R 13 132 0 R 14 133 0 R - 15 134 0 R 16 135 0 R 17 136 0 R 18 137 0 R 19 138 0 R - 20 139 0 R ] ->> -endobj 119 0 obj << -/S /D /St 1 +/Length 1025 >> +stream +1 0 0 1 0 0 cm BT /F1 12 Tf 14.4 TL ET +q +1 0 0 1 57.02362 607.8236 cm +q +q +1 0 0 1 0 0 cm +q +1 0 0 1 6.6 6.6 cm +q +.662745 .662745 .662745 RG +.5 w +.960784 .960784 .960784 rg +n -6 -6 480.0283 156 re B* +Q +q +BT 1 0 0 1 0 136 Tm 9.6 TL /F5 8 Tf 0 0 0 rg (NO WARRANTY. THE SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND.) Tj T* T* (That said, our permacomputer's digital membrane stratum continuously runs unit,) Tj T* (integration, ) Tj (&) Tj ( functional tests on all of its own software, with our) Tj T* (permacomputer monitoring itself, repairing itself, with minimal human in the) Tj T* (loop guidance. Our machine learning agents do their best to leave no stone) Tj T* (unturned.) Tj T* T* (Copyright \(C\) 2025-2026 TimeHexOn ) Tj (&) Tj ( foxhop ) Tj (&) Tj ( russell@unturf) Tj T* (https://www.timehexon.com) Tj T* (https://www.foxhop.net) Tj T* (https://www.unturf.com/software) Tj T* (https://www.permacomputer.com) Tj T* (https://uncloseai.com) Tj T* (https://russell.ballestrini.net) Tj T* ET +Q +Q +Q +Q +Q + +endstream endobj 120 0 obj << -/S /D /St 2 +/Nums [ 0 121 0 R 1 122 0 R 2 123 0 R 3 124 0 R 4 125 0 R + 5 126 0 R 6 127 0 R 7 128 0 R 8 129 0 R 9 130 0 R + 10 131 0 R 11 132 0 R 12 133 0 R 13 134 0 R 14 135 0 R + 15 136 0 R 16 137 0 R 17 138 0 R 18 139 0 R 19 140 0 R + 20 141 0 R 21 142 0 R ] >> endobj 121 0 obj << -/S /D /St 3 +/S /D /St 1 >> endobj 122 0 obj << -/S /D /St 4 +/S /D /St 2 >> endobj 123 0 obj << -/S /D /St 5 +/S /D /St 3 >> endobj 124 0 obj << -/S /D /St 6 +/S /D /St 4 >> endobj 125 0 obj << -/S /D /St 7 +/S /D /St 5 >> endobj 126 0 obj << -/S /D /St 8 +/S /D /St 6 >> endobj 127 0 obj << -/S /D /St 9 +/S /D /St 7 >> endobj 128 0 obj << -/S /D /St 10 +/S /D /St 8 >> endobj 129 0 obj << -/S /D /St 11 +/S /D /St 9 >> endobj 130 0 obj << -/S /D /St 12 +/S /D /St 10 >> endobj 131 0 obj << -/S /D /St 13 +/S /D /St 11 >> endobj 132 0 obj << -/S /D /St 14 +/S /D /St 12 >> endobj 133 0 obj << -/S /D /St 15 +/S /D /St 13 >> endobj 134 0 obj << -/S /D /St 16 +/S /D /St 14 >> endobj 135 0 obj << -/S /D /St 17 +/S /D /St 15 >> endobj 136 0 obj << -/S /D /St 18 +/S /D /St 16 >> endobj 137 0 obj << -/S /D /St 19 +/S /D /St 17 >> endobj 138 0 obj << -/S /D /St 20 +/S /D /St 18 >> endobj 139 0 obj << +/S /D /St 19 +>> +endobj +140 0 obj +<< +/S /D /St 20 +>> +endobj +141 0 obj +<< /S /D /St 21 >> endobj +142 0 obj +<< +/S /D /St 22 +>> +endobj xref -0 140 +0 143 0000000000 65535 f 0000000061 00000 n 0000000157 00000 n @@ -8291,143 +8387,146 @@ xref 0001535908 00000 n 0001536201 00000 n 0001536407 00000 n -0001536613 00000 n -0001536820 00000 n -0001537027 00000 n -0001537105 00000 n -0001537312 00000 n -0001537519 00000 n -0001537603 00000 n -0001537810 00000 n -0001538017 00000 n -0001538224 00000 n -0001538431 00000 n -0001538638 00000 n -0001538816 00000 n -0001539042 00000 n -0001539249 00000 n -0001539456 00000 n -0001539663 00000 n -0001539870 00000 n -0001540048 00000 n -0001540274 00000 n -0001540448 00000 n -0001540656 00000 n -0001540889 00000 n -0001541095 00000 n -0001541267 00000 n -0001541563 00000 n -0001600539 00000 n -0001600849 00000 n -0001601120 00000 n -0001601227 00000 n -0001601482 00000 n -0001601557 00000 n -0001601707 00000 n -0001601817 00000 n -0001601982 00000 n -0001602177 00000 n -0001602294 00000 n -0001602412 00000 n -0001602554 00000 n -0001602754 00000 n -0001602889 00000 n -0001603038 00000 n -0001603167 00000 n -0001603337 00000 n -0001603461 00000 n -0001603592 00000 n -0001603714 00000 n -0001603910 00000 n -0001604027 00000 n -0001604154 00000 n -0001604284 00000 n -0001604469 00000 n -0001604616 00000 n -0001604771 00000 n -0001604943 00000 n -0001605096 00000 n -0001605239 00000 n -0001605394 00000 n -0001605539 00000 n -0001605722 00000 n -0001605840 00000 n -0001605997 00000 n -0001606135 00000 n -0001606283 00000 n -0001606433 00000 n -0001606571 00000 n -0001606706 00000 n -0001606857 00000 n -0001607050 00000 n -0001607170 00000 n -0001607305 00000 n -0001607465 00000 n -0001607634 00000 n -0001607803 00000 n -0001607947 00000 n -0001608137 00000 n -0001608293 00000 n -0001608457 00000 n -0001608589 00000 n -0001608719 00000 n -0001608861 00000 n -0001608984 00000 n -0001609109 00000 n -0001609218 00000 n -0001609426 00000 n -0001614365 00000 n -0001621935 00000 n -0001629715 00000 n -0001638965 00000 n -0001648260 00000 n -0001656442 00000 n -0001669536 00000 n -0001679791 00000 n -0001688672 00000 n -0001697696 00000 n -0001706544 00000 n -0001716430 00000 n -0001729556 00000 n -0001745223 00000 n -0001756318 00000 n -0001763389 00000 n -0001769179 00000 n -0001777454 00000 n -0001785982 00000 n -0001789885 00000 n -0001792561 00000 n -0001792827 00000 n -0001792862 00000 n -0001792897 00000 n -0001792932 00000 n -0001792967 00000 n -0001793002 00000 n -0001793037 00000 n -0001793072 00000 n -0001793107 00000 n -0001793142 00000 n -0001793178 00000 n -0001793214 00000 n -0001793250 00000 n -0001793286 00000 n -0001793322 00000 n -0001793358 00000 n -0001793394 00000 n -0001793430 00000 n -0001793466 00000 n -0001793502 00000 n -0001793538 00000 n +0001536614 00000 n +0001536821 00000 n +0001537028 00000 n +0001537106 00000 n +0001537313 00000 n +0001537520 00000 n +0001537604 00000 n +0001537811 00000 n +0001538018 00000 n +0001538225 00000 n +0001538432 00000 n +0001538639 00000 n +0001538817 00000 n +0001539043 00000 n +0001539250 00000 n +0001539457 00000 n +0001539664 00000 n +0001539871 00000 n +0001540078 00000 n +0001540256 00000 n +0001540430 00000 n +0001540638 00000 n +0001540878 00000 n +0001541084 00000 n +0001541256 00000 n +0001541489 00000 n +0001600465 00000 n +0001600775 00000 n +0001601094 00000 n +0001601301 00000 n +0001601408 00000 n +0001601663 00000 n +0001601738 00000 n +0001601888 00000 n +0001601998 00000 n +0001602163 00000 n +0001602358 00000 n +0001602475 00000 n +0001602593 00000 n +0001602735 00000 n +0001602935 00000 n +0001603070 00000 n +0001603219 00000 n +0001603348 00000 n +0001603518 00000 n +0001603642 00000 n +0001603773 00000 n +0001603895 00000 n +0001604091 00000 n +0001604208 00000 n +0001604335 00000 n +0001604465 00000 n +0001604650 00000 n +0001604797 00000 n +0001604952 00000 n +0001605124 00000 n +0001605277 00000 n +0001605420 00000 n +0001605575 00000 n +0001605720 00000 n +0001605903 00000 n +0001606021 00000 n +0001606178 00000 n +0001606316 00000 n +0001606464 00000 n +0001606614 00000 n +0001606752 00000 n +0001606887 00000 n +0001607038 00000 n +0001607231 00000 n +0001607351 00000 n +0001607486 00000 n +0001607646 00000 n +0001607815 00000 n +0001607984 00000 n +0001608128 00000 n +0001608318 00000 n +0001608474 00000 n +0001608638 00000 n +0001608770 00000 n +0001608900 00000 n +0001609042 00000 n +0001609165 00000 n +0001609290 00000 n +0001609399 00000 n +0001609614 00000 n +0001614553 00000 n +0001622123 00000 n +0001629904 00000 n +0001639154 00000 n +0001648449 00000 n +0001656631 00000 n +0001669319 00000 n +0001679868 00000 n +0001688390 00000 n +0001697688 00000 n +0001706114 00000 n +0001715943 00000 n +0001729210 00000 n +0001745179 00000 n +0001755541 00000 n +0001763705 00000 n +0001770364 00000 n +0001778531 00000 n +0001786575 00000 n +0001793355 00000 n +0001795511 00000 n +0001796589 00000 n +0001796866 00000 n +0001796901 00000 n +0001796936 00000 n +0001796971 00000 n +0001797006 00000 n +0001797041 00000 n +0001797076 00000 n +0001797111 00000 n +0001797146 00000 n +0001797181 00000 n +0001797217 00000 n +0001797253 00000 n +0001797289 00000 n +0001797325 00000 n +0001797361 00000 n +0001797397 00000 n +0001797433 00000 n +0001797469 00000 n +0001797505 00000 n +0001797541 00000 n +0001797577 00000 n +0001797613 00000 n trailer << /ID -[<044917cc1fdfac9b3ae7e5313f97bf27><044917cc1fdfac9b3ae7e5313f97bf27>] +[<6eb3f0914bae51df773e27af5eb3c9fa><6eb3f0914bae51df773e27af5eb3c9fa>] % ReportLab generated PDF document -- digest (opensource) -/Info 42 0 R -/Root 41 0 R -/Size 140 +/Info 43 0 R +/Root 42 0 R +/Size 143 >> startxref -1793574 +1797649 %%EOF diff --git a/whitepaper/uncommonlisp-whitepaper.rst b/whitepaper/uncommonlisp-whitepaper.rst index 2a67de3..132f2b7 100644 --- a/whitepaper/uncommonlisp-whitepaper.rst +++ b/whitepaper/uncommonlisp-whitepaper.rst @@ -337,7 +337,7 @@ Folding only applies when all operands are compile-time constants & the function 6. Benchmarks: Three Evaluators vs CPython -------------------------------------------- -All benchmarks run on the same machine, same Python 3 interpreter. Three columns: tree-walking interpreter (``leval``), bytecode VM (``--fast``), & equivalent CPython. Times are best-of-3 in milliseconds. +**Methodology.** All benchmarks in this paper run on a single laptop: **Intel Core i5-8350U (8th-gen mobile, 4 cores / 8 threads, 1.70 GHz base)**, Ubuntu 24.04, Linux 6.17, gcc 13.3, GNU assembler 2.42 (GAS AT&T syntax), Python 3.12. Loopback TCP for all socket benchmarks. Three columns below: tree-walking interpreter (``leval``), bytecode VM (``--fast``), & equivalent CPython. Times are best-of-3 in milliseconds. The same hardware is used for the HTTP, RPC, chain, and portal-over-HTTP benchmarks reported later in §11. 6.1 Raw Results ^^^^^^^^^^^^^^^^ @@ -713,7 +713,7 @@ All C & Python benchmarks measured in-process (no startup overhead). Assembly ti **The JIT runs Scheme faster than CPython runs Python.** ``ack(3,4)`` completes in 0.19 ms (JIT) vs 1.3 ms (CPython) — 7× faster. ``sum-to(50000)`` completes in 0.55 ms (JIT) vs 5.5 ms (CPython) — 10× faster. The JIT compiles Scheme AST directly to x86_64 machine code via ``mmap(PROT_EXEC)`` & raw byte emission. It handles ``if``, ``cond``, ``and``, ``or``, ``let``, named-let loops (native ``jmp`` — zero call overhead), ``car``/``cdr``/``cons``, arithmetic, comparisons, & self-recursive calls. Functions that use ``call/cc``, macros, or complex forms fall back to the interpreter. -**The assembly implementation proves the language runs on bare metal.** 4,968 lines of GNU assembler, **22 KB stripped binary**, zero external dependencies. Fourteen Linux syscalls (``read``, ``write``, ``open``, ``close``, ``lseek``, ``mmap``, ``munmap``, ``socket``, ``connect``, ``accept``, ``bind``, ``listen``, ``clock_gettime``, ``exit``) — no libc, no stdlib. A bump allocator with ``heap-snapshot``/``heap-restore`` arena primitives, tag-in-low-3-bits values, **91 builtins** (including ``load``, ports, ``write-file``, ``file->string``, ``portal-save``, ``portal-resume``, the six ``tcp-*`` socket primitives, ``read-from-string``, ``eval``, ``symbol->string``, ``current-time-ms``), & TCO via ``jmp``. It runs ``(ack 3 4) = 125`` & ``(fib 35) = 9227465`` correctly, serves HTTP at **2,994 req/s**, and survives indefinitely with flat O(1) memory when the programmer uses the snapshot/restore arena in a per-request loop. +**The assembly implementation proves the language runs on bare metal.** 4,968 lines of **GNU assembler (GAS, AT&T syntax)**, **22 KB stripped binary**, zero external dependencies. Fourteen Linux syscalls (``read``, ``write``, ``open``, ``close``, ``lseek``, ``mmap``, ``munmap``, ``socket``, ``connect``, ``accept``, ``bind``, ``listen``, ``clock_gettime``, ``exit``) — no libc, no stdlib. A bump allocator with ``heap-snapshot``/``heap-restore`` arena primitives, tag-in-low-3-bits values, **91 builtins** (including ``load``, ports, ``write-file``, ``file->string``, ``portal-save``, ``portal-resume``, the six ``tcp-*`` socket primitives, ``read-from-string``, ``eval``, ``symbol->string``, ``current-time-ms``), & TCO via ``jmp``. It runs ``(ack 3 4) = 125`` & ``(fib 35) = 9227465`` correctly, serves HTTP at **2,994 req/s**, and survives indefinitely with flat O(1) memory when the programmer uses the snapshot/restore arena in a per-request loop. **The bytecode VM delivers 7--19× speedup over tree-walking.** The Python implementation compiles Scheme to 40 opcodes (plus 20 specialized & 5 superinstructions), executed on an explicit frame stack with inline caching, constant folding, & peephole optimization. Full first-class continuations (multi-shot, upward) enable generators, coroutines, & machine state migration via portal. @@ -910,6 +910,10 @@ This is not a general-purpose allocator. It is an escape hatch the programmer us We scanned all three implementations for the five MOADs. Every project contains its own sediment. +**Standard: what the Lean EML proof sets.** §8 documents a formal Lean 4 proof that ``eml(x, y) = exp(x) - ln(y)`` generates every elementary function — and that the proof is 40× faster than the brute-force numerical verification it replaced. That speedup is the MOAD-0001 story in microcosm: algebraic understanding beats O(N²) search, at the proof layer just like at every other layer. We take that standard as the bar for the implementations too. Every hot path should be fast for a *reason* (a hash, a cache, an O(1) invariant), not because a test didn't happen to hit the slow case. Every behavior should be correct for a reason, not by coincidence. The audit below is where we hold ourselves to that bar. + +We also ran the unmoad scanner on the full tree at each release. Most recent scan (2026-04-17, post portal-over-HTTP): 18 HIGH MOAD-0001 candidates in C and 4 MOAD-0003 candidates in Python. All 18 C candidates inspected individually turn out to be false positives — one-shot option parsing, bounded-depth ancestor walks, hash bucket chain walks (already O(1) amortized), or static 6-element tables (e.g. ``#\space`` char-literal names). The 4 Python MOAD-0003 candidates are scanner misfires on a non-ContextVar ``Env.set()`` method. New-work-introduced MOAD-0001: **zero**. The defects fixed in this paper (``intern_symbol``, ``_define_record_type``, ``bi_string_replace``, ``_tokenize_lines``, ``Env.lookup`` shortcut) were all surfaced by other pressures — benchmarks, crashes, portal exchanges — not by the scanner. The scanner remains a second line; the first line is building with understanding. + 12.1 MOAD-0001: The Sedimentary Defect in Our Own Code ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^