Apa itu WebAssembly? Platform web generasi selanjutnya menjelaskan

Selama dua dekade sekarang, kami hanya memiliki satu bahasa pemrograman yang tersedia untuk digunakan secara native di browser web: JavaScript. Kematian lambat plugin biner pihak ketiga telah mengesampingkan bahasa lain, seperti Java dan Flash's ActionScript, sebagai warga kelas satu untuk pengembangan web. Bahasa web lain, seperti CoffeeScript, hanya dikompilasi ke JavaScript.

Tapi sekarang kami memiliki kemungkinan baru: WebAssembly, atau disingkat WASM. WebAssembly adalah format biner kecil dan cepat yang menjanjikan kinerja yang mendekati asli untuk aplikasi web. Plus, WebAssembly dirancang untuk menjadi target kompilasi untuk bahasa apa pun, JavaScript hanyalah salah satunya. Dengan setiap browser utama yang sekarang mendukung WebAssembly, inilah saatnya untuk mulai berpikir serius tentang menulis aplikasi sisi klien untuk web yang dapat dikompilasi sebagai WebAssembly.

Perlu dicatat bahwa aplikasi WebAssembly tidak dimaksudkan untuk menggantikan aplikasi JavaScript — setidaknya, belum. Sebaliknya, pikirkan WebAssembly sebagai pendamping JavaScript. Jika JavaScript fleksibel, diketik secara dinamis, dan dikirimkan melalui kode sumber yang dapat dibaca manusia, WebAssembly berkecepatan tinggi, diketik dengan kuat, dan dikirimkan melalui format biner yang ringkas.

Pengembang harus mempertimbangkan WebAssembly untuk kasus penggunaan intensif kinerja seperti game, streaming musik, pengeditan video, dan aplikasi CAD.

Bagaimana WebAssembly bekerja

WebAssembly, yang dikembangkan oleh W3C, dalam kata-kata penciptanya adalah "target kompilasi". Pengembang tidak menulis WebAssembly secara langsung; mereka menulis dalam bahasa pilihan mereka, yang kemudian dikompilasi menjadi bytecode WebAssembly. Bytecode kemudian dijalankan di klien — biasanya di browser web — yang diterjemahkan ke dalam kode mesin asli dan dijalankan dengan kecepatan tinggi.

Kode WebAssembly dimaksudkan agar lebih cepat dimuat, diurai, dan dieksekusi daripada JavaScript. Ketika WebAssembly digunakan oleh browser web, masih ada biaya tambahan untuk mengunduh modul WASM dan menyiapkannya, tetapi semua hal lain yang setara WebAssembly berjalan lebih cepat. WebAssembly juga menyediakan model eksekusi sandbox, berdasarkan model keamanan yang sama yang ada untuk JavaScript sekarang.

Saat ini, menjalankan WebAssembly di browser web adalah kasus penggunaan yang paling umum, tetapi WebAssembly dimaksudkan untuk lebih dari sekadar solusi berbasis web. Akhirnya, ketika spesifikasi WebAssembly terbentuk dan lebih banyak fitur mendarat di dalamnya, ini mungkin berguna di aplikasi seluler, aplikasi desktop, server, dan lingkungan eksekusi lainnya.

Kasus penggunaan WebAssembly

Kasus penggunaan paling dasar untuk WebAssembly adalah sebagai target untuk menulis perangkat lunak dalam browser. Komponen yang dikompilasi ke WebAssembly dapat ditulis dalam beberapa bahasa; payload WebAssembly terakhir kemudian dikirim melalui JavaScript ke klien.

WebAssembly telah dirancang dengan sejumlah kasus penggunaan berbasis browser yang mengutamakan performa: game, streaming musik, pengeditan video, CAD, enkripsi, dan pengenalan gambar, dan masih banyak lagi.

Secara lebih umum, penting untuk berfokus pada tiga area ini saat menentukan kasus penggunaan WebAssembly khusus Anda:

  • Kode berkinerja tinggi yang sudah ada dalam bahasa yang dapat ditargetkan. Misalnya, jika Anda memiliki fungsi matematika berkecepatan tinggi yang sudah ditulis dalam C, dan Anda ingin memasukkannya ke dalam aplikasi web, Anda dapat menerapkannya sebagai modul WebAssembly. Bagian aplikasi yang tidak terlalu kritis terhadap kinerja dan menghadap pengguna dapat tetap berada di JavaScript.
  • Kode berkinerja tinggi yang perlu ditulis dari awal, di mana JavaScript tidak ideal. Sebelumnya, seseorang mungkin telah menggunakan asm.js untuk menulis kode tersebut. Anda masih dapat melakukannya, tetapi WebAssembly diposisikan sebagai solusi jangka panjang yang lebih baik.
  • Porting aplikasi desktop ke lingkungan web. Banyak demo teknologi untuk asm.js dan WebAssembly termasuk dalam kategori ini. WebAssembly dapat menyediakan substrat untuk aplikasi yang lebih ambisius daripada hanya GUI yang disajikan melalui HTML. (Lihat demo WebDSP, Zen Garden, dan Tanks.) Namun, ini bukan latihan yang sepele, karena semua cara aplikasi desktop berinteraksi dengan pengguna harus dipetakan ke WebAssembly / HTML / JavaScript yang setara.

Jika Anda memiliki aplikasi JavaScript yang tidak mendorong batasan kinerja apa pun, sebaiknya biarkan saja pada tahap pengembangan WebAssembly ini. Tetapi jika Anda membutuhkan aplikasi itu untuk bekerja lebih cepat, WebAssembly dapat membantu.

