- Mulai Firefox 148, optimisasi asm.js di SpiderMonkey dinonaktifkan secara default, dan kode terkait akan dihapus pada rilis mendatang
- asm.js adalah subset JavaScript, jadi situs yang ada akan tetap berfungsi, tetapi dijalankan melalui jalur JIT umum sehingga keunggulan optimisasinya hilang
- Konten asm.js bisa dikompilasi ulang ke WebAssembly untuk mendapatkan eksekusi yang lebih cepat dan biner yang lebih kecil
- asm.js memungkinkan eksekusi yang mendekati native di dalam konten web tanpa sandbox terpisah atau API pengganti, sebagai tandingan terhadap NaCl·PNaCl
- OdinMonkey yang masuk di Firefox 22 pada 2013 memungkinkan distribusi web C/C++ seperti Unity dan Unreal, dan menjadi fondasi menuju WebAssembly
Menonaktifkan optimisasi asm.js
- Mulai Firefox 148, optimisasi asm.js di SpiderMonkey dinonaktifkan secara default, dan seluruh kode terkait dijadwalkan akan dihapus pada rilis mendatang
- Situs yang menggunakan asm.js akan tetap berjalan
- asm.js adalah subset dari JavaScript biasa, sehingga kode yang ada akan dijalankan melalui jalur JIT umum seperti skrip lainnya
- Namun, keuntungan optimisasi khusus asm.js tidak lagi tersedia
- Jika Anda masih mendistribusikan konten asm.js, disarankan untuk mengompilasinya ulang ke WebAssembly
- Dengan mengompilasi ulang ke WebAssembly, Anda bisa mendapatkan eksekusi yang lebih cepat dan biner yang lebih kecil
- Pipeline WebAssembly di SpiderMonkey sudah jauh lebih maju dibanding pipeline asm.js
- Karena WebAssembly telah sukses dan sebagian besar penggunaan asm.js sudah bermigrasi, biaya mempertahankan kedua jalur sekaligus menjadi besar
- Tetap membutuhkan waktu pemeliharaan
- Menyisakan permukaan serangan tambahan di dalam VM
Peran asm.js dan berakhirnya OdinMonkey
- asm.js adalah jawaban Mozilla atas pertanyaan yang diajukan oleh NaCl dan PNaCl: “bisakah kode dijalankan di web dengan kecepatan native?”
- Pendekatannya adalah memilih subset JavaScript yang ketat dan bertipe statis, yang bisa dikenali mesin saat itu juga lalu dikompilasi menjadi kode native
- Ini memungkinkan tetap berada di dalam konten web dan menggunakan Web API yang ada tanpa sandbox terpisah, IPC, atau API pengganti
- asm.js dimasukkan ke Firefox 22 pada 2013, dan memungkinkan proyek seperti Unity dan Unreal mendistribusikan codebase C/C++ mereka ke web hanya dengan teknologi web standar
- Nama compiler asm.js adalah OdinMonkey, dan proses penghapusannya dilacak di bug Ragnarök sebagai “Twilight of OdinMonkey”
- BaldrMonkey yang lahir dari OdinMonkey adalah compiler optimisasi WebAssembly
- RabaldrMonkey adalah compiler baseline WebAssembly
- OdinMonkey kini memasuki tahap akhir setelah menyelesaikan perannya selama 13 tahun
1 komentar
Komentar Hacker News
asm.js adalah jawaban Mozilla atas pertanyaan yang diajukan NaCl dan PNaCl: “bagaimana menjalankan kode dengan kecepatan native di web?”
Kalau ini terjadi sekarang, Chrome mungkin akan langsung memaksakan NaCl dan PNaCl, lalu semua orang akan mengeluh kenapa Safari dan Firefox tidak bisa mengikuti standar “web”
Dulu saya sempat serius berpikir bahwa untuk sementara waktu kita akan melakukan segalanya di browser. Dalam arti tertentu memang makin ke sana, tapi secara keseluruhan rasanya lebih buruk daripada sebelumnya. Saya suka WASM dan ingin terus menyukainya, tetapi kecepatan pematangan ekosistemnya benar-benar sulit dipercaya buruknya
Yang lebih parah, kita harus menjalankan alat AI yang tidak dapat diandalkan beserta hasil keluarannya di dalam sandbox semacam itu, tetapi perusahaan malah menjual sandbox terhosting dan VM berbasis JS terhosting, yaitu kebalikan total dari itu
Pada akhirnya, sepertinya masalahnya selalu sama. Tidak ada uang di sandbox sisi klien
Secara internal itu berguna untuk menyandbox Flash player, tetapi batasan dari pendekatan berbasis LLVM segera menjadi jelas bagi semua pihak yang terlibat
Kalau ingatan saya benar, alasan besar kenapa gagal adalah karena NaCl adalah teknologi yang terlalu “besar” dan asm.js terlalu “kecil”, sehingga meskipun asm.js mulai beberapa tahun lebih lambat, ia mencapai kesiapan produksi lebih dulu
Namun, Apple tampaknya sudah meningkatkan investasi WebKit pada dekade ini setelah tekanan regulasi mulai nyata, jadi hasilnya bisa saja berbeda kalau terjadi hari ini
Karena itu dulu keluhannya lebih sedikit, sedangkan sekarang orang mengeluhkan hal-hal yang Safari tidak lakukan karena dianggap merugikan App Store. Untungnya, UE sekarang sedang mencoba sedikit meluruskan Apple
Sedih, tapi bisa dimengerti. Fakta menariknya, Figma awalnya dimulai sebagai codebase C++ penuh, dan asm.js adalah kunci untuk membuktikan bahwa alat desain bisa dijalankan di browser
Mereka baru beralih ke WebAssembly setelah mulai punya pelanggan berbayar, dan peningkatan waktu muatnya juga cukup besar. asm.js tetaplah JS, jadi ukuran bundelnya lebih besar dan kodenya harus diparse menjadi AST, sedangkan WASM tidak begitu
Mirip seperti bersedih karena dukungan i386-unknown-freebsd1 dihapus
Jadi sekarang kematian asm.js sudah tiba? Kita makin menjauh dari garis waktu nubuat
https://www.destroyallsoftware.com/talks/the-birth-and-death...
Sangat direkomendasikan kalau belum pernah menontonnya. Bergantung pada definisi “terbaik”, ini mungkin salah satu presentasi teknologi terbaik sepanjang masa
Suatu hari nanti, setelah melewati masa perang dan keterikatan psikologis pada paradigma pemrograman lama memudar, kita mungkin akan beralih ke cara yang lebih maju. Tentu saja, itu tidak berarti bank Anda akan berhenti menjalankan YavaScript setidaknya selama 85 tahun ke depan
Saya tidak akan pernah lupa saat pertama kali menonton presentasi JavaScript dari Gary Bernhardt.[0] Di situlah saya pertama kali mengenal asm.js, dan lalu terjun ke lubang kelinci kompilasi kode agar bisa berjalan di browser
Sekarang, 12 tahun kemudian, menakjubkan melihat berapa banyak fiksinya yang ternyata menjadi kenyataan
[0] https://www.destroyallsoftware.com/talks/the-birth-and-death...
Saat pertama kali menonton presentasi itu, saya masih magang, dan perusahaan membuat sendiri seluruh compiler, IDE, dan debugger untuk kotak IO industri kecil. Compilernya ditulis dalam C, diubah menjadi JS dengan Emscripten, lalu “dikompilasi” bersama bagian IDE dan debugger menjadi satu file HTML raksasa, yang pada praktiknya lebih seperti disambung jadi satu. Upload kode dan debugging dilakukan lewat Ethernet, semuanya didorong lewat Ajax
Kedengarannya seperti arsitektur terkutuk, tapi pelanggan menyukainya. Karena itu bukan EXE, jadi tidak tersangkut filter TI perusahaan pelanggan yang berlebihan. Karena itulah kami tidak beralih ke Electron. Dalam arti tertentu, itu memang punya elemen purba dari thick app
Dulu sekali saya pernah menulis bab kecil tentang asm.js dalam buku WebGL
https://webglinsights.github.io/
Menyaksikan kebangkitan asm.js, pendahulu WebAssembly, itu menyenangkan. Beberapa demo awalnya benar-benar keren, seperti Unreal Engine yang berjalan di browser. Agak pahit melihat matahari terbenam di sini, tetapi itu membuka jalan ke hal-hal yang jauh lebih baik
Mungkin kita butuh transpiler dari asm.js ke WASM
Mengompilasi kode lama dengan Emscripten versi lawas cukup menjengkelkan. Kadang rasanya sama menyakitkannya dengan memperbarui kode JS agar sesuai dengan akumulasi perubahan ABI Emscripten
Setidaknya kode asm.js akan tetap berjalan meski optimisasi asm.js dimatikan, tetapi akan bagus jika ada konverternya
asm.js sudah mati! Hidup WebAssembly!
Secara pribadi saya menganggap keputusan ini sebagai kesalahan. Meski begitu, saya tidak tahu seberapa besar dampak nyatanya. Setahu saya, masih belum banyak orang yang memakai asm.js
Tapi wasm terlalu terisolasi dari JavaScript. Setelah memakainya secara terbatas, saya sempat berpikir lebih baik kompilasi ke asm.js saja
Saya juga tidak yakin apakah Emscripten masih mendukungnya sepenuhnya
Di wasm, sebagian besar web API tidak bisa dipanggil
Untuk pekerjaan yang ingin saya lakukan, yang lebih penting lagi, Anda tidak bisa mengirim buffer zero-copy dari JS ke wasm
Semua hal adalah kompromi. Isolasi itu kelebihan, tetapi juga kekurangan
Sementara wasm modern punya GC types, dan dengan externref juga bisa menahan nilai JS
asm.js kemungkinan juga tidak bisa melakukan buffer zero-copy. Di sisi wasm ada proposal buffer zero-copy: https://github.com/WebAssembly/memory-control/blob/main/prop...
Bahkan pada asm.js yang ketat pun, sebagian besar web API tidak bisa dipanggil langsung. Ia hanya mendukung angka, bukan string atau objek JS, karena heap C dikelola di dalam objek ArrayBuffer seperti pada WASM
Buffer zero-copy juga bermasalah sama. Anda harus keluar dari asm.js ke JavaScript “asli” untuk memanggilnya, dan Anda juga tidak bisa memetakan ArrayBuffer lain langsung ke heap asm.js, jadi perlu penyalinan. “JavaScript FFI” pada praktiknya tidak banyak berbeda antara asm.js dan WASM
Saya ingat saat Mozilla merilis OdinMonkey yang sangat terspesialisasi untuk kode asm.js. Tim Chrome/V8 justru memilih fokus pada optimisasi JIT umum yang mempercepat JavaScript biasa sambil tetap membantu asm.js juga
Perbedaan kecepatannya membuat Firefox unggul 2–4x, dan itu dipromosikan cukup gencar :D
Sekarang kebanyakan VM JavaScript browser sudah berkumpul pada desain dan optimisasi yang sangat mirip, jadi bahkan tanpa Odin, kode asm.js tetap akan berjalan cukup cepat
Rencana saya untuk menghasilkan kode JS saat runtime demi mempercepat algoritme sekarang pupus. Rasanya ini akan jauh lebih sulit dilakukan dengan wasm
Ada pustaka kecil untuk pengujian yang menangani cukup banyak pekerjaan seperti itu: https://searchfox.org/firefox-main/source/js/src/jit-test/li...
Di JS, kemungkinan Anda akan memakai https://www.npmjs.com/package/binaryen
https://www.assemblyscript.org/
Hanya saja, ia tidak akan diparse atau dijalankan secepat pipeline khusus asm.js. Kecuali aplikasinya benar-benar sangat besar, saya rasa perbedaannya tidak akan terlalu terasa