[Fikir] Fonksiyon Çağrı Mekanizması ve Call Frame Tasarımı #78

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

Giriş (Nedir, Neden Önemli?)

examples/fibonacci.sqt özyinelemeli (recursive) bir fonksiyon. VM'in fonksiyon çağrılarını (call/return), parametreleri ve yerel değişkenleri nasıl tuttuğu — yani call frame (çağrı çerçevesi) tasarımı — özyinelemenin doğru çalışması için kritik.


Gelişme (Olası Yaklaşımlar)

  • Her fonksiyon çağrısında bir "frame" oluşturulur: dönüş adresi, parametreler, yerel değişkenler için ayrılan yer. Bu frame'ler bir "call stack" üzerinde tutulur (host C++ heap'i üzerinde — ADR-015, özel allocator yok).
  • Özyinelemeli çağrılar (fibonacci(n-1), fibonacci(n-2)) her biri kendi frame'ine sahip olmalı — değişkenler birbirine karışmamalı (scope-based memory model, ADR-014).
  • Maksimum çağrı derinliği (stack overflow koruması) — basit bir sayaç/limit ile "stack taşması" hatası verilebilir (yeni bir E-kodu olabilir, ileride katalogla birleştirilir).

Açık Sorular

  • Frame boyutu derleme zamanında mı (compile-time, fonksiyonun yerel değişken sayısına göre) hesaplanır, yoksa dinamik mi büyür?
  • Fonksiyon dönüş değeri yığının üstüne mi konur (yığın-tabanlı VM ile uyumlu), yoksa ayrı bir "return register" mı kullanılır?

İmza/Yorum: Bu issue VM tasarımı (önceki issue) seçimine bağımlıdır; ama fibonacci'nin "bitti" tanımı (recursive + iterative) bu mekanizma olmadan anlamsızdır — birinci öncelikli IR/VM konusu.

### Giriş (Nedir, Neden Önemli?) `examples/fibonacci.sqt` özyinelemeli (recursive) bir fonksiyon. VM'in fonksiyon çağrılarını (call/return), parametreleri ve yerel değişkenleri nasıl tuttuğu — yani **call frame (çağrı çerçevesi)** tasarımı — özyinelemenin doğru çalışması için kritik. --- ### Gelişme (Olası Yaklaşımlar) - Her fonksiyon çağrısında bir "frame" oluşturulur: dönüş adresi, parametreler, yerel değişkenler için ayrılan yer. Bu frame'ler bir "call stack" üzerinde tutulur (host C++ heap'i üzerinde — ADR-015, özel allocator yok). - Özyinelemeli çağrılar (fibonacci(n-1), fibonacci(n-2)) her biri kendi frame'ine sahip olmalı — değişkenler birbirine karışmamalı (scope-based memory model, ADR-014). - Maksimum çağrı derinliği (stack overflow koruması) — basit bir sayaç/limit ile "stack taşması" hatası verilebilir (yeni bir E-kodu olabilir, ileride katalogla birleştirilir). --- ### Açık Sorular - Frame boyutu derleme zamanında mı (compile-time, fonksiyonun yerel değişken sayısına göre) hesaplanır, yoksa dinamik mi büyür? - Fonksiyon dönüş değeri yığının üstüne mi konur (yığın-tabanlı VM ile uyumlu), yoksa ayrı bir "return register" mı kullanılır? *İmza/Yorum:* Bu issue VM tasarımı (önceki issue) seçimine bağımlıdır; ama fibonacci'nin "bitti" tanımı (recursive + iterative) bu mekanizma olmadan anlamsızdır — birinci öncelikli IR/VM konusu.
saqut added the
fikir
ir-vm
labels 2026-06-14 22:13:57 +03:00
Author
Owner

Call frame tasarımı uygulandı: derleme zamanında slot sayısı hesaplanır, dönüş değeri stack üstüne konur. Özyinelemeli + iteratif fibonacci ikisi de çalışıyor.

Call frame tasarımı uygulandı: derleme zamanında slot sayısı hesaplanır, dönüş değeri stack üstüne konur. Özyinelemeli + iteratif fibonacci ikisi de çalışıyor.
saqut closed this issue 2026-06-18 22:10:13 +03:00
Author
Owner

Düzeltme: dönüş değeri yığına değil, caller'ın returnDestSlot'una doğrudan yazılıyor — register-tabanlı modelle tutarlı (bkz. #76 düzeltmesi).

Düzeltme: dönüş değeri yığına değil, **caller'ın `returnDestSlot`'una** doğrudan yazılıyor — register-tabanlı modelle tutarlı (bkz. #76 düzeltmesi).
Sign in to join this conversation.
No description provided.