Apa itu WebAss Assembly? Platform web generasi seterusnya menerangkan

Selama dua dekad sekarang, kami hanya mempunyai satu bahasa pengaturcaraan yang dapat digunakan secara asli dalam penyemak imbas web: JavaScript. Kematian lambat dari pemalam binari pihak ketiga telah mengesampingkan bahasa lain, seperti Java dan Flash ActionScript, sebagai warga kelas pertama untuk pembangunan web. Bahasa web lain, seperti CoffeeScript, hanya disusun ke JavaScript.

Tetapi sekarang kita mempunyai kemungkinan baru: WebAssembly, atau WASM secara ringkas. WebAssembly adalah format binari kecil yang cepat yang menjanjikan prestasi hampir asli untuk aplikasi web. Plus, WebAssembly dirancang untuk menjadi sasaran penyusunan bahasa apa pun, dengan JavaScript menjadi salah satu daripadanya. Dengan setiap penyemak imbas utama kini menyokong WebAssembly, sudah tiba masanya untuk mula berfikir secara serius mengenai menulis aplikasi sisi pelanggan untuk web yang dapat disusun sebagai WebAssembly.

Perlu diperhatikan bahawa aplikasi WebAssembly tidak bertujuan untuk menggantikan aplikasi JavaScript — sekurang-kurangnya, belum. Sebaliknya, fikirkan WebAssembly sebagai pendamping JavaScript. Di mana JavaScript fleksibel, ditaip secara dinamik, dan disampaikan melalui kod sumber yang dapat dibaca oleh manusia, WebAssembly berkelajuan tinggi, sangat ditaip, dan dihantar melalui format binari padat.

Pembangun harus mempertimbangkan WebAss Assembly untuk kes penggunaan berintensifkan prestasi seperti permainan, streaming muzik, penyuntingan video, dan aplikasi CAD.

Bagaimana WebAss Assembly berfungsi

WebAssembly, yang dikembangkan oleh W3C, dengan kata-kata para penciptanya sebagai "sasaran penyusunan." Pembangun tidak menulis WebAss Assembly secara langsung; mereka menulis dalam bahasa pilihan mereka, yang kemudian disusun ke dalam kod WebAssembly. Bytecode kemudian dijalankan pada klien - biasanya dalam penyemak imbas web - di mana ia diterjemahkan ke dalam kod mesin asli dan dilaksanakan pada kelajuan tinggi.

Kod WebAssembly dimaksudkan untuk memuat, mengurai, dan melaksanakan lebih cepat daripada JavaScript. Apabila WebAssembly digunakan oleh penyemak imbas web, masih ada overhead memuat turun modul WASM dan menyiapkannya, tetapi semua perkara lain yang sama WebAssembly berjalan lebih cepat. WebAssembly juga menyediakan model pelaksanaan kotak pasir, berdasarkan model keamanan yang sama yang ada untuk JavaScript sekarang.

Sekarang ini, menjalankan WebAssembly dalam penyemak imbas web adalah kes penggunaan yang paling biasa, tetapi WebAssembly bertujuan untuk lebih daripada penyelesaian berasaskan web. Akhirnya, ketika spesifikasi WebAssembly muncul dan lebih banyak ciri muncul di dalamnya, ia mungkin berguna dalam aplikasi mudah alih, aplikasi desktop, pelayan, dan lingkungan pelaksanaan lain.

Kes penggunaan WebAss Assembly

Kes penggunaan paling asas untuk WebAssembly adalah sebagai sasaran untuk menulis perisian dalam penyemak imbas. Komponen yang disusun ke WebAssembly boleh ditulis dalam beberapa bahasa; muatan WebAss Assembly akhir kemudian dihantar melalui JavaScript kepada pelanggan.

WebAssembly telah dirancang dengan mempertimbangkan beberapa kes penggunaan berasaskan penyemak imbas yang berprestasi, seperti permainan, streaming muzik, penyuntingan video, CAD, enkripsi, dan pengenalan gambar, untuk beberapa nama.

Secara lebih umum, memberi petunjuk untuk memberi tumpuan kepada ketiga-tiga bidang ini semasa menentukan kes penggunaan WebAss Assembly anda:

  • Kod berprestasi tinggi yang sudah ada dalam bahasa yang boleh disasarkan. Sebagai contoh, jika anda mempunyai fungsi matematik berkelajuan tinggi yang sudah ditulis dalam C, dan anda ingin memasukkannya ke dalam aplikasi web, anda boleh menggunakannya sebagai modul WebAssembly. Bahagian aplikasi yang kurang kritikal dan berprestasi pengguna boleh kekal dalam JavaScript.
  • Kod berprestasi tinggi yang perlu ditulis dari awal, di mana JavaScript tidak sesuai. Sebelum ini, seseorang mungkin telah menggunakan asm.js untuk menulis kod tersebut. Anda masih boleh melakukannya, tetapi WebAssembly diposisikan sebagai penyelesaian jangka panjang yang lebih baik.
  • Memindahkan aplikasi desktop ke persekitaran web. Sebilangan besar demo teknologi untuk asm.js dan WebAss Assembly termasuk dalam kategori ini. WebAssembly dapat menyediakan substrat untuk aplikasi yang lebih bercita-cita tinggi daripada hanya GUI yang disajikan melalui HTML. (Lihat demo WebDSP, Zen Garden, dan Tanks.) Namun, ini bukan latihan sepele, kerana semua cara aplikasi desktop berinteraksi dengan pengguna perlu dipetakan ke setara WebAssembly / HTML / JavaScript.