Dukungan bahasa WebAssembly 

WebAssembly tidak dimaksudkan untuk ditulis secara langsung. Seperti namanya, ini lebih seperti bahasa assembly, sesuatu untuk dikonsumsi mesin, daripada bahasa pemrograman tingkat tinggi yang ramah manusia. WebAssembly lebih dekat dengan representasi perantara (IR) yang dihasilkan oleh infrastruktur compiler bahasa LLVM, daripada seperti C atau Java.

Karenanya, sebagian besar skenario untuk bekerja dengan WebAssembly melibatkan penulisan kode dalam bahasa tingkat tinggi dan mengubahnya menjadi WebAssembly. Ini dapat dilakukan dengan salah satu dari tiga cara dasar:

  • Kompilasi langsung. Sumber diterjemahkan ke dalam WebAssembly melalui toolchain kompiler bahasa itu sendiri. Rust, C / C ++, Kotlin / Native, dan D sekarang semuanya memiliki cara native untuk mengeluarkan WASM dari compiler yang mendukung bahasa tersebut.
  • Alat pihak ketiga. Bahasa ini tidak memiliki dukungan WASM asli di toolchainnya, tetapi utilitas bagian ketiga dapat digunakan untuk mengonversi ke WASM. Java, Lua, dan rumpun bahasa .Net semuanya memiliki dukungan seperti ini.
  • Penerjemah berbasis WebAssembly. Di sini, bahasanya sendiri tidak diterjemahkan ke dalam WebAssembly; alih-alih, juru bahasa untuk bahasa, yang ditulis dalam WebAssembly, menjalankan kode yang ditulis dalam bahasa tersebut. Ini adalah pendekatan yang paling rumit, karena penafsir mungkin memiliki beberapa megabyte kode, tetapi ini memungkinkan kode yang ada yang ditulis dalam bahasa untuk menjalankan semuanya tetapi tidak berubah. Python dan Ruby keduanya memiliki penerjemah yang diterjemahkan ke WASM.

Fitur WebAssembly

WebAssembly masih dalam tahap awal. Toolchain dan implementasi WebAssembly lebih mendekati bukti konsep daripada teknologi produksi. Meskipun demikian, penjaga WebAssembly telah mengarahkan pandangan mereka untuk membuat WebAssembly lebih berguna melalui serangkaian inisiatif:

Primitif pengumpulan sampah

WebAssembly tidak secara langsung mendukung bahasa yang menggunakan model memori yang dikumpulkan dari sampah. Bahasa seperti Lua atau Python hanya dapat didukung dengan membatasi kumpulan fitur atau dengan menyematkan seluruh runtime sebagai WebAssembly yang dapat dieksekusi. Namun ada pekerjaan yang sedang dilakukan untuk mendukung model memori yang dikumpulkan sampah terlepas dari bahasa atau implementasinya.

Threading

Dukungan asli untuk threading adalah umum untuk bahasa seperti Rust dan C ++. Tidak adanya dukungan threading di WebAssembly berarti bahwa seluruh kelas perangkat lunak bertarget WebAssembly tidak dapat ditulis dalam bahasa tersebut. Proposal untuk menambahkan threading ke WebAssembly menggunakan model threading C ++ sebagai salah satu inspirasinya.

Operasi memori massal dan SIMD

Operasi memori massal dan paralelisme SIMD (instruksi tunggal, banyak data) harus dimiliki untuk aplikasi yang mengerjakan tumpukan data dan membutuhkan akselerasi CPU asli agar tidak tersedak, seperti pembelajaran mesin atau aplikasi ilmiah. Proposal siap untuk menambahkan kemampuan ini ke WebAssembly melalui operator baru.

Konstruksi bahasa tingkat tinggi

Banyak fitur lain yang dipertimbangkan untuk memetakan WebAssembly langsung ke konstruksi tingkat tinggi dalam bahasa lain.

  • Pengecualian dapat diemulasikan dalam WebAssembly, tetapi tidak dapat diimplementasikan secara native melalui set instruksi WebAssembly. Rencana pengecualian yang diusulkan melibatkan primitif pengecualian yang kompatibel dengan model pengecualian C ++, yang pada gilirannya dapat digunakan oleh bahasa lain yang dikompilasi ke WebAssembly.
  • Jenis referensi  memudahkan untuk menyebarkan objek yang digunakan sebagai referensi ke lingkungan host. Ini akan membuat pengumpulan sampah dan sejumlah fungsi tingkat tinggi lainnya lebih mudah diterapkan di WebAssembly.
  • Tail call , pola desain yang digunakan dalam banyak bahasa.
  • Fungsi yang mengembalikan banyak nilai , misalnya, melalui tupel dengan Python atau C #.
  • Operator ekstensi tanda , operasi matematika tingkat rendah yang berguna. (LLVM mendukung ini juga.)

Alat debugging dan pembuatan profil

Salah satu masalah terbesar dengan JavaScript yang ditranspilasi adalah kesulitan debugging dan profiling, karena ketidakmampuan untuk menghubungkan antara kode yang ditranspilasi dan sumbernya. Dengan WebAssembly, kami memiliki masalah yang serupa, dan itu ditangani dengan cara yang serupa (dukungan peta sumber). Lihat catatan proyek tentang dukungan perkakas yang direncanakan.