Kompiler TypeScript Native, Dibangun dalam Rust

Perry mengompilasi TypeScript yang sudah Anda tulis menjadi kode mesin — seperti cara toolchain Rust atau Go mengompilasi bahasanya. Tanpa JavaScript hasil transpile, tanpa virtual machine, tanpa runtime di sistem target.

Bukan transpiler. Bukan runtime.

Sebagian besar tooling TypeScript terbagi menjadi dua keluarga. Transpiler — tsc, SWC, esbuild — memeriksa dan menghapus tipe, lalu menghasilkan JavaScript untuk dieksekusi belakangan oleh sebuah engine. Runtime — Node.js, Bun, Deno — adalah engine-engine itu: mereka melakukan parsing, interpretasi, dan JIT-compile JavaScript setiap kali program Anda dimulai.

Kompiler native adalah keluarga ketiga, dan untuk TypeScript, keluarga ini sebagian besar masih kosong. Perry memperlakukan anotasi tipe bukan sebagai dokumentasi yang harus dihapus, melainkan sebagai input yang menggerakkan pembuatan kode. Hasil dari perry compile main.ts adalah executable standalone berisi kode mesin — biasanya 2–5 MB, mulai berjalan dalam waktu sekitar satu milidetik.

Cara Kerjanya

Dari kode sumber TypeScript ke executable native dalam hitungan detik

TypeScriptFile .ts
SWC
ParserParsing cepat
HIR
TransformasiMonomorphization
LLVM
CodegenKode mesin
ExecutableBinary 2-5 MB

Ingin tahu bagaimana kompiler bekerja di balik layar? Struktur internal kompiler

Pendalaman: TypeScript di atas LLVM — monomorphization, NaN-boxing, dan mengapa Perry meninggalkan Cranelift.

Pipeline-nya, langkah demi langkah

  1. Parse (SWC). File sumber di-parse dengan SWC, parser TypeScript Rust-native, sehingga bahkan proyek besar pun ter-parse dalam hitungan milidetik. Codegen modul, transform pass, dan symbol scanning berjalan paralel di berbagai core.
  2. Resolusi tipe. Kompiler menyelesaikan tipe yang dideklarasikan dan menyimpulkan sisanya, memberikan setiap ekspresi tipe konkret sebelum pembuatan kode dimulai.
  3. HIR bertipe & monomorphization. AST diturunkan menjadi high-level IR yang bertipe. Fungsi dan kelas generic di-monomorphize — setiap instansiasi seperti Stack<number> dikompilasi secara terpisah dengan tipe konkretnya, sehingga generic tidak memakan biaya sama sekali saat runtime. Ketika tipe diketahui, pemanggilan metode menjadi static dispatch dan field objek menjadi pemuatan langsung dengan offset tetap.
  4. Codegen (LLVM). HIR diturunkan menjadi LLVM IR dan dijalankan melalui pipeline optimasi LLVM — inlining, optimasi loop, vectorization — lalu dihasilkan sebagai kode mesin untuk target.
  5. Link. Outputnya adalah executable platform biasa: Mach-O di macOS, ELF di Linux, PE di Windows — plus target mobile, watch, TV, dan WebAssembly.

Sisi LLVM dari semua ini — mengapa LLVM dipilih dibanding Cranelift, bagaimana NaN-boxing merepresentasikan nilai dinamis, apa yang dilakukan optimizer terhadap IR bertipe — punya deep dive-nya sendiri: TypeScript di atas LLVM. Detail implementasi seperti NaN-boxing, static dispatch, dan zero-cost abstraction dibahas di struktur internal kompiler.

Bagaimana dengan kode dinamis dan npm?

TypeScript pada dasarnya tetaplah JavaScript, dan kompiler TypeScript native harus jujur soal itu. Konformansi Perry terhadap suite resmi test262 diukur dan dipublikasikan — per v0.5.1146, semantik String berada di 79% dan Array di 72%, keduanya terus meningkat dari rilis ke rilis. Paket npm TypeScript/JavaScript murni dikompilasi secara native melalui perry.compilePackages: axios, zod v4, express, fastify, dan hono sudah bisa dikompilasi dan berjalan hari ini. Kode yang membutuhkan semantik engine penuh dapat memilih fallback V8 tertanam dengan --enable-js-runtime.

Cerita lengkapnya ada di paket npm nyata dan sapuan konformansi.

Bagaimana Perry berkaitan dengan upaya “TypeScript native” lainnya

Perry bukan satu-satunya proyek yang melihat anotasi tipe TypeScript sebagai peluang kompilasi — tetapi pendekatannya sangat berbeda. AssemblyScript mengompilasi bahasa mirip-TypeScript yang ketat hanya ke WebAssembly: ia sengaja tidak kompatibel dengan JavaScript, dan tidak menghasilkan executable OS atau UI native. Static Hermes milik Meta mengompilasi subset JavaScript bertipe secara ahead-of-time di dalam engine Hermes, terutama untuk React Native — per pertengahan 2026 proyek ini masih berupa riset yang harus dibangun dari source, dan engine Hermes V1 yang benar-benar dikirim di React Native tidak menyertakan fitur statis tersebut (perbandingan lengkap).

Taruhan Perry berbeda pada kedua sumbu: TypeScript standar sebagai bahasa input, dan executable platform biasa — CLI, server, dan GUI — sebagai output, dapat diinstal hari ini via Homebrew, APT, winget, atau npm.

Satu kompiler, sepuluh target

Karena pembuatan kode melewati LLVM, satu kode sumber dikompilasi ke macOS, iOS, iPadOS, Android, Linux, Windows, watchOS, tvOS, WebAssembly, dan Web/JS biasa — termasuk kompilasi silang binary Windows, macOS, dan iOS dari mesin Linux. Aplikasi GUI menggunakan perry/ui, API deklaratif di atas widget platform asli (AppKit, UIKit, GTK4, Win32, Android via JNI) — tanpa webview yang terlibat.

Bagaimana perbandingannya dengan pendekatan lain: Perry vs Bun, Deno, Electron, Tauri, React Native, dan Static Hermes.

Coba kompiler ini

Instal Perry dan kompilasi binary native pertama Anda dalam waktu kurang dari satu menit.