Kompilasi TypeScript ke Binary

Satu perintah mengubah main.ts menjadi executable native standalone. Tanpa Node.js di mesin target, tanpa runtime yang dibundel, tanpa langkah instalasi untuk pengguna Anda.

terminal

$ perry compile main.ts

✓ Compiled executable: main (2.3 MB)

$ ./main

Hello, World!

Tiga hal yang disebut orang “mengompilasi TypeScript”

Ketika developer mencari cara mengompilasi TypeScript ke binary, mereka biasanya menemukan tiga teknik yang sangat berbeda namun berbagi satu kata yang sama:

  • Transpilasi. tsc, SWC, dan esbuild mengubah TypeScript menjadi JavaScript. Outputnya masih membutuhkan Node.js, Bun, atau browser untuk berjalan. Tidak ada binary yang terlibat.
  • Runtime tertanam. bun build --compile, deno compile, dan Node.js Single Executable Applications (SEA) menggabungkan JavaScript yang telah dibundel dengan salinan lengkap dari runtime-nya. Anda mendapat satu file, tetapi engine-nya ikut serta di dalamnya dan kode Anda tetap di-parse dan di-JIT-compile setiap kali proses dimulai.
  • Kompilasi native ahead-of-time. Inilah yang dilakukan Perry. TypeScript di-parse dengan SWC, tipe diselesaikan, generic di-monomorphize, dan LLVM menghasilkan kode mesin. Linker menghasilkan executable biasa — jenis artifact yang sama seperti yang dihasilkan toolchain Rust, Go, atau C++. Sama sekali tidak ada JavaScript engine di dalam binary.

Karena tidak ada engine yang perlu dijalankan dan tidak ada yang perlu di-parse saat startup, binary Perry mulai berjalan dalam waktu sekitar satu milidetik. Pipeline-nya sendiri dijelaskan lebih dalam di halaman kompiler TypeScript native dan di struktur internal kompiler.

Seberapa besar binary-nya?

Ukurannya bergantung pada apa yang Anda sertakan, karena hanya kode yang benar-benar Anda gunakan yang dikompilasi dan di-link:

  • Hello world berukuran sekitar 330 KB.
  • Tool CLI tipikal berada di kisaran 2–5 MB.
  • Aplikasi lengkap yang menyertakan framework besar (Fastify, mysql2, dan sejenisnya) berukuran sekitar 48 MB.

Sebagai perbandingan: executable Node SEA adalah salinan dari binary node itu sendiri, jadi ukurannya sudah sekitar 88–118 MB tergantung platform sebelum kode Anda ditambahkan, dan hello world yang dikompilasi Bun berukuran sekitar 60 MB di macOS arm64 dan sekitar 100 MB di Linux x64, karena seluruh runtime Bun ikut ditanam.

Perry vs bun build --compile vs Node SEA

Ketiganya memberi Anda satu file yang bisa Anda serahkan ke orang lain. Selebihnya, ketiganya adalah tool yang sangat berbeda, dan masing-masing merupakan jawaban yang tepat untuk situasi tertentu:

Perrybun build --compileNode SEA
Apa yang dihasilkanKode mesin AOT-compiled (LLVM)JS yang dibundel + runtime Bun tertanamSalinan binary node dengan skrip Anda yang dibundel disisipkan
Model eksekusiKode native, tanpa JS engineJIT (JavaScriptCore) saat runtimeJIT (V8) saat runtime
Ukuran hello-world~330 KB~60 MB (macOS arm64) hingga ~100+ MB (Linux/Windows)~88–118 MB (ukuran binary node)
Waktu mulai~1 ms~10 ms~30 ms
Kompilasi silang10 target, termasuk Windows/macOS/iOS dari LinuxYa — Linux, Windows, macOS via --targetTidak — sebagai gantinya salin binary node per platform
Kompatibilitas JS/npmTerus bertambah: axios, zod v4, express, fastify, hono dikompilasi secara native; fallback V8 opsional untuk sisanyaPenuh — inilah runtime Bun itu sendiriSemantik Node penuh; membutuhkan pre-bundling, hanya CommonJS di Node 24 LTS
StatusPra-1.0StabilStabilitas “dalam pengembangan aktif” di Node 24 LTS

Kerangka berpikir yang jujur: jika aplikasi Anda bergantung pada ekosistem npm secara penuh dan Anda menginginkan risiko kompatibilitas nol, Bun dan Node SEA menjalankan persis semantik engine yang sudah Anda kembangkan — itulah kekuatan mereka, dan biaya ukuran mungkin tidak menjadi masalah untuk deployment Anda. Perry menawarkan trade-off yang berbeda. Anda mendapat kompilasi ahead-of-time sejati, binary kecil, dan startup dalam hitungan milidetik; sebagai gantinya Anda mengadopsi kompiler pra-1.0 yang konformansi JavaScript-nya diukur dan dipublikasikan (test262: String 79%, Array 72% per v0.5.1146) alih-alih diwariskan dari V8.

Perbandingan head-to-head mendetail: Perry vs Bun dan Perry vs Deno. Untuk cara paket npm dikompilasi, lihat paket npm nyata dan sapuan konformansi.

Perbandingan Performa

Kompilasi native memberikan efisiensi tak tertandingi

MetrikPerryNode.jsBun
Ukuran Binary2-5 MB~80 MB~90 MB
Waktu Mulai~1 ms~30 ms~10 ms
Dependensi RuntimeTidak adaNode.jsBun
Overhead MemoriMinimalV8 + GCJSC + GC

Hasil Benchmark: Hingga 18x Lebih Cepat

Perry v0.5.279 vs Node.js v25 — median RUNS=11, Apple M1 Max (lebih rendah lebih baik)

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
Ukuran BinaryLebih rendah lebih baik
Perry
5 MB
Node.js
80 MB
Bun
90 MB

Kompilasi binary pertama Anda hari ini

Instal dengan Homebrew, APT, atau winget — lalu perry compile main.ts.