Perry vs Bun
Bun; çalışma zamanını kodunuzla birlikte paketleyerek tek dosyalı çalıştırılabilir dosyalar da üretebilen, hepsi-bir-arada bir JavaScript/TypeScript çalışma zamanı, bundler, paket yöneticisi ve test koşturucusudur. Perry farklı bir yol izler: TypeScript'i LLVM aracılığıyla doğrudan yerel makine koduna derler — ikili dosyada JavaScript motoru yok, çalışma zamanı yok, sadece küçük bir yerel çalıştırılabilir dosya. Bun ve Perry, TS'i ikili dosyaya çevirme noktasında örtüşür ama o ikili dosyada bir JavaScript motorunun olup olmaması konusunda anlaşamazlar.
Bun nedir?
Bun, Zig ile yazılmış hızlı, hepsi-bir-arada bir JavaScript ve TypeScript araç setidir. `.ts` kaynağını doğrudan çalıştırır (ön-derleme adımı yok), JS motoru olarak JavaScriptCore kullanır ve bir bundler, paket yöneticisi ve test koşturucusu içerir. `bun build --compile`, Bun çalışma zamanını uygulamanızla birlikte tek bir çalıştırılabilir dosyada paketler. Bun; Linux, macOS ve Windows'u x64 ve arm64 üzerinde hedefler.
Perry nedir?
Perry, Rust ile yazılmış yerel bir TypeScript derleyicisidir. TypeScript'i LLVM aracılığıyla doğrudan yerel makine koduna derler — JavaScript motoru yok, çalışma zamanı yok, JIT yok. Çıktı tek bir ikili dosyadır (hello world için yaklaşık 330 KB; Fastify sunucusu gibi tam stdlib bir uygulama için ~48 MB). Perry; macOS, iOS, iPadOS, Android, Linux, Windows, watchOS, tvOS, WebAssembly ve Web dahil 10 platformu hedefler.
Yan yana
| Özellik | Perry | Bun |
|---|---|---|
| Çıktı | Yerel makine kodu (LLVM) | Kodunuz + Bun çalışma zamanı tek ikili dosyada paketlenir |
| İkili dosyada JavaScript motoru | Varsayılan olarak yok; --enable-js-runtime ile isteğe bağlı V8 (+~15 MB) | Her zaman JavaScriptCore |
| Hello-world ikili dosya boyutu | ~330 KB | ~50–100 MB (Bun çalışma zamanı dahil) |
| JIT | Hayır (AOT derlenmiş) | Evet (JavaScriptCore JIT) |
| Mobil hedefler (iOS, Android) | Evet — UIKit/JNI ile yerel UI | Hayır |
| Watch / TV hedefleri | watchOS, tvOS, Wear OS | Hayır |
| Yerel UI widget'ları | AppKit, UIKit, GTK4, Win32, JNI ile 25+ | Hayır (sunucu/CLI odaklı) |
| npm ekosistemi | Saf TS/JS paketleri yerel olarak derlenebilir; diğerleri isteğe bağlı V8 ile | Tam Node uyumlu npm |
| Kararlılık | 1.0 öncesi (alfa) | Kararlı (1.x) |
| Yazıldığı dil | Rust | Zig |
Perry'nin kazandığı yerler
- +Daha küçük ikili dosyalar — bir Perry hello world ~330 KB; bir Bun --compile hello world Bun çalışma zamanını içerir ve onlarca megabayt boyutuna çıkar.
- +JavaScript motoru maliyeti yok. Perry ile derlenmiş ikili dosyalar yorumlayıcı veya JIT taşımaz — TypeScript'iniz çalıştırılabilir dosyanın kendisidir.
- +Mobil, watch ve TV. Perry; iOS, iPadOS, Android, watchOS, tvOS ve WebAssembly'ye derler. Bun yalnızca sunucu/masaüstü içindir.
- +Yerel UI. Perry'nin perry/ui modülü gerçek platform widget'larına derlenir (macOS'ta AppKit, iOS'ta UIKit, Linux'ta GTK4, Windows'ta Win32, Android'de JNI). Bun'ın bir UI hikâyesi yok.
- +M1 Max üzerinde eşleştirilmiş koşullar altında ölçülen çoğu hesaplama mikro-benchmark'ında daha hızlı (RUNS=11, v0.5.279, 2026-04-25): fibonacci 318 ms vs Bun 589 ms; object_create 1 ms vs 6 ms; nested_loops 18 ms vs 21 ms. Tam tablo için perry/benchmarks'a bakın.
- +Dinamik tipli runtime grubunda JSON validate-and-roundtrip'te daha hızlı: Perry'nin lazy JSON tape'i aynı 10k kayıtlık iş yükünde Bun'ın 259 ms'sine karşı 75 ms medyanda.
Bun'in kazandığı yerler
- +1.x sürümleriyle olgun, kararlı çalışma zamanı. Perry 1.0 öncesidir.
- +JSON parse-and-iterate'te daha hızlı (her değere dokunulan): aynı iş yükünde Bun 254 ms vs Perry 466 ms medyan — Perry'nin lazy tape'i iterasyon zorunlu olduğunda kestirme yapamaz.
- +Kutudan çıkar çıkmaz tam Node uyumlu npm ekosistemi. Perry bir alt kümeyi yerel olarak çalıştırır ve geri kalan için isteğe bağlı gömülü V8'e başvurur.
- +Yerleşik test koşturucusu, bundler ve paket yöneticisi. Perry bir derleyicidir — çevre araçları ayrıdır.
- +JIT-sıcak performansı, sıcak iç döngülere sahip iterasyon ağırlıklı kodlarda AOT'u geçebilir; Perry'nin JIT'i yoktur.
- +`loop_data_dependent` üzerinde Perry ile koşma-arası gürültü sınırları içinde berabere (232 ms vs 235 ms) — hiçbir tarafın derleyicisinin yeniden sıralayamayacağı, gerçekten katlanamayan f64 çekirdeği. Kaynak: perry/benchmarks RUNS=11.
Perry'i ne zaman seçmeli
İkili dosya boyutu önemliyse (mobil dağıtım, gömülü bağlamlar, hızlı soğuk başlatma), tek bir TypeScript kod tabanından mobile/watch/TV'ye göndermek istiyorsanız, yerel UI widget'ları istiyorsanız veya gönderdiğiniz yapıtta hiçbir JavaScript motoru istemiyorsanız Perry'yi seçin.
Bun'i ne zaman seçmeli
Bugün kararlı, olgun bir çalıştırma zamanına ihtiyacınız varsa, tam npm uyumluluğu pazarlık konusu değilse, çalıştırma zamanı + bundler + paket yöneticisi + test koşturucusu için tek bir araç istiyorsanız ya da uzun süreli iş yüklerinde JIT-sıcak performansı sizin için soğuk-başlatma boyutundan daha önemliyse Bun'ı seçin.
Karar
Bun ve Perry'nin her ikisi de bir TypeScript programını tek bir ikili dosya olarak göndermenizi sağlar, ancak farklı sorulara yanıt verirler. Bun'ın ikili dosyası Bun çalışma zamanını içerir ve JIT ile tam Node uyumluluğunun kazandığı backend/CLI iş yükleri için optimize edilmiştir. Perry'nin ikili dosyası ise hiç JS motoru içermez ve boyut, soğuk başlatma, mobil ve yerel UI için optimize edilmiştir. Bir sunucu gönderiyorsanız Bun bugün daha kanıtlanmıştır. Yerel bir uygulama gönderiyorsanız veya ikili dosya boyutunu önemsiyorsanız Perry tam da bu durum için yapılmıştır.