Pipeline, adım adım
- Ayrıştırma (SWC). Kaynak dosyalar, Rust-yerel TypeScript ayrıştırıcısı olan SWC ile ayrıştırılır, bu sayede büyük projeler bile milisaniyeler içinde ayrıştırılır. Modül codegen'i, dönüşüm geçişleri ve sembol taraması çekirdekler arasında paralel çalışır.
- Tip çözümleme. Derleyici bildirilen tipleri çözümler ve geri kalanını çıkarır, kod üretimi başlamadan önce her ifadeye somut bir tip verir.
- Tipli HIR & monomorphization. AST, tipli bir yüksek seviye IR'a indirgenir. Generic fonksiyonlar ve sınıflar monomorphize edilir —
Stack<number> gibi her somutlaştırma kendi somut tipleriyle ayrı ayrı derlenir, bu yüzden generic'lerin runtime'da hiçbir maliyeti olmaz. Tiplerin bilindiği yerlerde metot çağrıları statik dağıtıma, nesne alanları ise doğrudan, sabit ofsetli okumalara dönüşür. - Codegen (LLVM). HIR, LLVM IR'a indirgenir ve LLVM'in optimizasyon pipeline'ından geçirilir — inlining, döngü optimizasyonları, vektörleştirme — ardından hedef için makine kodu olarak üretilir.
- Bağlama (Link). Çıktı, sıradan bir platform çalıştırılabilir dosyasıdır: macOS'ta Mach-O, Linux'ta ELF, Windows'ta PE — artı mobil, saat, TV ve WebAssembly hedefleri.
Bunun LLVM tarafı — neden Cranelift yerine LLVM seçildiği, NaN-boxing'in dinamik değerleri nasıl temsil ettiği, optimize edicinin tipli IR ile ne yaptığı — kendi derinlemesine incelemesine sahip: LLVM Üzerinde TypeScript. NaN-boxing, statik dağıtım ve sıfır maliyetli soyutlamalar gibi implementasyon detayları derleyici iç yapısında ele alınır.
Peki dinamik kod ve npm ne olacak?
TypeScript, alt katmanda hâlâ JavaScript'tir ve yerel bir TypeScript derleyicisi bu konuda dürüst olmak zorundadır. Perry'nin resmi test262 paketine karşı uyumluluğu ölçülür ve yayınlanır — v0.5.1146 itibarıyla String semantiği %79, Array ise %72 seviyesinde ve her sürümde yükseliyor. Saf TypeScript/JavaScript npm paketleri perry.compilePackages ile yerel olarak derlenir: axios, zod v4, express, fastify ve hono bugün derlenip çalışıyor. Tam motor semantiğine ihtiyaç duyan kod, --enable-js-runtime ile gömülü bir V8 fallback'ine geçiş yapabilir.
Tüm hikaye şurada: Real npm packages and a conformance sweep.
Perry, diğer “yerel TypeScript” girişimleriyle nasıl ilişkilidir
Perry, TypeScript'in tip açıklamalarına bakıp bunda bir derleme fırsatı gören tek proje değil — ama yaklaşımlar keskin biçimde farklılaşıyor. AssemblyScript, katı bir TypeScript benzeri dili yalnızca WebAssembly'e derler: kasıtlı olarak JavaScript ile uyumlu değildir ve işletim sistemi çalıştırılabilir dosyaları ya da yerel UI üretmez. Meta'nın Static Hermes'i, ağırlıklı olarak React Native için Hermes motoru içinde tipli bir JavaScript alt kümesini ahead-of-time derler — 2026 ortası itibarıyla bu hâlâ kaynaktan derlenmesi gereken bir araştırma projesidir ve React Native'de fiilen dağıtılan Hermes V1 motoru statik özellikleri içermez (tam karşılaştırma).
Perry'nin bahsi her iki eksende de farklı: girdi dili olarak standart TypeScript, çıktı olarak da CLI, sunucu ve GUI gibi sıradan platform çalıştırılabilir dosyaları — bugün Homebrew, APT, winget ya da npm üzerinden kurulabilir.
Tek derleyici, on hedef
Kod üretimi LLVM üzerinden geçtiği için tek bir kod tabanı; macOS, iOS, iPadOS, Android, Linux, Windows, watchOS, tvOS, WebAssembly ve düz Web/JS'e derlenir — Windows, macOS ve iOS ikili dosyalarının bir Linux makinesinden cross-compile edilmesi dahil. GUI uygulamaları, perry/ui kullanır; gerçek platform widget'ları (AppKit, UIKit, GTK4, Win32, JNI üzerinden Android) üzerinde deklaratif bir API — web view yok.
Bunun diğer yaklaşımlara karşı nasıl bir sonuç verdiği: Perry vs Bun, Deno, Electron, Tauri, React Native ve Static Hermes.