Yayınlanma tarihi: 29 Ocak 2025
WebAssembly Çöp Toplama (WasmGC)
İki tür programlama dili vardır: çöp toplayıcı programlama dilleri ve manuel bellek yönetimi gerektiren programlama dilleri. Kotlin, PHP veya Java, bu tür programlama dillerine örnek olarak verilebilir. C, C++ veya Rust, ikinci gruba örnek gösterilebilir. Genel bir kural olarak, üst düzey programlama dillerinde standart bir özellik olarak çöp toplama özelliğinin bulunması daha olasıdır.
Basitleştirilmiş bir ifadeyle, çöp toplama, program tarafından ayrılmış ancak artık referans verilmeyen belleği geri alma girişimidir. Bu tür hafızalara "çöp" denir. Çöp toplama işlemini uygulamak için birçok strateji vardır. Anlaması en kolay yöntemlerden biri, amaç bellekteki nesnelere yapılan referansların sayısını saymak olan referans sayımıdır.
Bu durum başlangıç gibi görünse de programlama dilleri diğer programlama dillerinde uygulanır. Örneğin, PHP çalışma zamanı öncelikle C'de uygulanır. Geliştiriciler PHP gibi bir dili Wasm'e derlemek istiyorsa genellikle dilin ayrıştırıcısı, kitaplık desteği, çöp toplama ve diğer önemli bileşenler gibi tüm parçaları derlemeleri gerekir.
Wasm, tarayıcıda barındırıcı dil JavaScript bağlamında çalışır. Chrome'da JavaScript ve Wasm, Google'ın açık kaynak JavaScript motoru olan V8'de çalıştırılır. Ayrıca V8'de zaten bir çöp toplayıcı var. Bu, örneğin Wasm'e derlenmiş PHP kullanan geliştiricilerin, aktarılan dilin (PHP) bir çöp toplayıcı uygulamasını, zaten çöp toplayıcısı olan tarayıcıya gönderdiği anlamına gelir. Bu da kulağa geldiği kadar israftır. İşte burada WasmGC devreye girer.
WasmGC hakkında daha fazla bilgi edinmek için WebAssembly Çöp Toplama (WasmGC) artık Chrome'da varsayılan olarak etkin başlıklı makaleyi okuyun. Konuyu daha ayrıntılı incelemek isterseniz Çöp toplanan programlama dillerini WebAssembly'e verimli bir şekilde getirmenin yeni yolu başlıklı V8 blog yayınını inceleyin.
Wasm kuyruk çağrısı optimizasyonları
Mevcut işlevden dönmeden önce yürütülen son talimat bir çağrıysa bu çağrının son konumda olduğu söylenir. Derleyiciler, arayan çerçevesini atıp aramayı bir atlamayla değiştirerek bu tür aramaları optimize edebilir. Bu, özellikle yinelenen işlevler için yararlıdır. Örneğin, bağlı bir listenin öğelerini toplayan bu C işlevini ele alalım:
int sum(List* list, int acc) {
if (list == nullptr) return acc;
return sum(list->next, acc + list->val);
}
Normal bir çağrıda bu, O(n) yığın alanı tüketir: Listenin her öğesi, çağrı yığınına yeni bir çerçeve ekler. Yeterince uzun bir listeyle bu, yığının çok hızlı bir şekilde taşmasına neden olabilir. Son çağrı optimizasyonu, çağrıyı bir atlamayla değiştirerek bu yinelemeli işlevi etkili bir şekilde O(1) yığın alanı kullanan bir döngüye dönüştürür:
int sum(List* list, int acc) {
while (list != nullptr) {
acc = acc + list->val;
list = list->next;
}
return acc;
}
Bu optimizasyon özellikle işlevsel diller için önemlidir. Bunlarda döngüsel işlevler çok kullanılır. Haskell gibi saf işlevler, döngü kontrol yapıları bile sağlamaz. Her tür özel iterasyon genellikle bir şekilde yinelemeyi kullanır. Kuyruk çağrısı optimizasyonu olmadan, bu durum önemsiz olmayan herhangi bir programda çok hızlı bir şekilde yığın taşmasına neden olur. Aksi takdirde yığın alanı hızla tükenir.
WebAssembly başlangıçta bu tür son çağrı optimizasyonlarına izin vermiyordu ancak son çağrı uzantısı önerisiyle bu durum değişti. Daha ayrıntılı bilgi için V8 blogundaki WebAssembly son çağrıları makalesini okuyun.
Sonuçlar
WasmGC ve son çağrı optimizasyonları artık temel olarak kullanılabiliyor. Bu sayede daha fazla uygulama, daha iyi performans için bu özellikleri kullanabilir. Örneğin, Google E-Tablolar Google E-Tablolar hesaplama işleyicisini WasmGC'ye taşıyarak bu özelliği kullanmıştır.