Files

9.0 KiB
Raw Permalink Blame History

Implementierungsnachweis — 05.09.2026

Change: projektmodule-und-kompilat, Ausgangscommit 58b1f62.

Abschließende Verifikation: review.md bestätigt die Behebung aller sechs ursprünglichen und aller zusätzlich reproduzierten Befunde. Der erste Review bleibt als historischer Nachweis erhalten.

Alle zwölf Tasks (sieben Implementierungs- und fünf Review-Aufgaben) sind umgesetzt. F09, F10, F11 und F24 sind im Arbeitsbaum bearbeitet; die Hauptspec-Synchronisierung und Archivierung sind am 05.09.2026 abgeschlossen. Die Abnahme umfasst alle sieben Delta-Requirements mit ihren 21 Szenarien.

Umsetzung

Task / Befund Umsetzung und Nachweis
1.1 / F10 SourceUnit/SourceSegment erhalten Modul, Datei und physische Zeile vor dem Parsen. Lexer- und Parserpositionen werden vor der Semantik den Originalquellen zugeordnet. CLI-Tests prüfen Compile-/Runtimefehler aus lib.bas:2, verschachtelten Includes und dem Codeabschnitt eines entfernten FRM. Auch leere Quellen funktionieren.
1.2 / F09 Module werden getrennt aufgelöst und danach numerisch verbunden. Lokale Prozeduren und Controls haben Vorrang, Form!Control sucht direkt im angegebenen Formular. Eltern-IDs ersetzen Namensvergleiche auch bei Frames, Menüs, Optionsgruppen und Geometrie. Zwei Form_Load-Prozeduren initialisieren ihre jeweiligen Text1-Controls unabhängig; echte SUB-/CONST-/TYPE-Duplikate im selben Modul bleiben Fehler.
2.1 / F11 TBC 4 enthält Module/Quellen, vollständige Parameter- und Rückgabetypen, Locals, Forms-Instanzen mit Eigenschaften, Designindizes und Eltern-IDs sowie das Startformular. Vm::new stellt diesen Anfangszustand her. Bytegleicher Rundlauf und Ausführung mit zwei Formularen und Designarrays 0/2 sind geprüft.
2.2 / F10 Source plus Stmt liefern Datei/Spalte/physische Zeile. InitStmt erhält dieselben Informationen für globale Initialisierungen, ohne vorzeitig Ereignisse zuzustellen. Breakpoints verwenden Modul-ID und Zeile. Einzelschritt, Variableninspektion und Fortsetzen bleiben möglich. Numerische Labels führen separat SetErl; DEF FN erhält den tatsächlichen Quellort.
2.3 / F11 tbc run lädt TBC direkt. Der CLI-Test baut ein Projekt, entfernt alle BAS-/BI-/FRM-/MAK-Dateien und vergleicht die Ausgabe des Kompilats mit der Quellausführung (hello, world, 7). Ein zweiter Fall erhält nach Entfernen des FRM den Fehlerort error.frm:6:1. Versionen 1, 2, 3, 5 und 32767 werden ausdrücklich benannt und abgewiesen.
3.1 / F24 TBVM-Format dokumentiert alle neun Abschnitte und alle 153 Opcodes einzeln mit Operanden, Encodingbreiten und Kennungen. Der Compile-Benchmark übersetzt und verbindet nun tatsächlich ein Projekt mit 20 Modulen.
3.2 Alle Delta-Requirement-Blöcke behalten ihre bisherigen Szenarien. Neue Szenarien und die Implementierungsentscheidungen D1D4 wurden gegen die unten genannten Tests und Codepfade abgeglichen. OpenSpec- und Diff-Prüfung bestanden.

Projektgrenzen und ergänzende Regressionen

Der Projektlink versetzt Prozedur-, Slot-, TYPE-, String-, DATA- und Sprungtabellenreferenzen. Hauptprogramminitialisierungen aller Mitglieder laufen vor der ersten Ereigniszustellung; die übrigen Modulrümpfe folgen der Projektreihenfolge. Eindeutige externe Prozeduren werden als Deklarationen importiert, lokale Namen bleiben erhalten. Eindeutige fremde Konstanten und TYPEs bleiben als Kompatibilitätsregel sichtbar. Es wird kein Quelltext zur Unterdrückung von Duplikaten gelöscht.

Geprüft sind wiederholt eingebundene Konstanten, gleichnamige lokale SUBs, modullokales SHARED, gemeinsame COMMON-Skalare und unterschiedliches OPTION BASE. Modulhandler werden getrennt gespeichert: ON ERROR GOTO 0 in der Bibliothek deaktiviert den Handler des Aufrufers nicht. Bestehende ERR-/ERL- und RESUME-Korpustests bestehen unverändert.

Der Signaturtest übergibt ein INTEGER-Array, einen UDT und einen Skalar an eine Funktion in einem anderen Modul. Er prüft Rückgabetyp, Array-/BYREF- Merkmale, Ausgabe und Rückwirkung einer UDT-Feldänderung auf den Aufrufer. Die dabei gefundene Inkonsistenz zwischen UDT-Argument und Parameter wurde im gemeinsamen Semantikpfad behoben. Bekannte externe Dialogdeklarationen funktionieren auch mit qualifizierten Prozedurnamen. ISAM-OPEN verwendet mit PushUdtId eine explizit versetzbare TYPE-Referenz; der Test vergleicht sie nach dem Rundlauf mit dem tatsächlichen UDT-Index.

