Rust ile Yazılmış Bir TypeScript Yerel Derleyicisi

Perry, zaten yazdığınız TypeScript'i makine koduna derler — tıpkı bir Rust ya da Go araç zincirinin kendi dilini derlediği gibi. Transpile edilmiş JavaScript yok, sanal makine yok, hedef sistemde runtime yok.

Transpiler değil. Runtime değil.

Çoğu TypeScript aracı iki aileden birine girer. Transpiler'lar — tsc, SWC, esbuild — tipleri kontrol edip ayıklar, ardından daha sonra bir motorun çalıştırması için JavaScript üretir. Runtime'lar — Node.js, Bun, Deno — bu motorların ta kendisidir: programınız her başladığında JavaScript'i ayrıştırır, yorumlar ve JIT ile derler.

Yerel derleyici üçüncü ailedir ve TypeScript için bu alan büyük ölçüde boş kalmıştır. Perry, tip açıklamalarını ayıklanacak dokümantasyon olarak değil, kod üretimini yönlendiren girdi olarak ele alır. perry compile main.ts komutunun sonucu, makine kodu içeren bağımsız bir çalıştırılabilir dosyadır — genellikle 2–5 MB, yaklaşık bir milisaniyede başlar.

Nasıl Çalışır

TypeScript kaynağından yerel çalıştırılabilir dosyaya saniyeler içinde

TypeScript.ts dosyaları
SWC
AyrıştırıcıHızlı ayrıştırma
HIR
DönüşümMonomorphization
LLVM
Kod ÜretimiMakine kodu
Çalıştırılabilir2-5 MB ikili dosya

Derleyicinin kaputun altında nasıl çalıştığını öğrenmek ister misiniz? Derleyici iç yapısı

Derinlemesine inceleme: LLVM üzerinde TypeScript — monomorphization, NaN-boxing ve Perry'nin Cranelift'ten neden ayrıldığı.

Pipeline, adım adım

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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.

Derleyiciyi deneyin

Perry'yi kurun ve bir dakikadan kısa sürede ilk yerel ikili dosyanızı derleyin.