Phase 5: Editor und inkrementellen Compiler implementieren und archivieren
This commit is contained in:
@@ -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 0–3 setzt vier Lesezeichen je Ansicht;
|
||||
Ctrl+Q, dann 0–3 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).
|
||||
|
||||
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user