Files
RustAst/gemini.md
T
Michael Schimmel 0dfbda5e15 Refactor VM to use trait objects for closures
The `CallFrame` struct and various VM methods now use `Rc<dyn Object>`
to hold closures, allowing for more flexibility and avoiding unnecessary
cloning.

This change also addresses the performance concern regarding deep copies
of closures, preferring `Rc<dyn Trait>` with local `downcast_ref` where
appropriate.

Additionally, a documentation note has been added to `gemini.md`
regarding this performance preference in Rust.
2026-02-28 14:26:29 +01:00

71 lines
3.4 KiB
Markdown

## Rust-Portierung des Delphi-AST-Compilers
* Dieses Repository enthält den Rust-Port des Delphi-Compilers.
* Das Ziel ist, die alte Delphi-Codebase nach Rust zu portieren.
* Die alte Delphi-Codebase ist nicht zu verändern.
Wichtig: zentraler Einstiegspunkt ist Delphi/Myc.Ast.Environment.pasund die dort referenzierten Units.
### Design
* Der AST soll 1st class citizen sein. Das Skript ist nur eine mögliche Art, ihn darzustellen.
* Ein geplante Darstellung des AST ist vollständige grafische Visualisierung.
* Es wird eine DSL für Finanzanalyse.
* Aufgrund der geforderten Visualisierbarkeit muss der untyped AST (das, was der User bearbeiten kann) möglichst simpel sein. Komplexität muss vom System übernommen werden.
* Closures sind Key-Feature.
### Concurrency
* Die Root-Scopes sind die Grenze für Multithreading. Nichts verlässt den Root-Scope und alles innerhalb des Scope ist Single-Threaded.
* Globals sind nach dem Bootstrapping immutable.
* Das das Skript single-threaded ist, kann auf atomare Operationen (Mutex, Arc) verzichtet werden!
### Spezielle Datentypen
* Serien sind "unendliche" Queues mit maximaler Länge (Lookback). Serie[0] ist das zuletzt gepushte Item.
* Streams sind virtuelle Konfigurationen aus Serien, die in der Lage sind einen neuen Item-Record zu propagieren.
* Pipes sind Streams mit einer weiteren Funktion: Sie können einen Stream als Input akzeptieren und einen anderen Stream als Output produzieren.
## Portierungsregeln
* Wir wollen die Sprachfeatures von Rust nutzen.
* Der Code soll aber so gut wie möglich nach Rust-Style-Guidelines geschrieben werden.
* Dokumentation nach Rust-Regeln.
* Im Code und den Kommentaren muss alles auf englisch sein.
## Rust
* Performance: Bevorzuge `Rc<dyn Trait>` + lokales `downcast_ref` gegenüber Deep Copies via `Rc::new(obj.clone())`.
## Interaktion
* Ich kann Rust noch nicht so gut. Erkläre mir, was du machst und welche Konzepte du nutzt. Ich will was dazulernen.
* Wenn clippy etwas vorschlägt, von dem du glaubst, dass es nicht stabil ist, dann überprüfe die aktuelle Version. Wahrscheinlich ist das Feature mittlerweile im trunk. Wir gehen immer davon aus, dass clippy recht hat.
* Keine Interaktion mit GIT. Kein Commit, oder ähnliches. Schlage auch nichts dergleichen vor.
* Gehe immer schrittweise vor. Zeige mir, was du vor hast, bevor du Code erzeugst.
* Sprich im Chat deutsch mit mir.
## Testing & Debugging
* Das Projekt enthält eine Testsuite für Skripte. Logik in src/utils/tester.rs. Diese Testes werden automatisch in "cargo test" eingebunden.
* Nach Fertigstellung einer Aufgabe, oder wenn ich zum Testen auffordere: Warnungen sind zu eliminieren. Tests müssen durchlaufen. Wenn alles funktioniert, muss auch clippy ohne Beanstandungen durchlaufen.
* Du kannst Skripte selbst testen! Nutze das ast-tool:
> ./target/release/ast.exe --help
MYC AST Compiler & Benchmarker
Usage: ast.exe [OPTIONS] [FILE]
Arguments:
[FILE] The script file to run or benchmark
Options:
-e, --eval <EVAL> Run a script string directly
-b, --bench Run benchmarks (Only allowed in Release mode)
-u, --update-bench Update the benchmark baseline (Only allowed in Release mode)
-d, --dump Dump the compiled AST
-t, --trace Run with TracingObserver enabled
--no-opt Disable optimization
-h, --help Print help
-V, --version Print version