Struktur Internal Kompiler

Keputusan desain utama yang membuat Perry cepat

01NaN-Boxing

Nilai disimpan sebagai float 64-bit dengan pola bit khusus untuk pointer, memungkinkan tipe union tanpa overhead runtime. Ini memungkinkan (string | number)[] bekerja secara efisien.

Dengan mengkodekan informasi tipe langsung dalam bit payload NaN IEEE 754, Perry menghindari kebutuhan akan tagged union atau boxed value. Satu kata 64-bit dapat merepresentasikan tipe nilai JavaScript apa pun — angka menggunakan representasi naturalnya, sementara string, objek, dan nilai heap-allocated lainnya menggunakan pola bit pointer yang berada dalam rentang NaN.

02Monomorphization

Generic dikhususkan pada waktu kompilasi, seperti Rust. Setiap instansiasi tipe menghasilkan kode yang dioptimalkan, menghilangkan overhead pemeriksaan tipe saat runtime.

Ketika Anda menulis Array'<'number'>' dan Array'<'string'>', Perry menghasilkan dua implementasi terpisah yang sepenuhnya dioptimalkan. Ini berarti operasi array pada angka menggunakan aritmatika mesin langsung — tanpa type guard, tanpa dynamic dispatch, tanpa boxing.

03Static Dispatch

Tanpa tabel virtual. Pemanggilan metode diselesaikan pada waktu kompilasi, memungkinkan pemanggilan fungsi langsung dan optimasi inlining.

Runtime OOP tradisional menggunakan vtable untuk resolusi metode, menambahkan lapisan indireksi pada setiap pemanggilan. Perry menyelesaikan semua pemanggilan metode secara statis selama kompilasi, mengubah pemanggilan metode interface menjadi lompatan langsung. Ini juga membuka inlining agresif — metode kecil sering dilipat langsung ke situs pemanggilan mereka.

04Zero-Cost Abstractions

Kelas, interface, dan generic TypeScript dikompilasi menjadi kode native yang efisien tanpa overhead representasi runtime.

Sistem tipe TypeScript hanya ada pada waktu kompilasi — dan Perry mengambil ini secara literal. Interface tidak menghasilkan kode runtime. Hierarki kelas diratakan. Constraint generic diselesaikan menjadi tipe konkret. Binary yang dikompilasi hanya berisi logika aktual, tanpa mesin abstraksi yang biasanya dibawa oleh interpreter.