Der Loader weist abgeschnittene Dateien an jedem Byteoffset, ungültige Flags/Abschnittsgrößen, doppelte Abschnitte sowie ungültige Quell-, Modul-, Prozedur- und Elternreferenzen ab. Inkonsistente Signaturen, doppelte Anfangseigenschaften, falsche Property-Typen und abweichende Designindizes werden vor dem VM-Start geprüft. Das ersetzt keinen vollständigen Stackverifizierer für beliebigen fremden Bytecode.

Requirement- und Szenarioabgleich

Die neuen ausführbaren Nachweise liegen in VM-Projekttests und CLI-Projekttests. Die folgende Tabelle führt auch die erhaltenen Szenarien auf; bestehende Tests werden durch neue Mehrmodul- und Include-Proben ergänzt.

Requirement Szenarien und Belege
Monomorpher Opcode-Satz Gemischter Ausdruck: codegen::tests::ausdruck_monomorph_mit_conv; aufgelöste Namen: sema::tests::hir_slots_aufgeloest und die numerisch verbundenen Projektaufrufe. Vollständigkeit der Dokumentation zusätzlich gegen das instrs!-Makro geprüft.
.tbc-Containerformat Roundtrip: mehrere VM-Projekttests vergleichen die gesamten Bytes; unbekannte Version: CLI-Versionstests; Formularwerte: CLI-Ausgabe hello und world nach Entfernen sämtlicher Quellen.
Zeilentabelle für Fehlerortung Physische Fehlerzeile: Stmt-/Source-Zuordnung und CLI-Fehlerproben; Projektbibliothek: lib.bas:2:5, Include: inner.bi:2:5; zusätzlich InitStmt-, DEF-FN- und FRM-Codepositionen.
Formulare und Steuerelemente als benannte Objekte Lesen/Schreiben: bestehender VM-Test objektzugriff_laeuft_ueber_objekt_und_eigenschaftsindex; keine Standardeigenschaft: sema::tests::eigenschaftstyp_schreibbarkeit_bang_und_hir_index; Wertebereich: forms::tests::defaults_bereich_und_implizites_laden prüft Check1.Value = 3 → Fehler 5; unabhängige Werte: zwei Formulare mit Text1 und eigenem Form_Load im neuen Projekttest.
Diagnostik mit Vorbild-Meldungen Exakte Position: SourcePos bleibt 1-basiert; neue Tests prüfen Datei, Zeile und Spalte. Include-Diagnose: sowohl direktes SourceSegment als auch verschachtelte CLI-Expansion liefern die ursprüngliche Position des Typfehlers.
Objektzugriffe in Grammatik und Semantik Unbekanntes Objekt/Eigenschaft und Eigenschaftstyp: bestehende Semantiktests für Text9.Text, Text1.Farbe und Text1.Text = 5; TYPEOF: typeof_form_control_und_form_metabefehl; gleichnamige Controls: Form1!Text1/Form2!Text1 sowie lokale Text1-Zugriffe beider Form_Load-Rümpfe.
Unterbrechbare step()-Ausführung Breakpoint und Inspektion: vorhandene VM-Tests plus neuer Modulbreakpoint; gleiche Zeile in zwei Modulen: Modul A passiert Zeile 2, Modul B hält dort. Fortsetzen im Einzelschritt erhält nested.bi:2, physische Spalte 5 und getrenntes ERL = 200.

Ausgeführte Abnahme

  • cargo test --workspace: 453 bestanden, 0 fehlgeschlagen, 1 ignoriert. Der ignorierte Golden-Generator wurde nicht ausgeführt; Sollausgaben blieben unverändert.
  • cargo clippy --workspace --all-targets --all-features -- -D warnings: bestanden.
  • cargo fmt --all -- --check: bestanden.
  • cargo bench -p tb-vm --bench compile: 508 Zeilen 0,56 ms (Budget 50 ms); 49.760 Zeilen in 20 verbundenen Modulen 77 ms (Budget 1000 ms), 335.421 Instruktionen. Release-Messung auf diesem Rechner.
  • Formatabgleich: 153/153 Opcodezeilen einschließlich Operandentypen und Bytebreiten sowie 9/9 Abschnittskennungen gegen Writer/Reader abgeglichen.
  • openspec validate projektmodule-und-kompilat --strict: bestanden.
  • git diff --check: bestanden.

Die Abnahme ist eine lokale Code-/Testprüfung auf macOS; sie ist kein neuer interaktiver Originalsystemvergleich und keine Windows-/Linux-Testmatrix.

Reviewkorrekturen

Die ursprünglichen sieben Reviewproben bestehen unverändert, sowohl im separaten Treiber als auch in der Workspace-Suite. Die dauerhafte Datei crates/tb-vm/tests/project_regressions.rs ergänzt sie um neun Tests mit verwandten Fällen. review.md ordnet die Korrekturen V1V6 und alle zusätzlich reproduzierten Abweichungen den Nachweisen zu.

CommonArr (0x3B) initialisiert gemeinsame Arrays einmal und prüft spätere Laufzeitgrenzen auf Kompatibilität; vorab bekannte Konflikte meldet der Linker an der ursprünglichen COMMON-Deklaration. Die neue Instruktion ist in TBC 4 serialisiert, validiert und vollständig dokumentiert. Typ-Suffixe bleiben in Debugger-Slotnamen erhalten. AST-Literale und sämtliche ausführbaren Zweig-/Schleifenteile tragen ihre tatsächlichen Quellpositionen.