Phase 5: Editor und inkrementellen Compiler implementieren und archivieren

This commit is contained in:
2026-09-06 17:58:26 +02:00
parent df85a4b7b2
commit 9c85349a4d
36 changed files with 2993 additions and 247 deletions

View File

@@ -63,7 +63,7 @@ nicht. Die MAK-Datei wird zuletzt geschrieben. Details stehen in
Load Text fügt am Cursor als eine Undo-Aktion ein; Save Text exportiert im
Rahmen den gesamten Code. Der Dokumentvertrag unterstützt bereits
Auswahlexport; die Auswahlbedienung gehört zum Editor-Change 03. Remove
Auswahlexport des markierten Bereichs. Remove
File löscht keine Datei; beim Entfernen der Startdatei ist die Wahl eines
Ersatzes oder des bisherigen Standards ausdrücklich im Dialog enthalten.
@@ -82,8 +82,7 @@ Includes werden mit `|` getrennt; relative Optionspfade werden beim
Übernehmen relativ zum Projektverzeichnis absolut aufgelöst. Das Include
neben der Quelldatei hat Vorrang vor Suchverzeichnissen. Right Mouse
schaltet Kontext-Hilfe per Rechtsklick (Default an); die Hilfefunktion
folgt in Change 07. Syntax Checking ist zunächst an; dessen fachliche
Editorwirkung folgt in Change 03.
folgt in Change 07. Syntax Checking ist zunächst an; seine Wirkung ist unten beschrieben.
Erst Options → Save… / OK schreibt die versionierte Benutzerdatei:
@@ -128,31 +127,29 @@ Library-Symbole/Aufrufvertrag und der native Verbraucher-Nachweis stehen
explizit in [PLAN.md, Phase 6](../PLAN.md). Ein umbenanntes TBC erfüllt
keines der beiden Exportziele.
## Befehlsabdeckung nach Change 02
## Befehlsabdeckung nach Change 03
Alle Referenzbefehle sind in ihrer Menüfolge vorhanden. Fachbefehle der
folgenden Changes sind sichtbar deaktiviert und zeigen einen
Verfügbarkeitsgrund; ihre Kürzel gelangen nicht versehentlich an BASIC.
Ctrl+C im Editor ist Kopieren (Fachfunktion 03), bei laufendem Programm mit
Ctrl+C im Editor ist Kopieren, bei laufendem Programm mit
Output-Fokus wird Ctrl+C an den Programmeingabepfad weitergereicht.
| Bereich | Rahmenaktion jetzt | Fachaktion im Folgechange |
| --- | --- | --- |
| File | New/Open/Save Project, New Form/Module, Add/Remove File, Save File/As, Load/Save Text, Exit | Print/Shell: 04 |
| Edit | Undo über Dokumentaktionen; einfacher Texteinstieg | Cut/Copy/Paste/Clear, New Sub/Function: 03; Event Procedures: 05 |
| View | Code/Form-Auswahl, Designer Menu Bar/Value-Fokus | Included File/Lines: 03; Output Screen: 04; Grid Lines: 05; Next Statement: 06 |
| Search | Vollständiges Menü und Kürzelzuordnung | Find, Selected Text, Repeat Last Find, Change: 03 |
| Edit | Undo, Cut/Copy/Paste/Clear, New Sub/Function | Event Procedures: 05 |
| View | Code/Form-Auswahl, Prozedurauswahl, Included File/Lines, Diagnostics, Designer Menu Bar/Value-Fokus | Output Screen: 04; Grid Lines: 05; Next Statement: 06 |
| Search | Find, Selected Text, Repeat Last Find, Change | — |
| Run | Set Start-up File und beide Make-Dialoge | Start/Restart/Continue/COMMAND$ und Startup-Ausführungswirkung: 04; native Erzeugung: Phase 6 |
| Debug | Vollständiges Menü und Kürzelzuordnung, einschließlich F7/F8/F9/F10 und History | Watches, Watchpoints, Trace, History, Breakpoints, Break on Errors, Set Next Statement: 06 |
| Options | Display, Set Paths, Right Mouse, Save, Syntax Checking | Syntaxwirkung: 03; Kontext-Hilfe: 07 |
| Options | Display, Set Paths, Right Mouse, Save, Syntax Checking einschließlich Zeilenprüfung | Kontext-Hilfe: 07 |
| Window | New Window, Arrange All, Calls/Debug/Help/Immediate/Output/Project, aktive Codeliste, alle Fensterkürzel | Output-Inhalt: 04; Debug/Calls/Immediate-Inhalte: 06; Hilfeinhalt: 07 |
| Designer Tools/Window | Tools-Menü, Formliste und gemeinsamer Fenster-/Modusrahmen | Controls/Toolbox, Color Palette, Menu Design Window: 05 |
| Help | Vollständiges Menü, About und Help-Fensterrahmen | Index, Contents, Keyboard, Topic, Using Help, Tutorial: 07 |
Der einfache Texteinstieg ist noch kein abgeschlossener Editor: Navigation,
Selektion, Zwischenablage, Syntaxprüfung und inkrementelles Übersetzen
werden in 03 vollständig umgesetzt. Die gesamte Phase-5-Abnahme erfolgt
erst in Change 08.
Der Editor einschließlich inkrementeller Übersetzung ist umgesetzt. Die gesamte
Phase-5-Abnahme erfolgt in Change 08.
## Reproduzierbarer Testpfad
@@ -162,3 +159,88 @@ dieselbe `App::render`-Funktion wie der Terminalprozess mit
sie prüfen Fokus, Dokumente, Fenster, sichtbare Texte und Farben. Dieser
Pfad steht den Folgechanges zur Verfügung. `TerminalGuard` prüft zusätzlich
Normalende, Fehlerende und teilweise fehlgeschlagene Initialisierung.
## Editor, Suche und Quelltextpflege
Einfügen/Überschreiben wechselt mit Insert. Shift mit Pfeilen, Pos1/Ende und
Bild auf/ab markiert Text; Ctrl+A markiert alles. Ctrl+Links/Rechts navigiert
wortweise, Ctrl+Pos1/Ende zum Dateianfang/-ende. Ctrl+Y löscht die aktuelle
Zeile. Unicode-Codepunkte und CRLF-Zeilenumbrüche bleiben unbeschädigt;
Tabs und breite Zeichen verwenden Bildschirmspalten für die Vertikalbewegung.
Markierungen werden invertiert dargestellt, der Cursor bleibt im sichtbaren Bereich.
Ctrl+C/X/V/Z sowie Ctrl+Insert, Shift+Delete/Insert und Alt+Backspace bedienen
Kopieren, Ausschneiden, Einfügen und Undo. Die Zwischenablage ist IDE-intern und
funktioniert zwischen Codefenstern. Terminal-Paste wird mit Bracketed Paste als
eine Aktion verarbeitet. Paste, Ausschneiden, Ersetzen aller Treffer,
Normalisierung und Prozedurerzeugung sind jeweils eine Undo-Einheit. Undo
stellt auch Cursor, Markierungen und Lesezeichen der gemeinsamen Ansichten her.
WordStar: Ctrl+Q, dann S/D setzt den Zeilenanfang/-ende, R/C den
Dateianfang/-ende. Ctrl+K, dann 03 setzt vier Lesezeichen je Ansicht;
Ctrl+Q, dann 03 springt dorthin. Esc oder eine unbekannte Folgetaste bricht
ab, ohne Quelltext einzufügen. Mausaktionen beenden einen begonnenen Chord.
Find und Change bieten Suchtext, Ersetzung, Richtung, Groß-/Kleinschreibung,
ganze Wörter und den Bereich „Dokument“ oder „Nur Auswahl“. Das Aktionsfeld
wählt Suchen, Einzeln ersetzen oder Alle ersetzen. Eine leere Ersetzung löscht
Treffer. Ctrl+Backslash übernimmt die Auswahl als Suchtext, F3 sucht weiter.
Am Bereichsende zeigt die Statusmeldung den angebotenen Rücksprung an;
erneutes F3 bestätigt ihn. Alle Treffer einer Ersetzungsaktion werden gemeinsam
rückgängig gemacht.
Shift+F2 beziehungsweise View → Procedures öffnet Modulrumpf und Prozeduren;
Ctrl+F2 kehrt zur vorherigen Codeposition zurück. New Sub/Function prüft Namen
auch gegen andere Projektmodule und übernimmt die am Erzeugungsort wirksamen
DEFtype-Regeln, einschließlich Includes und des aktuellen Prozedurkontexts.
View → Included File öffnet das Original der Include-Anweisung auf der
Cursorzeile. Included Lines zeigt die expandierte Übersetzungseinheit mit
Dateinamen und physischen Zeilen als schreibgeschützte Ansicht. Pfeile und
Bild auf/ab scrollen; erneuter Aufruf kehrt zum Quelltext zurück. Save File
speichert immer das physische Dokument. Eine Expansion wird niemals zur BAS-Datei.
View → Diagnostics ist eine ergänzende IDE-Funktion: Die Auswahl springt zur
richtigen physischen Datei, Zeile und Spalte, auch bei Includes und FRM-Code.
Syntax Checking prüft beim Verlassen einer geänderten Zeile. Der reguläre
Parser unterscheidet fehlende Blockabschlüsse am Dateiende von Syntaxfehlern.
Unvollständige Blöcke bleiben ohne modalen Fehlerdialog bearbeitbar. Gültige
Zeilen erhalten normalisierte Keywords und zulässige Abstände anhand der
Lexerpositionen; Tokenvergleich schützt Strings, Kommentare, DATA und Bezeichner.
Abschalten unterbindet automatische Prüfung, Formatierung und Fehlerdialoge.
Die explizite Übersetzungs-API prüft unabhängig davon den vollständigen Stand.
Save File/As und Save Project pflegen DECLAREs im kommentierten Bereich
`' $IDE DECLARE BEGIN` bis `' $IDE DECLARE END` unmittelbar vor den Prozeduren.
Die Prüfung nutzt den regulären Projektcompiler mit Includes und Forms. Passende
Handdeklarationen bleiben erhalten. Bei Konflikten oder unfertigem/fehlerhaftem
Projektstand wird die gesamte Pflege übersprungen, der Entwurf unverändert
gespeichert und der Grund mit Quellort ausgegeben. Auch FRM-Code benutzt diesen
Speicherhook. Wiederholtes Speichern erzeugt keine neuen Deklarationen oder Revisionen.
## Übersetzung und Revisionsbindung
`App::compile_current` lädt den aktuellen Projektstand und verwendet
`tb_vm::project::ProjectCompiler`. `CompileStats` zählt geparste, übersetzte und
wiederverwendete Module. Der Cache liegt nur im Speicher. Sein Verlust führt
zur vollständigen Neuübersetzung, ohne das Dateiformat zu ändern.
Die Schlüssel vergleichen Include-Inhalte und Herkunft, Modulidentität,
aufgelöste Importverträge und den Forms-Katalog. Private Rumpfänderungen lassen
andere Modulprodukte bestehen. Konstante Importwerte werden transitiv neu
aufgelöst; unbenutzte importierte Konstanten invalidieren keine unabhängigen
Module. Importierte TYPEs und Prozeduren gehören zu den unverketteten Tabellen
und damit zum Modulvertrag. Eigene Quellorte bleiben Bestandteil des Schlüssels;
verschobene fremde Prozedurzeilen sind keine Signaturänderung. Änderungen an
Quelltabellen oder Modulreihenfolge werden konservativ neu geparst. Der bestehende
Linker baut sämtliche globalen Tabellen aus unverknüpften Produkten neu auf und
prüft COMMON-Kompatibilität. Forms-Anfangswerte werden beim Link frisch eingesetzt.
Erfolge und Diagnosen gehören zu Projektrevision, expandierten Quellen und Forms.
`current_compilation` und `current_diagnostics` geben nur einen dazu passenden
Stand zurück; ein Fehler macht keinen früheren Erfolg aktuell. Geöffnete
Include-Puffer bleiben maßgeblich gegenüber externen Dateiänderungen. Noch nicht
geöffnete Includes werden erneut vom Loader gelesen und verglichen. Start und
Fortsetzen der VM werden in Change 04 an diese Schnittstelle angebunden.
Release-Messungen und Aufruf stehen in [tbvm-design.md](tbvm-design.md).

