Pengoptimalan panggilan akhir WasmGC dan Wasm kini tersedia di Dasar Pengukuran

Dipublikasikan: 29 Januari 2025

Pengumpulan Sampah WebAssembly (WasmGC)

Ada dua jenis bahasa pemrograman: bahasa pemrograman yang melakukan pembersihan sampah dan bahasa pemrograman yang memerlukan pengelolaan memori manual. Contoh yang pertama, di antara banyak lainnya, adalah Kotlin, PHP, atau Java. Contohnya adalah C, C++, atau Rust. Sebagai aturan umum, bahasa pemrograman tingkat tinggi lebih cenderung memiliki pembersihan sampah sebagai fitur standar.

Dalam istilah yang disederhanakan, pembersihan sampah memori adalah upaya untuk mengambil kembali memori yang dialokasikan oleh program, tetapi tidak lagi direferensikan. Memori tersebut disebut sampah. Ada banyak strategi untuk menerapkan pembersihan sampah. Salah satu yang paling mudah dipahami adalah penghitungan referensi dengan tujuan menghitung jumlah referensi ke objek dalam memori.

Mungkin terasa seperti awal, tetapi bahasa pemrograman diterapkan dalam bahasa pemrograman lain. Misalnya, runtime PHP terutama diimplementasikan dalam C. Jika ingin mengompilasi bahasa seperti PHP ke Wasm, developer biasanya perlu mengompilasi semua bagian, seperti parser bahasa, dukungan library, pengumpulan sampah, dan komponen penting lainnya.

Wasm berjalan di browser dalam konteks JavaScript bahasa host. Di Chrome, JavaScript dan Wasm dijalankan di V8, mesin JavaScript open source Google. Selain itu, V8 sudah memiliki pengumpulan sampah. Artinya, developer yang menggunakan, misalnya, PHP yang dikompilasi ke Wasm, akhirnya mengirimkan implementasi garbage collector dari bahasa yang di-port (PHP) ke browser yang sudah memiliki garbage collector, yang sama sia-sianya dengan kedengarannya. Di sinilah WasmGC berperan.

Untuk mempelajari WasmGC lebih lanjut, baca WebAssembly Garbage Collection (WasmGC) kini diaktifkan secara default di Chrome dan jika Anda ingin mempelajarinya lebih mendalam, lihat postingan blog V8 Cara baru untuk menghadirkan bahasa pemrograman yang dikumpulkan sampah secara efisien ke WebAssembly

Pengoptimalan panggilan akhir Wasm

Panggilan dikatakan berada dalam posisi akhir jika merupakan petunjuk terakhir yang dieksekusi sebelum kembali dari fungsi saat ini. Compiler dapat mengoptimalkan panggilan tersebut dengan menghapus frame pemanggil dan mengganti panggilan dengan lompatan. Hal ini sangat berguna untuk fungsi rekursif. Misalnya, ambil fungsi C ini yang menjumlahkan elemen linked list:

int sum(List* list, int acc) {
  if (list == nullptr) return acc;
  return sum(list->next, acc + list->val);
}

Dengan panggilan reguler, hal ini akan menghabiskan ruang stack O(n): setiap elemen daftar menambahkan frame baru di stack panggilan. Dengan daftar yang cukup panjang, hal ini dapat dengan cepat melampaui stack. Dengan mengganti panggilan dengan lompatan, pengoptimalan panggilan akhir secara efektif mengubah fungsi rekursif ini menjadi loop yang menggunakan ruang stack O(1):

int sum(List* list, int acc) {
  while (list != nullptr) {
    acc = acc + list->val;
    list = list->next;
  }
  return acc;
}

Pengoptimalan ini sangat penting untuk bahasa fungsional. Fungsi ini sangat bergantung pada fungsi rekursif, dan fungsi murni seperti Haskell bahkan tidak menyediakan struktur kontrol loop. Setiap jenis iterasi kustom biasanya menggunakan rekursi dengan cara tertentu. Tanpa pengoptimalan panggilan akhir, hal ini akan dengan cepat mengalami overflow stack untuk program non-trivial, yang akan dengan cepat kehabisan ruang stack.

Awalnya, WebAssembly tidak mengizinkan pengoptimalan panggilan akhir tersebut, tetapi hal ini berubah dengan proposal Ekstensi Panggilan Akhir. Untuk mempelajari lebih lanjut, baca artikel Panggilan akhir WebAssembly di blog V8.

Kesimpulan

Kini dengan WasmGC dan pengoptimalan panggilan akhir menjadi Dasar Pengukuran yang Baru tersedia, lebih banyak aplikasi dapat menggunakan fitur ini untuk performa yang lebih baik, seperti yang dilakukan Google Spreadsheet dengan men-port pekerja penghitungan Google Spreadsheet ke WasmGC.