Sekiranya anda mempunyai aplikasi JavaScript yang ada yang tidak mendorong sampul prestasi apa pun, sebaiknya tinggalkan sendiri pada tahap pengembangan WebAssembly ini. Tetapi jika anda memerlukan aplikasi itu untuk berjalan lebih pantas, WebAssembly mungkin membantu.

Sokongan bahasa WebAss Assembly 

WebAss Assembly tidak bermaksud ditulis secara langsung. Seperti namanya, ini lebih seperti bahasa pemasangan, sesuatu yang boleh dimakan oleh mesin, daripada bahasa pengaturcaraan peringkat tinggi dan mesra manusia. WebAssembly lebih dekat dengan representasi perantaraan (IR) yang dihasilkan oleh infrastruktur penyusun bahasa LLVM, daripada seperti C atau Java.

Oleh itu, kebanyakan senario untuk bekerja dengan WebAssembly melibatkan menulis kod dalam bahasa tahap tinggi dan mengubahnya menjadi WebAssembly. Ini boleh dilakukan dengan tiga cara asas:

  • Penyusunan langsung. Sumbernya diterjemahkan ke dalam WebAss Assembly melalui alatan penyusun bahasa itu sendiri. Rust, C / C ++, Kotlin / Native, dan D kini semuanya mempunyai cara asli untuk mengeluarkan WASM dari penyusun yang menyokong bahasa tersebut.
  • Alat pihak ketiga. Bahasa itu tidak mempunyai sokongan WASM asli dalam rantai alatnya, tetapi utiliti bahagian ketiga dapat digunakan untuk menukar ke WASM. Java, Lua, dan keluarga bahasa .Net semuanya mempunyai sokongan seperti ini.
  • Jurubahasa berasaskan WebAss Assembly. Di sini, bahasa itu sendiri tidak diterjemahkan ke dalam WebAssembly; sebaliknya, jurubahasa untuk bahasa, ditulis dalam WebAss Assembly, menjalankan kod yang ditulis dalam bahasa. Ini adalah pendekatan yang paling membebankan, kerana jurubahasa mungkin terdiri daripada beberapa megabait kod, tetapi membenarkan kod yang ada yang ditulis dalam bahasa berjalan semua tetapi tidak berubah. Python dan Ruby kedua-duanya mempunyai jurubahasa yang diterjemahkan ke WASM.

Ciri pemasangan Web

WebAss Assembly masih di peringkat awal. Rangkaian alat dan pelaksanaan WebAssembly tetap dekat dengan bukti konsep daripada teknologi pengeluaran. Oleh itu, penjaga WebAssembly mempunyai pandangan untuk menjadikan WebAssembly lebih berguna melalui satu siri inisiatif:

Primitif pengumpulan sampah

WebAssembly tidak menyokong bahasa yang menggunakan model memori yang dikumpulkan sampah secara langsung. Bahasa seperti Lua atau Python hanya dapat disokong dengan membatasi set fitur atau dengan menyisipkan keseluruhan masa berjalan sebagai WebAss Assembly yang dapat dilaksanakan. Tetapi ada usaha untuk menyokong model memori yang dikumpulkan sampah tanpa mengira bahasa atau pelaksanaannya.

Threading

Sokongan asli untuk utas adalah biasa bagi bahasa seperti Rust dan C ++. Ketiadaan sokongan threading dalam WebAssembly bermaksud bahawa keseluruhan kelas perisian yang disasarkan WebAssembly tidak dapat ditulis dalam bahasa-bahasa tersebut. Cadangan untuk menambahkan threading ke WebAssembly menggunakan model threading C ++ sebagai salah satu inspirasinya.

Operasi memori pukal dan SIMD

Operasi memori pukal dan SIMD (arahan tunggal, banyak data) paralelisme mesti ada untuk aplikasi yang mengisar melalui timbunan data dan memerlukan pecutan CPU asli agar tidak tersedak, seperti pembelajaran mesin atau aplikasi saintifik. Cadangan disediakan untuk menambahkan keupayaan ini ke WebAss Assembly melalui pengendali baru.

Konstruk bahasa tahap tinggi

Banyak ciri lain yang dipertimbangkan untuk peta WebAss Assembly terus ke konstruk peringkat tinggi dalam bahasa lain.

  • Pengecualian dapat dicontohi dalam WebAssembly, tetapi tidak dapat dilaksanakan secara asli melalui set arahan WebAssembly. Rencana pengecualian yang dicadangkan melibatkan primitif pengecualian yang kompatibel dengan model pengecualian C ++, yang pada gilirannya dapat digunakan oleh bahasa lain yang disusun ke WebAssembly.
  • Jenis rujukan  menjadikannya lebih mudah untuk menyebarkan objek yang digunakan sebagai rujukan ke persekitaran host. Ini akan menjadikan pengumpulan sampah dan sejumlah fungsi peringkat tinggi lain lebih mudah dilaksanakan dalam WebAssembly.
  • Panggilan ekor , corak reka bentuk yang digunakan dalam banyak bahasa.
  • Fungsi yang mengembalikan banyak nilai , misalnya, melalui tupel di Python atau C #.
  • Pengendali pelanjutan tanda , operasi matematik peringkat rendah yang berguna. (LLVM menyokong ini juga.)

Alat debug dan profil

Salah satu masalah terbesar dengan JavaScript transpil adalah kesukaran melakukan debug dan profil, kerana ketidakmampuan untuk berkorelasi antara kod transpile dan sumbernya. Dengan WebAssembly, kami mempunyai masalah yang serupa, dan ini ditangani dengan cara yang serupa (sokongan peta sumber). Lihat nota projek mengenai sokongan perkakas yang dirancang.