Iter 2: verschachteltes if, Strings, JSON-Output, deps
- Codegen: current_block-Tracking ersetzt die Heuristik im phi-Lowering; verschachtelte if-Ausdrücke produzieren jetzt korrekte LLVM IR. examples/max3.ail.json + Test schützt gegen Regression. - Strings: Lit::Str / Type Str / io/print_str Effekt-Op; Strings sind im MVP immutable Konstanten. examples/hello.ail.json als zweiter E2E-Test. - CLI: --json für manifest und builtins; neuer deps-Subcommand listet statische Symbol-Referenzen pro Definition. Effekt-Ops mit Prefix effect: markiert. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
+53
-1
@@ -14,4 +14,56 @@ Hindernisse, Beobachtungen, die zukünftige Iterationen brauchen.
|
||||
- `crates/ailang-check` — Typchecker (kommt später)
|
||||
- `crates/ailang-codegen` — Lowering + LLVM IR Emit
|
||||
- `crates/ail` — CLI
|
||||
- MVP-Ziel: `examples/sum.ail.json` → Binary, das 55 druckt.
|
||||
- MVP-Ziel: `examples/sum.ail.json` → Binary, das 55 druckt. **Erreicht.**
|
||||
|
||||
## 2026-05-07 — Architektur-Review nach MVP
|
||||
|
||||
Wieder am Pfad? Im Großen ja. Konkrete Beobachtungen:
|
||||
|
||||
**Was hält:**
|
||||
|
||||
- JSON-AST + canonical form + content-hash sind alle Lego-Steine, auf denen
|
||||
spätere Tools ohne Refactor aufsetzen können (`ail deps`, `ail diff`).
|
||||
- LLVM-IR-Text-Pipeline arbeitet wie geplant. Keine libllvm-Versionsschmerzen.
|
||||
- Effekt-Set ist im Typsystem von Anfang an verbaut. Erweiterbar zu row-poly,
|
||||
ohne den Kern zu ändern.
|
||||
|
||||
**Schulden, die Zinsen tragen:**
|
||||
|
||||
1. **`current_block_label_for_phi` ist eine Heuristik** (siehe codegen). Bei
|
||||
verschachtelten `if`-Termen wird sie das falsche Block-Label zurückgeben,
|
||||
weil sie rückwärts den Body scannt. Tickend, weil keine Test-Fälle das
|
||||
bisher triggern. Muss als nächstes fixiert werden, bevor neue Sprachfeatures
|
||||
dazu kommen.
|
||||
2. **Kein typed-AST.** Codegen liest direkt das Quell-AST und verlässt sich
|
||||
darauf, dass der Typchecker vorher lief. Für MVP OK; sobald ADTs oder
|
||||
Closures dazukommen, brauche ich eine getrennte typisierte IR-Stufe (TIR).
|
||||
3. **`hash`-Feld ist nicht im AST.** Aktuell hashen wir das Def-Objekt direkt.
|
||||
Wenn ich Hashes später als Felder mitserialisiere (Caching), muss der Hash
|
||||
das Feld vor der Berechnung ausschließen.
|
||||
|
||||
**Plan Iteration 2 (jetzt):**
|
||||
|
||||
1. Block-Label-Tracking sauber machen, verschachteltes-if-Test.
|
||||
2. Strings als Literal + `io/print_str`.
|
||||
3. Hello-world-Beispiel als zweiten E2E-Test.
|
||||
4. CLI: `--json`-Output für maschinelle Konsumenten überall, wo es passt.
|
||||
|
||||
**Plan Iteration 3:**
|
||||
|
||||
ADTs + Pattern Matching. Das ist der nächste große Sprung. Erfordert
|
||||
typisierte IR-Stufe (TIR), weil Pattern Matching zu Decision-Trees lowered
|
||||
wird, was eine andere Form ist als der AST.
|
||||
|
||||
## 2026-05-07 — Iteration 2 fertig
|
||||
|
||||
- Block-Label-Tracking robust (verschachtelte `if`s funktionieren). Test
|
||||
`max3_picks_largest` schützt das.
|
||||
- Strings als `Lit::Str { value }`, Type `Str` -> LLVM `ptr`, mit
|
||||
`io/print_str` Effekt-Op. `examples/hello.ail.json` druckt einen String.
|
||||
- CLI: `manifest --json`, `builtins --json` für Tool-Konsumenten.
|
||||
- `ail deps [--of NAME] [--json]` listet Aufruf-Edges. Effekt-Ops sind als
|
||||
`effect:NAME` markiert, damit ein Konsument sie filtern kann.
|
||||
|
||||
**Architektur-Check:** Keine strukturellen Abweichungen. Codegen liest noch
|
||||
direkt das Quell-AST (TIR-Stufe wird mit ADTs in Iteration 3 nötig).
|
||||
|
||||
Reference in New Issue
Block a user