Lompat ke konten
Kembali ke modul

Cara JavaScript Berjalan: Engine, Event Loop, Async · 1/9

Di dalam engine: parsing, bytecode, dan JIT

Apa yang dilakukan V8 pada file-mu dalam milidetik sebelum apa pun berjalan.

Baca 25 menit

Setelah pelajaran ini kamu bisa

  • Menjelaskan jalur dari teks kode sumbermu sampai jadi machine code yang berjalan
  • Menjelaskan apa yang dilakukan compiler JIT dan kenapa ia perlu mengamati kodemu dulu
  • Menjelaskan kenapa object dengan bentuk konsisten berjalan lebih cepat
  • Menjelaskan kenapa jangan melakukan mikro-optimasi sebelum mengukur

Kamu sudah mengenal idenya di modul 1: teksmu bukan yang benar-benar dijalankan. Sekarang inilah yang sebenarnya terjadi di dalam V8 — engine di Chrome, di Node, dan di Edge — dalam milidetik setelah ia menerima file-mu.

  1. Parse. Teksnya dibaca dan diperiksa apakah sintaksnya valid. Kesalahan di sini berarti SyntaxError, dan tidak ada yang dijalankan sama sekali — bahkan baris-baris benar di atasnya.
  2. Bangun AST. Kodenya jadi struktur pohon: "ini sebuah function, berisi sebuah if, berisi sebuah return". AST artinya *abstract syntax tree*.
  3. Compile jadi bytecode. Sebuah interpreter bernama Ignition mengubah pohon itu jadi instruksi ringkas dan langsung mulai mengeksekusinya, supaya halamanmu tidak menunggu.
  4. Amati dan optimasi. Sambil berjalan, V8 menghitung function mana yang sering jalan. Function yang "panas" itu diserahkan ke compiler pengoptimasi (TurboFan) yang menghasilkan machine code sungguhan.
  5. De-optimasi kalau perlu. Kalau function yang sudah dioptimasi tiba-tiba menerima data dengan bentuk berbeda dari asumsinya, V8 membuang versi optimasinya dan kembali ke bytecode.

Bentuk object lebih penting dari yang kamu duga

Untuk membaca user.name dengan cepat, V8 tidak mencari di kamus setiap kali. Ia mencatat sebuah shape — object jenis ini punya name dulu, lalu age — dan mengingat posisi setiap property. Object yang dibuat dengan cara sama berbagi satu shape, dan pencariannya jadi sekadar offset langsung.

js
// These two share one shape. V8 can optimise reads across both.
const a = { name: "Ana", age: 30 };
const b = { name: "Budi", age: 25 };

// Different property order -> a different shape, despite identical fields.
const c = { age: 40, name: "Citra" };

// Adding a property later changes the shape again, mid-flight.
const d = { name: "Dedi", age: 35 };
d.role = "lead";
Sarannya secara praktis: bangun object dengan semua field-nya sekaligus, dalam urutan yang konsisten.
Coba sendiri

Perbandingan waktu secara kasar. Angkanya berubah tiap kali dijalankan — dan itu justru pelajaran tentang cara mengukur.

Hasil

Tekan Jalankan untuk melihat hasilnya.

Ini jalan di browser kamu, di dalam sandbox. Apa pun yang kamu tulis di sini tidak bisa merusak situs.

Tugas praktik

Buka Chrome DevTools, ke tab Performance, rekam sambil memuat ulang situs berat apa pun, lalu hentikan. Temukan blok kuning "Scripting" di flame chart. Yang kamu lihat itu tepat pekerjaan compile-dan-eksekusi yang dijelaskan di atas.

Hasil yang diharapkan

Flame chart dengan bagian Scripting, Rendering, dan Painting yang terlihat.