View File

@@ -244,7 +244,9 @@ Nutzer — verworfen: erfordert Rust-Toolchain beim Anwender.
Definitionen. Echte lokale Duplikate werden diagnostiziert. SHARED
bleibt modullokal. COMMON-Variablen desselben Blocks und derselben vollständigen
Variablenidentität teilen einen Slot; Elementtyp, Rang und bekannte Grenzen
müssen kompatibel sein. Ein inkrementeller IDE-Cache ist weiterhin geplant.
müssen kompatibel sein. Der IDE-Cache speichert Parsing und unverknüpfte
Modulprodukte im vorhandenen Projektcompiler; der Vollcompile nutzt dieselben
Schritte mit einem leeren Cache. Details stehen in [ide-bedienung.md](ide-bedienung.md#übersetzung-und-revisionsbindung).
- Keine Optimierungspasses. Erlaubt sind nur Gratis-Optimierungen im
Codegen (Konstantenfaltung im Ausdruck, Peephole beim Emit).
- Budget als Test verankern (Phase 2): Benchmark-Projekt (~50k Zeilen)
@@ -628,3 +630,24 @@ die Entscheidungen sind Lückenfüller, keine Setzungen gegen das Vorbild.
vorhandenem Array prüft es Elementtyp und die ausgewerteten Grenzen, ohne
Werte oder Handle zu ersetzen (Konflikt: Fehler 13). Statisch erkennbare
COMMON-Typ-/Grenzenkonflikte werden bereits beim Linken diagnostiziert.
### Inkrementeller Compile (Phase 5, Change 03)
Messung vom 2026-09-06 auf macOS/aarch64, Apple M5 Max. Aufruf:
`cargo bench -p tb-vm --bench compile`; Release mit opt-level=3, LTO und
codegen-units=1. Derselbe Generator erzeugt das Referenz-Einzelmodul mit
508 Zeilen und das Projekt mit 20 Modulen / 49.760 Zeilen. Vollcompile und
Cacheänderung schließen die Projektauflösung und den Link ein. Cacheänderungen
ändern einen privaten Prozedurrumpf; sieben Läufe liefern den Median und prüfen
die Zahl tatsächlich neu übersetzter Module. Die Grenzwerte werden nur im
expliziten Release-Benchmark geprüft, nicht in normalen Debug-Tests.
| Referenz | Vollcompile | Cacheänderung (Median) | Neu / wiederverwendet | Budget |
| --- | ---: | ---: | ---: | ---: |
| Einzelmodul, 508 Zeilen | 1,21 ms | 0,74 ms | 1 / 0 | < 50 ms: erfüllt |
| Projekt, 49.760 Zeilen | 103 ms | 22,10 ms | 1 / 19 | < 1.000 ms: erfüllt |
Der Vollcompile des Einzelmoduls ist wie im bestehenden Harness der beste
von zehn Läufen; das Projekt wird einmal vollständig gemessen. Der Benchmark
zählt 335.421 verknüpfte Instruktionen. Diese Werte sind eine lokale Messung,
keine hardwareunabhängige Zeitgarantie.