Ana içeriğe geç
Programlama

GCC iç içe fonksiyonları C++ lambda mimarisine benzer yapıyla derliyor

Öne çıkanlar

  • GCC, iç içe fonksiyonların eriştiği değişkenleri tek bir sentetik çerçeve yapısında toplayarak gizli göstericiyle aktarıyor.
  • WG14 komitesi, değişken yakalamayan yerel fonksiyonları C standardına eklemeyi öngören N3884 teklifini değerlendiriyor.
  • C++ birden fazla lambda için ayrı nesneler üretirken GCC ortak değişkenler için tek bir paylaşımlı yapı kullanıyor.

Martin Uecker, GNU Derleyici Koleksiyonu bünyesindeki iç içe fonksiyonların çalışma mekanizmasını ve bu yapının C++ lambda ifadeleriyle benzerliğini anlattı. İç içe fonksiyonlar, üst fonksiyonun değişkenlerine erişmediğinde kod tabanından bağımsız bir birim olarak derleniyor. Değişken erişimi içeren durumlarda ise geleneksel yığın çerçevesi göstericisi yerine modern bir sentetik yapı yöntemi tercih ediliyor. C standardizasyon komitesi WG14, değişken yakalamayan yerel fonksiyonları resmi standartlara dahil etmek için N3884 numaralı teklifi inceliyor.

GCC, iç içe fonksiyonları derleyicinin erken orta aşamasında dönüştürüyor. Bu aşamada üst fonksiyondan erişilen tüm değişkenler tek bir sentetik yapıda toplanıyor ve iç içe fonksiyona gizli bir gösterici bağımsız değişkeni olarak aktarılıyor. Üst fonksiyonun erişilmeyen değişkenleri bu yapıdan etkilenmiyor. Bu tasarım sayesinde derleyicinin geri kalanı, karmaşık yığın işlemleri yerine sıradan yapılar üzerinden genel optimizasyonları doğrudan uygulayabiliyor.

Mekanizma, C++ derleyicilerinin lambda ifadelerini çağrılabilir nesnelere dönüştürme mantığıyla büyük ölçüde örtüşüyor. C++ tarafında yakalanan her lambda ifadesi için referans içeren ayrı bir nesne oluşturulurken GCC, aynı değişkeni kullanan birden fazla iç fonksiyon için tek bir paylaşılan çerçeve yapısı kuruyor. İki yaklaşım derleme sürecinde yapısal farklılık gösterse de çalışma mantığı ve anlambilim açısından tamamen örtüşüyor.

Kaynak

Bu özet yapay zekâ ile hazırlanmıştır; ayrıntılar ve doğrulama için orijinal kaynağa başvurun.