Files
dexpr/docs/architecture.md
2026-04-05 16:08:59 +03:00

92 lines
3.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Genel Mimari
dexpr, kaynak kodu parse edip bytecode'a derleyen ve register tabanlı bir VM üzerinde çalıştıran bir ifade değerlendirici (expression evaluator) ve bytecode VM'dir.
---
## Pipeline
```
Kaynak Kod (.dexpr)
[PARSER] ← PEG tabanlı gramer kuralları
AST (Expr, Stmt, Value)
[COMPILER] ← Tek geçişli derleme
Bytecode (ham byte dizisi)
[VM] ← 8 register, global'ler
Sonuç (veya kaynak konum bilgili hata)
```
---
## Temel Tasarım Kararları
1. **Register tabanlı VM:** Stack tabanlı VM'lere göre daha az komut, daha hızlı çalışma
2. **8 register limiti:** Basitlik ve hız arasında denge
3. **Tek geçişli derleme:** Fonksiyon desteği kaldırıldığı için iki geçişe gerek yok
4. **Label tabanlı atlamalar:** Son geçişte çözümlenir
5. **Span izleme:** Derleme ve çalışma zamanı hataları kaynak kod konumunu gösterir
6. **Value serileştirme:** Sabitler doğrudan bytecode'a gömülür
7. **Object tipi:** `IndexMap<SmolStr, Value>` tabanlı anahtar-değer nesneleri; özellik erişimi (`obj.field`), iç içe atama (`a.b.c = expr`) ve built-in metodlar (`keys`, `values`, `contains`, `get`, `length`) desteklenir
8. **Sadece global değişkenler:** Tüm değişkenler global scope'ta; host uygulamadan `set_global` ile değer aktarılır
9. **Bytecode cache:** Compile edilmiş bytecode saklanıp farklı global değerlerle tekrar çalıştırılabilir
10. **Harici fonksiyonlar:** Host fonksiyonları VM'de isimle kayıt edilir, runtime'da HashMap lookup ile çözümlenir
11. **Harici metodlar:** Tipe özel host metodları eklenebilir, built-in metodlar bulunamazsa kontrol edilir
12. **Expression return:** `execute()` son ExprStmt'ın değerini döndürür — tek satır formüller doğrudan sonuç verir
---
## Tipik Kullanım
```rust
use dexpr::{ast::value::Value, compiler::Compiler, parser, vm::VM};
// 1. Parse
let ast = parser::program(source_code)?;
// 2. Compile
let mut compiler = Compiler::new();
let bytecode = compiler.compile(ast)?;
// 3. Execute (bytecode cache'lenip tekrar kullanılabilir)
let mut vm = VM::new(&bytecode);
vm.set_global("input", Value::Number(dec!(42)));
vm.register_function("getRate", |args| { Ok(Value::Number(dec!(34.5))) });
let result = vm.execute()?; // Son expression'ın değerini döndürür
// veya: let output = vm.get_global("output");
```
---
## Bağımlılıklar
| Crate | Kullanım |
|-------|----------|
| `rust_decimal` | Keyfi hassasiyetli ondalık aritmetik |
| `peg` | PEG tabanlı parser üreteci |
| `smol_str` | Kısa string'ler için optimize edilmiş tip |
| `micromap` | Kompakt hashmap (global değişkenler için) |
| `bumpalo` | Bump allocator (hızlı bellek ayırma) |
| `thiserror` | Hata türleri için derive makrosu |
| `rustc-hash` | Hızlı hash fonksiyonu |
| `smallvec` | Stack-allocated vektörler |
| `indexmap` | Sıralı hashmap (Object tipi için) |
---
## Modül Referansları
- [AST Modülü](ast.md) — İfadeler, deyimler, değer türleri
- [Parser Modülü](parser.md) — Gramer kuralları, ayrıştırma
- [Opcodes Modülü](opcodes.md) — Bytecode komut seti
- [Bytecode Modülü](bytecode.md) — Serileştirme, disassembler
- [Compiler Modülü](compiler.md) — AST → bytecode dönüşümü
- [VM Modülü](vm.md) — Sanal makine, çalıştırma
- [Language Info Modülü](language_info.md) — Editör metadata üretimi
- [Editor Modülü](editor.md) — CodeMirror 6 dil desteği (codemirror-lang-dexpr)