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 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^