[Fikir] VM Yorumlayıcı Döngüsü ve Dispatch Stratejisi #77

Closed
opened 2026-06-14 22:13:56 +03:00 by saqut · 2 comments
Owner

Giriş (Nedir, Neden Önemli?)

Bytecode VM'in kalbi, her komutu okuyup ilgili işlemi yapan "yorumlayıcı döngü" (interpreter loop / dispatch loop). Bu döngünün nasıl yazılacağı hem performansı hem de kod okunabilirliğini etkiler.


Gelişme (Olası Yaklaşımlar)

  • Switch-case dispatch: switch(opcode) { case ADD: ...; case JUMP: ...; }. En basit, en okunabilir, derleyici bağımsız (portable). saQut'un "incelenebilir" felsefesiyle en uyumlu başlangıç noktası.
  • Computed goto / jump table: Daha hızlı ama derleyiciye özel uzantılar gerektirir (GCC/Clang &&label), taşınabilirlik düşer. Hız öncelik değilse (ADR-015) v0'da gereksiz karmaşıklık.
  • Threaded code: Her IR komutunu doğrudan bir C++ fonksiyon pointer'ına çeviren ileri teknik — şimdilik kapsam dışı.
  • v0 önerisi: basit switch-case + her adımda "trace" modu (her komut çalışmadan önce/sonra durum dump edilebilir, ADR-016 FFI seam ile print zaten bu yola hazırlanıyor).

Açık Sorular

  • Yorumlayıcı tek bir run() fonksiyonu mu olacak, yoksa her opcode için ayrı handle_* fonksiyonu mu (okunabilirlik vs. fonksiyon çağrı maliyeti — ama maliyet öncelik değil)?
  • Adım-adım çalıştırma (step) ve "tüm programı çalıştır" (run) aynı döngüyü mü paylaşacak?

İmza/Yorum: "Önce dikey dilim" ilkesi burada da geçerli: en basit switch-case ile fibonacci çalışsın, optimize dispatch ileri bir konu.

### Giriş (Nedir, Neden Önemli?) Bytecode VM'in kalbi, her komutu okuyup ilgili işlemi yapan "yorumlayıcı döngü" (interpreter loop / dispatch loop). Bu döngünün nasıl yazılacağı hem performansı hem de kod okunabilirliğini etkiler. --- ### Gelişme (Olası Yaklaşımlar) - **Switch-case dispatch:** `switch(opcode) { case ADD: ...; case JUMP: ...; }`. En basit, en okunabilir, derleyici bağımsız (portable). saQut'un "incelenebilir" felsefesiyle en uyumlu başlangıç noktası. - **Computed goto / jump table:** Daha hızlı ama derleyiciye özel uzantılar gerektirir (GCC/Clang `&&label`), taşınabilirlik düşer. Hız öncelik değilse (ADR-015) v0'da gereksiz karmaşıklık. - **Threaded code:** Her IR komutunu doğrudan bir C++ fonksiyon pointer'ına çeviren ileri teknik — şimdilik kapsam dışı. - v0 önerisi: basit switch-case + her adımda "trace" modu (her komut çalışmadan önce/sonra durum dump edilebilir, ADR-016 FFI seam ile `print` zaten bu yola hazırlanıyor). --- ### Açık Sorular - Yorumlayıcı tek bir `run()` fonksiyonu mu olacak, yoksa her opcode için ayrı `handle_*` fonksiyonu mu (okunabilirlik vs. fonksiyon çağrı maliyeti — ama maliyet öncelik değil)? - Adım-adım çalıştırma (step) ve "tüm programı çalıştır" (run) aynı döngüyü mü paylaşacak? *İmza/Yorum:* "Önce dikey dilim" ilkesi burada da geçerli: en basit switch-case ile fibonacci çalışsın, optimize dispatch ileri bir konu.
saqut added the
fikir
ir-vm
labels 2026-06-14 22:13:56 +03:00
Author
Owner

Switch-case dispatch seçildi ve uygulandı. Her opcode için ayrı dal, trace modu ileride eklenebilir. Fibonacci çalışıyor.

Switch-case dispatch seçildi ve uygulandı. Her opcode için ayrı dal, trace modu ileride eklenebilir. Fibonacci çalışıyor.
saqut closed this issue 2026-06-18 22:10:12 +03:00
Author
Owner

Düzeltme: önceki yorum hatalıydı. Dispatch switch-case doğru, ama VM mimarisi stack-tabanlı değil slot/register-tabanlıdır (bkz. #76 düzeltmesi).

Düzeltme: önceki yorum hatalıydı. Dispatch switch-case doğru, ama VM mimarisi stack-tabanlı değil **slot/register-tabanlıdır** (bkz. #76 düzeltmesi).
Sign in to join this conversation.
No description provided.