- Tail Call: Bir fonksiyonun dönmeden hemen önce yaptığı fonksiyon çağrısı. Tail Call optimizasyonu gerçekleştiğinde
jmp komutu kullanılır ve çağrı yığını küçülür.
- Avantajları:
- Yığın belleği kullanımını O(n)'den O(1)'e düşürür.
- Fonksiyon çağrısının performans ek yükünü ortadan kaldırarak verimli bir yineleme kontrol yapısı olarak kullanılabilir.
Yorumlayıcı döngüsünün sorunları
- Sorunlar:
- Fonksiyon büyüdükçe ve kontrol akışı karmaşıklaştıkça önemli verileri register'larda tutmak zorlaşır.
- Hızlı yol ile yavaş yol karıştığında kod kalitesi düşer.
Tail Call kullanarak yorumlayıcı döngüsünü iyileştirme
- Çözüm: Tail Call kullanarak her işi küçük fonksiyonlara ayırmak ve her fonksiyonun bir sonraki işi Tail Call ile çağırmasını sağlamak.
- Avantajları:
- Register atamasını kontrol edebilirsiniz.
- Hızlı yol ile yavaş yolu ayırarak kod kalitesi korunur.
- Bağımsız komut dizileri optimize edilebilir.
Sınırlamalar
- Tail Call olmayan çağrılar varsa sorun: Tail Call olmayan çağrılar varsa stack frame oluşturulur ve veriler yığına yazılır; bu da performansı düşürür.
- Karmaşık exception handling: Exception handling karmaşık olduğunda kod tekrarı ve karmaşıklık artar.
- Taşınabilirlik sorunu:
musttail özniteliği standart olmadığından tüm derleyiciler tarafından desteklenmez.
GN⁺ Özeti
- Tail Call optimizasyonu performans artışında önemli rol oynar ve özellikle Protobuf ayrıştırmada büyük başarı sağlar.
- Bu teknik, C ile yazılmış başlıca dil yorumlayıcılarına da uygulanabilir (Python, Ruby, PHP, Lua vb.).
musttail özniteliğinin taşınabilirlik sorunu çözülmesi gereken bir konu.
- Benzer işlev sunan projeler arasında LuaJIT ve wasm3 WebAssembly yorumlayıcısı bulunur.
1 yorum
Hacker News görüşleri
C standart önerisi,
return goto (expression);biçiminde tail call içeriyor[[musttail]]özelliğini standartlaştırmaya kıyasla, yerel nesnelerin ömrü garanti edildiği için kapsamlı escape analysis gerektirmiyorRust meraklıları için
becomeanahtar sözcüğünü ekleyen eski bir RFC vardıC++'ta yorumlayıcıların hız kazanma yöntemi çoğunlukla computed goto kullanmak
Tail call kullanarak context switch yapma sorunu, calling convention kullanan bir fonksiyon gerektiriyor
[[musttail]]özniteliğinin GCC, Visual C++ ve diğer popüler derleyicilere yayılacağı umuluyor[[musttail]]özniteliği GCC'ye eklenme sürecindeC++ desteğinden söz edilirken, C++'ta tail call'ın neredeyse hiç olmadığına dikkat çekiliyor
C++
[[musttail]]fonksiyonunda exception fırlatılırsa ne olacağı merak ediliyorBasit örneklerde iyi code generation için
__attribute__((musttail))gerekmediği belirtiliyorTrampoline kullanarak dönen function pointer'ı dış döngüde çağırma yaklaşımının ne kadar hızlı olduğu merak ediliyor
[[musttail]]ile sarmalanmış exception path örneğinin netleştirilmesi isteniyor[[musttail]]özelliğinin stack frame kurulumu ve register spilling'i neden engellediği açıklanıyor