Ana Sayfa

Futhark Neden Kuyruk Özyinelemesine İzin Vermiyor?

1 dk okuma

Futhark, diğer birçok fonksiyonel programlama dilinin aksine, fonksiyonların özyinelemeli olmasına izin vermemesiyle dikkat çekiyor. Bu durum, Futhark'ın paralel bir dil olması ve özyinelemeli döngülerin doğası gereği ardışık işlemler olmasıyla kısmen açıklanabilir. Ancak asıl neden, dilin GPU'lar gibi kısıtlı hedefler için kod üretme hedefidir. GPU'larda özyineleme, yığın (stack) kullanımı üzerindeki kısıtlamalar nedeniyle en iyi ihtimalle verimsiz, çoğu zaman ise imkansızdır. Bu sorunu aşmak için Futhark, semantik olarak yerel bir kuyruk özyinelemeli fonksiyona eşdeğer olan özel bir ardışık döngü (sequential looping) sözdizimi sunar. Örneğin, loop acc = 1 for i < n do acc * (i+1) yapısı, yığın alanı kullanmadan döngü oluşturulmasını sağlar ve C dilindeki for veya while döngülerine dönüştürülebilir.

Peki, neden Futhark diğer fonksiyonel diller gibi kuyruk çağrısı eleme (tail call elimination) yapmıyor? Bunun temel nedeni, Futhark'ın çoğu backend'inin doğrudan makine kodu üretmek yerine C kodu üretmesidir. Bu C kodu daha sonra GPU sürücüleri tarafından sağlanan kernel compiler'lar tarafından işlenir. Kuyruk çağrılarını C'de taşınabilir ve verimli bir şekilde ifade etmek zordur. Trampolining gibi teknikler mevcut olsa da, bunların GPU compiler'larını karıştırmasından endişe ediliyor. Futhark, bu compiler'ların beklediği C kodunu üreterek performans avantajı elde etmeyi hedefler. Dilin ana amacı sadece çalışmak değil, hızlı çalışmaktır ve hızlı çalıştıramayacağı özelliklerle ilgilenmemektedir. Bu nedenle, genel kuyruk çağrısı eleme veya sadece kuyruk özyinelemesinin optimizasyonu Futhark için sadece bir optimizasyon değil, "demirbaş bir garanti" olmak zorundadır.

İçgörü

Futhark'ın GPU'lar gibi kısıtlı donanımlarda yüksek performans hedefi, dilin tasarımını ve özyineleme gibi temel fonksiyonel programlama özelliklerine yaklaşımını derinden etkiliyor.

Kaynak