summaryrefslogtreecommitdiff
path: root/docs/2026_REBASE/README.md
blob: 925be1ed04bab55d1a8c6223391685b90dc5f7be (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
# A Simple Tutorial — REBASE 2026

Cliff Click's 30-minute presentation for an audience familiar with compilers,
SSA, and program analysis. Simple is an open-source, all-Java compiler tutorial
modeled after Java's C2.

## Run the deck

From the repository root:

    python -m http.server 8000 --bind 127.0.0.1 --directory docs/2026_REBASE

Open [the presentation](http://127.0.0.1:8000/). Keep that terminal running and
use a second terminal for the graph viewer. Opening `index.html` directly also
works; a local HTTP server gives the most consistent clipboard and presenter
window behavior.

There is no npm install, build step, CDN, remote font, or network dependency.
The portrait, CCC artwork, code, and captured graphs are all in this directory.
External links are ordinary links, not embedded services.

- **Right / Space:** next build; **Left:** previous build.
- **Page Down / Page Up:** next / previous slide.
- **Home / End:** title / closing slide.
- **L:** cycle the example and lattice tabs on the current slide.
- **O:** overview, including the optional Chapter 25 slide.
- **P:** open a synchronized presenter window with notes and a talk timer.
- **N:** show notes on the current screen; avoid this on the projected screen.
- **T:** start / pause the timer. It keeps running while a viewer tab is active.
- **F:** fullscreen; **B:** blank / unblank; **?:** shortcut reference.

The title is still. The still CCC GIF is on the biography slide. Other slides have
manual builds, with no automatic slide advancement. Reduced-motion preferences
disable slide transitions.

## The 30-minute route

| Time | Slide | What to show |
|---|---|---|
| 00:00–01:00 | A Simple Tutorial | The all-Java, open-source C2 connection |
| 01:00–02:00 | Who am I? | Short bio, Coffee Compiler Club, links |
| 02:00–07:00 | Chapters 1–4 | Direct SSA construction and peepholes; live Chapter 4 |
| 07:00–12:00 | Chapters 5–8 | Regions, Phis, and loops; live Chapter 8 |
| 12:00–17:00 | Chapters 9–17b | Memory SSA and alias slices; live Chapter 17b |
| 17:00–22:00 | Chapter 18 | Functions and calls; live demo of trivial inlining and constant folding |
| 22:00–24:00 | Chapters 19–21 | Instruction selection, allocation, encoding |
| 24:00–26:00 | Chapters 22–23 | I/O, C calls, methods, and cyclic types |
| 26:00–28:00 | Chapter 24 | Optimistic propagation through a loop |
| 28:00–30:00 | Takeaways | Discussion and links |

Chapter 25 is a two-minute optional slide. Normal forward navigation skips it.
Choose it in the overview or from the closing slide, replacing the final
discussion if desired. It is not an extra two minutes in the default schedule.

Each live segment includes roughly 45 seconds on the slide, 30 seconds to
switch tabs, three minutes in the viewer, and a short wrap-up. Speaker notes
contain the detailed beats and the cumulative time to leave each segment.

## Lattice views

The chapter slides have tabs in their header. Click a tab or press **L** to
cycle through the views; the example remains the initial view. Memory still
starts with the short alias example. Tabs synchronize with the presenter
window, and a URL such as `#memory/0/contents` opens a lattice directly.

| Slide | Lattice views |
|---|---|
| Chapters 1?4 | Global bounds, control, flat integer constants, tuples |
| Chapters 5?8 | Live/dead control and Phi input types; integers remain flat |
| Chapters 9?17b | Chapter 11 domains; typed memory contents; Chapter 14 ranges |
| Chapter 18 | Function target sets, with the other type components held fixed |
| Chapter 24 | Rich lattice across all type families |

Use about 30 seconds of each existing introduction for the lattice. On the
memory slide, spend about 20 seconds each on Domains and Memory types; Ranges
is available if useful and is revisited at Chapter 24. These views share the
existing time slots rather than adding slides to the 30-minute route. Right
advances to the next slide from a lattice; click Example or press L to return
to the source before switching to the viewer.

The SVG diagrams in `lattices.js` are drawn for projection. They distinguish
full domain overviews from selected sublattices and projections. Gray lines
show lattice order, not IR use/definition edges. The orange SCCP curve marks
an analysis update. In particular, Chapter 11's flat memory aliases are not
presented as Chapter 17b's full typed-memory lattice, and the function picture
shows only the target-set component.

Sources in this repository:

- Chapter 4 `docs/lattice.gv`, README, and `type/Type*.java`.
- Chapter 6 `docs/lattice.gv`, retained in Chapter 8's types and Phi rules.
- Chapter 11 `docs/lattice.gv` and `TypeMem.java` for the domain overview.
- Chapter 17b `TypeMem.java` for fixed-alias contents and their meet.
- Chapter 14 `TypeInteger.java` for range meet and endpoint-swapping dual.
- Chapter 18 `TypeFunPtr.java` for target-bit union and the remaining components.
- Chapter 24 README for optimistic propagation and the fixed-point example.

## Prepare the live demos

Use the repository's normal JDK and Make setup. Prebuild the demo chapters
before the session so compilation does not consume stage time:

    make -C chapter04 build CTAGS=
    make -C chapter08 build CTAGS=
    make -C chapter17b build CTAGS=
    make -C chapter18 build CTAGS=
    make -C chapter25 build CTAGS=

The deck's **Copy viewer command** button gives one of these commands:

    make -C chapter04 view
    make -C chapter08 view
    make -C chapter17b view
    make -C chapter18 view
    make -C chapter25 view

The Chapter 24 SCCP slide deliberately launches **Chapter 25's viewer** for
this talk, using the same example with a separately compiled standard library.
Chapter 24's viewer captures the library afresh on each compile (about 3,281
frames and 372 MB for this example), which can overwhelm the browser. The slide
topic, source, and lattice explanations remain Chapter 24.

Run one viewer at a time. Stop the previous one with Ctrl+C in its terminal
before launching the next. Each launch opens a viewer page and prints its URL;
the HTTP port can change. Keep only the current viewer tab to make switching
between slides and viewer predictable. All ordinary viewer sessions use
WebSocket port 12345.

On the slide, **Copy code**, switch to the viewer, paste into the source editor,
and click **Compile** (or Ctrl+Enter). Move focus out of the editor before using
Left/Right for playback. Structural peepholes use gather → rewrite → release.
Jump to **Last** to orient the audience or recover time; the larger examples
are not intended to be stepped through from beginning to end.

The viewer animates compilation, not runtime execution. It captures
parsing/optimization/type checking as supported by the chapter; it does not
show the global scheduler moving instructions. Discuss GCM from the slide.

| Source | Chapter | Checkpoint / result |
|---|---|---|
| [arithmetic.smp](demos/arithmetic.smp) | 04 | Final expression `2*arg+6`; 51 capture frames |
| [control.smp](demos/control.smp) | 08 | Sum 1 through `abs(arg)`; 65 frames |
| [memory.smp](demos/memory.smp) | 17b | Two loops, array/object memory; 319 frames, 54 final nodes |
| [aliases.smp](demos/aliases.smp) | 17b | Short follow-up: writing `p.y` leaves `p.x` unchanged; result 0 |
| [inline.smp](demos/inline.smp) | 18 | Two single-caller functions disappear; `return 11;`; 161 frames |
| [sccp.smp](demos/sccp.smp) | 24; viewer 25 | Return value 1 verified in the final graph; 76 frames, about 0.38 MB |

The large memory example has runtime result `4*arg+10`. It retains loops and
memory operations; that formula is not its claimed optimized graph.
For SCCP, proving a constant result alone does not license deleting effects
or a possibly nonterminating loop.

The five **Final graph** buttons open captured compiler graphs, available
offline. These are also a fallback if a viewer session fails. They were
generated with the shared graph renderer from actual compiler snapshots.

## Equivalence classes and research context

Slide 5 partitions whole memory into `Pair.x`, `Pair.y`, and all other
locations. A field class covers that field across all instances: accesses in
the same class may alias; accesses in different classes cannot. The second
build highlights the `Pair.y` slice changed by the Store. The array example
uses the corresponding `Totals.sum` / `Totals.visits` partition.

The linked precedent is Amer Diwan, Kathryn S. McKinley, and J. Eliot B. Moss,
[?Type-Based Alias Analysis,? PLDI 1998, pp. 106?117](https://people.cs.umass.edu/~moss/papers/pldi-1998-tbaa.pdf).
Sections 3.5?3.6 (printed p. 113; PDF page 8) compare redundant load elimination
(RLE) with a runtime upper bound. Their type-based analysis came close to that
bound on eight Modula-3 benchmarks; substantially more static opportunities
did not produce comparable runtime gains. The average remaining headroom was
at most 2.5% more heap loads eliminated, not a 2.5% speedup claim.

This is a useful precedent for simple alias models, rather than a measurement
of Simple's exact equivalence classes or a universal limit on Java optimization.
It is the closest identified match to the recalled oracle study; an exact
IBM/Java paper was not established. The visible citation identifies Modula-3,
and the speaker notes retain the scope and measurement details.

## GitHub hosting

Commit this directory with the repository. GitHub's normal source browser shows
HTML source; a GitHub Pages site serves the presentation as a running page.
No generated build output is required.

- If Pages serves the repository's `/docs` directory, the deck is at
  `/Simple/2026_REBASE/` on that Pages site.
- If Pages serves the repository root, the deck is at
  `/Simple/docs/2026_REBASE/`.
- An existing Pages workflow can copy this directory unchanged to the chosen
  location in its site artifact.

All asset paths are relative, so the folder can also be copied to another
static host. Setting up or changing the repository's Pages deployment is
separate from editing the deck.

## Editing

Slide 8's **Chapter 22** column opens an offline file explorer over the current
Chapter 25 standard library: `sys.smp`, all eight files directly under `sys/`,
and `sys/adt/bitset.smp`. Click folders and files; use **Up** or the breadcrumbs
to navigate. File views scroll, **Full width** expands the explorer, and
**Discussion** restores the normal column. **Copy file** copies the complete
source. Paths, file scrolling, and open views synchronize with the presenter.
While the file text has focus, navigation keys scroll it instead of advancing
slides. This is a bundled source snapshot, so it also works from `file://`.

The **Chapter 23** column flips to a complete [Counter example](demos/methods.smp)
with an instance field, `add` and `get` methods, and calls chained through
`self`. It passes Chapter 23 parsing, optimization, type checking, and evaluation:
inputs −5, 0, and 5 return 2, 7, and 12. The library explorer deliberately uses
the latest chapter; the short methods example is valid in Chapter 23 itself.

Refresh the library snapshot and embedded methods source from the repository:

```sh
python docs/2026_REBASE/tools/snapshot-library.py
```

Chapter 24 is titled **Sparse Conditional Constant Propagation**. Its **Rich
lattice** tab (`#sccp/0/rich`) shows the actual ordering of 143 representative
types from Chapter 24's `Type.gather()`, including their duals. The 256 edges
are transitively reduced within that sample. This covers every gathered type
family, without attempting to enumerate all intervals or recursive aggregate
types. Click the diagram to open the full-size SVG; node tooltips include the
full type spelling. The two takeaways are “It’s just a lattice, so the
fixed-point theory works” and “It’s a rich lattice, so we get rich results.”

Regenerate with Chapter 24 built and Graphviz installed:

```sh
java -ea --class-path chapter24/build/classes/main docs/2026_REBASE/tools/RichLattice.java
dot -Tsvg docs/2026_REBASE/assets/rich-lattice.gv -o docs/2026_REBASE/assets/rich-lattice.svg
```

Slide 7's three backend columns are clickable: each flips between its discussion
and a captured compiler dump. Enter or Space also flips a focused column.
Flips persist across builds and synchronize with the presenter window.
The shared [backend example](demos/backend.smp) takes an existing writable Box,
adds `abs(arg)` into its field, and returns the absolute value. No allocation
is needed in the example.

All three stages are captured from **Chapter 21**, targeting x86-64 System V;
Chapters 19 and 20 do not yet select unary negation. The Chapter 19 column shows
all 21 selected nodes, with concrete class names and every input slot. It omits
types and redundant use lists to fit. The Chapter 20 and 21 columns show
`CodeGen.asm()` after register allocation and encoding, respectively, with only
whitespace and divider lengths compacted. The unabridged captures are
[selected IR](assets/backend-selected.txt),
[allocated assembly](assets/backend-registers.txt), and
[encoded assembly](assets/backend-encoded.txt).

The allocated listing still has provisional offsets, a not-yet-encoded jump,
and callee-save bookkeeping. Encoding resolves the layout and removes the extra
jump. `NegX86` emits `48 f7 d8`; `MemAddX86` emits `48 01 07` to add `rax` into
`[rdi]`. The compiler printer calls its compare-with-zero `test`, although the
bytes `48 83 f8 00` encode `cmp rax, 0`.

Regenerate these captures and `backend.js` from the repository root:

```sh
make -C chapter21 build/classes/main/com/seaofnodes/simple/codegen/CodeGen.class
java -ea --class-path chapter21/build/classes/main docs/2026_REBASE/tools/BackendDump.java
```

- `deck.js`: speaker links and demo source strings.
- `backend.js`: generated backend source and compiler dumps.
- `stdlib.js`: generated library snapshot and methods source.
- `language.js`: library explorer and methods view.
- `slides.js`: slide content, manual builds, durations, and speaker notes.
- `lattices.js`: lattice diagrams, tab definitions, and their speaker notes.
- `slides.css`: layout and transitions.
- `app.js`: navigation, clipboard, notes, presenter synchronization, and timer.
- `demos/*.smp`: standalone copies of the examples. Keep these identical to
  their `deck.js` strings; `backend.smp` instead feeds `BackendDump.java`, and
  `methods.smp` feeds `snapshot-library.py`.
- `assets/*-final.json` and `.svg`: captured graph snapshots and their exports.

YouTube uses [@compilers](https://www.youtube.com/@compilers). The short bio is
adapted from Cliff's supplied 2024 biography. Portrait and CCC artwork were
supplied by Cliff and copied into `assets/`.

The bio and closing slides ask people to send an email for a Discord invite.

Captured SVGs can be regenerated from their JSON with
`graph/render_docs.py --browser msedge` followed by the relevant snapshot paths.
This optional regeneration tool uses Python Playwright; the deck itself does
not.

## Validation

The examples were run with assertions enabled in their own chapter compilers
and evaluators:

| Example | arg = -5 | arg = 0 | arg = 5 |
|---|---:|---:|---:|
| Arithmetic | -4 | 6 | 16 |
| Control | 15 | 0 | 15 |
| Memory | -10 | 10 | 30 |
| Aliases | 0 | 0 | 0 |
| Inlining | 11 | 11 | 11 |
| SCCP | 1 | 1 | 1 |

Chapter 4 is checked by parsing with constant argument types; later chapters
use their evaluator. The four live demos and alias follow-up also completed
their real graph-capture paths without diagnostics. Final snapshots verify
the arithmetic shape, zero alias-example result, and absence of Calls with
return value 11 after inlining.

Headless browser checks cover navigation/builds, clipboard buttons, demo
selection, fallback graphs, the optional route, presenter synchronization,
the timer, local-file loading, reduced-motion transitions, and slide overflow.
Lattice checks cover every tab, direct links, retained demo selection, and
presenter synchronization. The displayed meet/dual and target-union examples
were checked against the chapter 4, 8, 11, 14, 17b, 18, and 24 type implementations.