Derleyici İç Yapısı
Perry'yi hızlı yapan temel tasarım kararları
01NaN-Boxing
Değerler, işaretçiler için özel bit kalıplarına sahip 64-bit float olarak depolanır, bu da union tiplerini runtime yükü olmadan mümkün kılar. Bu, (string | number)[]'in verimli çalışmasını sağlar.
Tip bilgilerini doğrudan IEEE 754 NaN payload bitlerinde kodlayarak, Perry tagged union veya boxed değer ihtiyacını ortadan kaldırır. Tek bir 64-bit kelime herhangi bir JavaScript değer tipini temsil edebilir — sayılar doğal gösterimlerini kullanırken, dizeler, nesneler ve diğer heap-allocated değerler NaN aralığında kalan işaretçi bit kalıplarını kullanır.
02Monomorphization
Generic'ler Rust'ta olduğu gibi derleme zamanında özelleştirilir. Her tip somutlaştırması optimize edilmiş kod üretir ve runtime tip kontrolü yükünü ortadan kaldırır.
Array'<'number'>' ve Array'<'string'>' yazdığınızda, Perry iki ayrı, tamamen optimize edilmiş implementasyon üretir. Bu, sayılar üzerindeki dizi işlemlerinin doğrudan makine aritmetiği kullanması demektir — tip koruması yok, dinamik dağıtım yok, boxing yok.
03Static Dispatch
Sanal tablo yok. Metot çağrıları derleme zamanında çözümlenir ve doğrudan fonksiyon çağrıları ile satır içi optimizasyonlar mümkün olur.
Geleneksel OOP runtime'ları metot çözümlemesi için vtable kullanır ve her çağrıda bir dolaylama katmanı ekler. Perry tüm metot çağrılarını derleme sırasında statik olarak çözümler ve arayüz metot çağrılarını doğrudan atlamalara dönüştürür. Bu ayrıca agresif satır içi almayı da mümkün kılar — küçük metotlar genellikle doğrudan çağrı noktalarına katlanır.
04Zero-Cost Abstractions
TypeScript sınıfları, arayüzleri ve generic'leri runtime temsil yükü olmadan verimli yerel koda derlenir.
TypeScript'in tip sistemi yalnızca derleme zamanında var olur — ve Perry bunu kelimesi kelimesine uygular. Arayüzler hiçbir runtime kodu üretmez. Sınıf hiyerarşileri düzleştirilir. Generic kısıtlamalar somut tiplere çözümlenir. Derlenen ikili dosya yalnızca gerçek mantığı içerir, yorumlayıcıların tipik olarak taşıdığı soyutlama mekanizması olmadan.