Add documentation for analysis metrics
This commit is contained in:
@@ -0,0 +1,49 @@
|
||||
# Erweiterungen für NodeMetrics und Analyse-Strategie
|
||||
|
||||
Durch die `NodeMetrics`-Dekoration können wir Daten sammeln, die entweder den **Optimizer steuern** oder dem **Linker/VM** bei der effizienten Ausführung helfen. Da der Optimizer den AST massiv verändert, müssen wir zwischen zwei Analyse-Phasen unterscheiden.
|
||||
|
||||
## Die Multi-Pass Strategie
|
||||
|
||||
1. **Pre-Optimization Analysis (Pass 1):** Sammelt Heuristiken, um Optimierungen (Inlining, Folding) überhaupt erst zu ermöglichen oder zu begrenzen.
|
||||
2. **Optimizer:** Transformiert den Baum (Inlining dupliziert Code, DCE löscht Code).
|
||||
3. **Post-Optimization Analysis (Pass 2):** Berechnet die finalen, exakten Fakten für das Backend (VM/Linker), basierend auf dem "geschrumpften" Baum.
|
||||
|
||||
---
|
||||
|
||||
## 1. Steuerungs-Metriken (Pre-Optimization)
|
||||
*Helfen dem Optimizer, Entscheidungen zu treffen.*
|
||||
|
||||
### A. Estimated Complexity Score
|
||||
* **Was:** Anzahl der Knoten im AST-Zweig.
|
||||
* **Nutzen:** Inlining-Budget. Statt fixer Tiefe wird nach Größe entschieden: "Inline diese Funktion nur, wenn sie < 20 Knoten hat."
|
||||
|
||||
### B. Initial Mutation Status
|
||||
* **Was:** Wird eine Variable (Local/Global) jemals mit `Set` verändert?
|
||||
* **Nutzen:** Wenn nein, kann der Optimizer sie wie eine `const` behandeln und den Wert überall dort einsetzen, wo sie gelesen wird (Aggressive Inlining).
|
||||
|
||||
### C. Purity (Bereits implementiert)
|
||||
* **Nutzen:** Erlaubt Constant Folding und das Entfernen von ungenutzten Aufrufen (DCE).
|
||||
|
||||
---
|
||||
|
||||
## 2. Backend-Metriken (Post-Optimization)
|
||||
*Werden nach der Optimierung neu berechnet, um der VM/Linker Fakten zu liefern.*
|
||||
|
||||
### A. Final Usage Counts (Dead Code Elimination)
|
||||
* **Was:** Wie oft wird eine Funktion/Variable im *finalen* Code noch referenziert?
|
||||
* **Nutzen:** Globale Funktionen, die nach dem Inlining nirgends mehr aufgerufen werden, können vom Linker komplett aus dem Environment entfernt werden.
|
||||
|
||||
### B. Escape-Analyse (Closure-Optimierung)
|
||||
* **Was:** Verlässt eine Lambda-Instanz ihren Erzeugungs-Scope (z.B. als Rückgabewert)?
|
||||
* **Nutzen:**
|
||||
* **Stack vs. Heap:** Nicht-escapende Lambdas können von der VM auf dem Stack (oder in einem Pool) verwaltet werden, statt teure Heap-Allocations für das `Closure`-Objekt auszulösen.
|
||||
* **Direct Call:** Aufrufe solcher Lambdas können zu direkten Sprüngen/Calls optimiert werden.
|
||||
|
||||
### C. Resource Requirements
|
||||
* **Was:** Maximale Stack-Tiefe, Anzahl benötigter Register/Slots.
|
||||
* **Nutzen:** Die VM kann beim Aufruf exakt den benötigten Speicher reservieren, ohne dynamisch wachsen zu müssen.
|
||||
|
||||
---
|
||||
|
||||
## Fazit
|
||||
Einige Werte (wie `UsageCount` oder `Complexity`) sind vor der Optimierung nur Schätzungen, da der Optimizer sie durch Code-Duplikation (Inlining) oder Löschung (DCE) verändert. Erst der zweite Analyse-Pass nach dem Optimizer liefert die "Wahrheit", die für Backend-Optimierungen wie die Escape-Analyse kritisch ist.
|
||||
Reference in New Issue
Block a user