TypeScript'i İkili Dosyaya Derleyin

Tek bir komut main.ts dosyasını bağımsız bir yerel çalıştırılabilir dosyaya dönüştürür. Hedef makinede Node.js yok, gömülü runtime yok, kullanıcılarınız için kurulum adımı yok.

terminal

$ perry compile main.ts

✓ Compiled executable: main (2.3 MB)

$ ./main

Hello, World!

İnsanların “TypeScript derleme” dediği üç şey

Geliştiriciler TypeScript'in nasıl ikili dosyaya derleneceğini araştırdığında, genellikle aynı kelimeyi paylaşan üç çok farklı teknikle karşılaşır:

  • Transpile etme. tsc, SWC ve esbuild TypeScript'i JavaScript'e dönüştürür. Çıktının çalışması için hâlâ Node.js, Bun veya bir tarayıcı gerekir. Ortada bir ikili dosya yoktur.
  • Runtime gömme. bun build --compile, deno compile ve Node.js'in Tek Çalıştırılabilir Uygulamalar (SEA) özelliği, paketlenmiş JavaScript kodunuzu runtime'ın tam bir kopyasıyla birleştirir. Tek bir dosya elde edersiniz, ama motor bu dosyanın içinde taşınır ve kodunuz süreç her başladığında yine ayrıştırılır ve JIT ile derlenir.
  • Ahead-of-time yerel derleme. Perry'nin yaptığı budur. TypeScript SWC ile ayrıştırılır, türler çözümlenir, generic'ler monomorphize edilir ve LLVM makine kodu üretir. Linker, bir Rust, Go veya C++ araç zincirinin ürettiğiyle aynı sınıftan normal bir çalıştırılabilir dosya üretir. İkili dosyanın içinde hiçbir JavaScript motoru yoktur.

Başlatılacak bir motor ve başlangıçta ayrıştırılacak hiçbir şey olmadığı için bir Perry ikili dosyası yaklaşık bir milisaniyede başlar. Pipeline'ın kendisi TypeScript yerel derleyici sayfasında ve derleyici iç yapısı içinde daha ayrıntılı olarak ele alınmıştır.

İkili dosya ne kadar büyük?

Boyut, projenize dahil ettiğiniz şeye bağlıdır, çünkü yalnızca gerçekten kullandığınız kod derlenir ve linklenir:

  • Bir hello world yaklaşık 330 KB boyutundadır.
  • Tipik CLI araçları 2–5 MB civarındadır.
  • Büyük framework'ler (Fastify, mysql2 ve benzerleri) bağlayan tam uygulamalar yaklaşık 48 MB civarındadır.

Karşılaştırma olarak: bir Node SEA çalıştırılabilir dosyası node ikili dosyasının kendisinin bir kopyasıdır, bu yüzden kodunuz eklenmeden önce platforma bağlı olarak kabaca 88–118 MB'tan başlar; Bun ile derlenmiş bir hello world ise tüm Bun runtime'ı gömülü olduğu için macOS arm64'te yaklaşık 60 MB, Linux x64'te ise yaklaşık 100 MB ölçülür.

Perry vs bun build --compile vs Node SEA

Üçü de size birine verebileceğiniz tek bir dosya sağlar. Bunun dışında birbirinden çok farklı araçlardır ve her biri farklı bir durumda doğru cevaptır:

Perrybun build --compileNode SEA
Ürettiği şeyAOT derlenmiş makine kodu (LLVM)Paketlenmiş JS + gömülü Bun runtime'ıPaketlenmiş betiğinizin enjekte edildiği node ikili dosyasının kopyası
Çalıştırma modeliYerel kod, JS motoru yokÇalışma zamanında JIT (JavaScriptCore)Çalışma zamanında JIT (V8)
Hello-world boyutu~330 KB~60 MB (macOS arm64) ile ~100+ MB (Linux/Windows) arası~88–118 MB (node ikili dosyasının boyutu)
Başlatma~1 ms~10 ms~30 ms
Çapraz derlemeLinux'tan Windows/macOS/iOS dahil olmak üzere 10 hedefEvet — --target ile Linux, Windows, macOSHayır — bunun yerine platforma özgü bir node ikili dosyası kopyalanır
JS/npm uyumluluğuArtıyor: axios, zod v4, express, fastify, hono yerel olarak derlenir; geri kalanı için isteğe bağlı V8 fallback'iTam — zaten Bun runtime'ının kendisiTam Node semantiği; ön-paketleme gerektirir, Node 24 LTS'te yalnızca CommonJS
Durum1.0 öncesiKararlıNode 24 LTS'te “Active development” kararlılık düzeyi

Dürüst çerçeveleme: uygulamanız npm ekosisteminin tamamına dayanıyorsa ve sıfır uyumluluk riski istiyorsanız, Bun ve Node SEA zaten üzerine geliştirme yaptığınız motor semantiğini birebir çalıştırır — güçlü yanları budur ve boyut maliyeti dağıtımınız için önemli olmayabilir. Perry farklı bir takas sunar. Gerçek bir ahead-of-time derleme, küçük ikili dosyalar ve milisaniye seviyesinde başlatma elde edersiniz; karşılığında JavaScript uyumluluğu V8'den miras alınmak yerine ölçülüp yayımlanan (test262: String 79%, Array 72%, v0.5.1146 itibarıyla) 1.0 öncesi bir derleyiciyi benimsersiniz.

Ayrıntılı karşılaştırmalar: Perry vs Bun ve Perry vs Deno. npm paketlerinin nasıl derlendiğini görmek için Real npm packages and a conformance sweep yazısına bakın.

Performans Karşılaştırması

Yerel derleme benzersiz verimlilik sunar

MetrikPerryNode.jsBun
İkili Dosya Boyutu2-5 MB~80 MB~90 MB
Başlatma Süresi~1 ms~30 ms~10 ms
Runtime BağımlılıklarıYokNode.jsBun
Bellek YüküMinimalV8 + GCJSC + GC

Benchmark Sonuçları: 18 Kata Kadar Daha Hızlı

Perry v0.5.279 vs Node.js v25 — RUNS=11 medyan, Apple M1 Max (düşük olan daha iyi)

accumulate
18x
object create
11x
json roundtrip
5.3x
loop overhead
4.5x
math intensive
3.6x
array read
3.3x
fibonacci
3.2x
array write
2.3x
loop data dependent
1.4x
nested loops
1.0x
İkili Dosya BoyutuDüşük olan daha iyi
Perry
5 MB
Node.js
80 MB
Bun
90 MB

Bugün ilk ikili dosyanızı derleyin

Homebrew, APT veya winget ile kurun — ardından perry compile main.ts.