Wasm adalah CGI yang baru
(roborooter.com)- Wasm bukanlah protokol CGI, melainkan bisa dilihat sebagai model aplikasi berikutnya yang akan mengubah unit eksekusi dan cara deployment aplikasi web, seperti yang pernah dilakukan
cgi-bin - CGI, FastCGI, Rack/WSGI, dan serverless semuanya telah merancang ulang pemrosesan request dan pengelolaan server, dengan tujuan bersama untuk membuat aplikasi berkinerja tinggi lebih mudah dibuat dan dipelihara
- Modul Wasm berjalan di runtime host, dan melalui memori terisolasi serta snapshot dapat mengurangi biaya startup sambil mempertahankan status eksekusi yang bersih
- Ketiadaan thread native, tidak bisa JIT, biaya penyalinan data, serta belum matangnya Interface Types dan module linking adalah batasan utama model eksekusi server berbasis Wasm
- Jika fungsi serverless dan edge function digabungkan dengan lingkungan eksekusi Wasm, biaya cold start dan isolasi dapat diturunkan, dan modul dari berbagai bahasa dapat dikomposisikan dengan lebih ringan
Model aplikasi web dari CGI hingga serverless
- Inti CGI bukanlah protokol Common Gateway Interface itu sendiri, melainkan model aplikasi yang memanggil skrip atau file executable yang diletakkan di folder
cgi-binlewat URL - Cara ini adalah model aplikasi web awal yang mengubah web dari arsip dokumen menjadi jaringan aplikasi yang dapat berinteraksi
- Karena strukturnya menjalankan proses baru untuk setiap request, menurut standar saat ini biaya startup proses dan parsing skrip menjadi bottleneck besar
Perubahan FastCGI dan web server per bahasa
- FastCGI memperkenalkan model di mana proses yang hidup lama menangani request CGI untuk mengurangi masalah performa CGI
- Web server berkomunikasi dengan satu atau lebih proses jangka panjang tanpa menjalankan proses baru untuk setiap request
- Aplikasi CGI yang sudah ada dibuat dengan asumsi proses berakhir setelah request, sehingga di lingkungan jangka panjang mudah terjadi kebocoran resource
- Setelah itu, web server berbasis bahasa menjadi konvensi, dan aplikasi dibuat dengan berpusat pada model request/response
- Umumnya aplikasi ditempatkan di belakang web server yang kaya fitur dan teruji seperti Apache atau nginx, sehingga aplikasi dipisahkan dari request lambat dan detail HTTP
- Implementasi server menggunakan berbagai strategi manajemen proses, seperti fork per request, thread OS atau bahasa, event, atau model reactor
- Antarmuka Rack dari komunitas Ruby juga memengaruhi server aplikasi Flask di Python dan spesifikasi WSGI
- Secara sederhana, request terdiri dari metode HTTP, hashmap header, serta string byte input atau stream
- Response terdiri dari kode status, objek header, serta string byte response atau stream
Autoscaling cloud dan kompromi serverless
- Dalam model berbasis server fisik atau server virtual, jumlah server yang berjalan harus dikelola sendiri
- Jika traffic tinggi, server aplikasi bisa melambat
- Jika traffic rendah, banyak komputer bisa tetap menganggur
- Autoscaling di cloud memungkinkan jumlah server aplikasi disesuaikan berdasarkan CPU, beban memori, dan waktu
- Menambah komputer baru bisa memakan waktu 2–20 menit, tergantung aplikasi dan konfigurasinya
- Scaling juga bergantung pada resource yang tersedia di region hosting cloud
- Komputasi serverless yang menggabungkan Amazon Lambda dan API Gateway menciptakan model yang mengelola fungsi alih-alih server
- Menjamin satu proses, CPU terisolasi, dan memori terisolasi untuk setiap request
- Proses dapat digunakan kembali hingga beberapa jam, tetapi akan dijeda atau dihapus jika tidak digunakan
- AWS dapat scale up dan scale down dalam hitungan detik sesuai volume request
- Serverless memiliki trade-off yang jelas
- Karena biaya proses baru, saat memperluas request konkuren sebagian request mengalami cold start
- Proses dapat dijeda setelah response, sehingga pengelolaan koneksi TCP persisten antar-request menjadi sulit
- API database berbasis HTTP populer dalam model serverless karena dapat menahan banyak koneksi dan mudah scale up/down bersama fungsi
- Karakteristik menyediakan CPU dan memori khusus untuk setiap request bisa menjadi kelebihan maupun kekurangan, tergantung workload
- Sebagian workload dapat mengurangi manajemen resource serta menurunkan kekhawatiran biaya dan scaling
- Workload lain bisa lebih efisien ketika satu proses menangani banyak request atau memanfaatkan batching dan caching dengan memori bersama
- Disajikan bersama contoh aplikasi web berbasis CMS yang dipindahkan ke serverless dan memangkas biaya 90%, serta layanan analitik event yang dipindahkan ke model berbasis server dan memangkas biaya 90%
Model eksekusi Wasm di server
- Wasm awalnya dikembangkan untuk menjalankan kode berkinerja tinggi di browser, dan juga terkait dengan upaya seperti asm.js
- WebAssembly adalah format instruksi biner untuk mesin virtual berbasis stack, dan dirancang sebagai target kompilasi portabel untuk berbagai bahasa pemrograman
- Memungkinkan deployment aplikasi klien dan server di web
- Dirancang agar dienkode dalam format biner yang efisien untuk ukuran dan waktu loading
- Bertujuan menjalankan program dengan kecepatan mendekati native dengan memanfaatkan kemampuan hardware umum di berbagai platform
- Saat ini, berbagai bahasa dapat dikompilasi menjadi instruksi Wasm dan dijalankan baik di browser maupun server
- Model isolasi dan keamanan yang dibutuhkan browser juga berguna untuk aplikasi server
- Kode yang tidak tepercaya dapat diisolasi dalam bentuk yang jauh lebih ringan daripada VM atau container Docker
- Lingkungan serverless berbasis V8 seperti Node.js, Cloudflare Workers, dan Deno memanfaatkan kemampuan eksekusi Wasm yang telah terakumulasi di browser
- Ada juga lingkungan native Wasm seperti Fastly, Shopify, dan Suborbital
Modul, host, memori, snapshot
- Karena modul Wasm adalah instruksi untuk mesin virtual, dibutuhkan runtime untuk mengeksekusinya
- Runtime mengompilasi Wasm umum agar sesuai dengan arsitektur lokal dan menyediakan lingkungan eksekusi
- Sebagian lingkungan menyediakan antarmuka yang mirip dengan POSIX API pada sistem Linux
- Sebagian lingkungan hanya menyediakan fungsi tertentu dari sistem host dan membuat fungsi export dari modul dijalankan
- Program WebAssembly tersusun dalam unit modules, dan VM yang menjalankan modul disebut host
- Modul adalah unit deployment, loading, dan kompilasi
- Modul mengumpulkan definisi type, function, table, memory, dan global value
- Modul dapat mendeklarasikan import dan export serta menyediakan inisialisasi dalam bentuk data segment, element segment, dan start function
- “Memories” di Wasm direpresentasikan sebagai array byte kontigu tanpa celah, yang dialokasikan oleh host pada saat instansiasi
- Setiap modul guest memperoleh isolasi memori
- Memori ini bertindak seperti RAM pada mesin virtual
- Memori dapat diberikan dalam keadaan kosong atau diisi sebelumnya dengan data segment
- Berkat cara isolasi modul, modul dapat dijeda dan memorinya disimpan sebagai data segment
- Konsepnya mirip dengan snapshot mesin virtual
- Beberapa salinan dari modul yang dijeda dapat dimulai
- Wizer menginstansiasi modul Wasm, menjalankan fungsi inisialisasi, lalu merekam status instance untuk menulis ulang biner Wasm
- Menginisialisasi langsung status global value
- Merekam area memori yang bukan nol
- Menghapus data segment yang ada dan menggantinya dengan data segment untuk area memori yang direkam
- Cara ini menyediakan eksekusi yang bersih seperti proses baru sambil menghindari biaya startup proses baru
- Mendekati CGI tanpa kekurangan CGI
- Dalam istilah modern, mendekati serverless tanpa cold start
Batasan dan keunggulan Wasm
- Wasm dalam konfigurasi native tidak memiliki thread
- Operasi blocking harus dipindahkan ke metode host
- Host dapat menyediakan wrapper untuk membaca/menulis file atau antarmuka jaringan, menjeda modul, atau menyediakan callback handler
- Model reactor atau model blocking dapat dibuat, tetapi hingga thread proposal diterapkan, desain lingkungan eksekusi memegang peran besar
- Karena alasan keamanan, pembuatan kode Wasm dinamis tidak diizinkan, sehingga kompilasi JIT tidak dapat dilakukan
- Di runtime, kode itu sendiri tidak dapat diperlakukan sebagai alamat
- Lingkungan eksekusi seperti V8 dan CRuby yang bergantung pada JIT untuk performa tidak dapat berjalan di Wasm VM atau harus mengorbankan JIT
- Pendekatan “pre-jit” yang menghasilkan runtime teroptimasi untuk skrip pada tahap build pernah diusulkan, tetapi belum banyak digunakan
- Antarmuka dasar antara modul Wasm dan host adalah memori, sehingga perpindahan data mungkin memerlukan penyalinan
- Berbagi potongan memori dimungkinkan, tetapi apakah bisa atau disarankan bergantung pada model memori runtime
- Di sebagian besar runtime, komunikasi zero-copy antara modul dan operasi I/O dianggap sulit
- Memindahkan data streaming masuk dan keluar modul Wasm bisa lebih lambat dibanding menanganinya di host
- Wasm VM memberikan kontrol tinggi dalam hal pembatasan penggunaan
- Sebagian runtime dapat menegakkan batas CPU dengan menghitung jumlah instruksi CPU, seperti konsep fuel Wasmtime
- VM dapat membatasi memori dan wall clock time
- Interface Types dan module linking dapat mengurangi ukuran modul serta meningkatkan kecepatan I/O dan usability
- Interface Types sudah dapat digunakan, tetapi belum menjadi standar yang diratifikasi
- Module linking memiliki prototipe yang berjalan, tetapi belum ada pendekatan standar
- Wizer saat ini bisa berbenturan dengan module linking, dan ada pendekatan kustom untuk menyelesaikannya, tetapi belum ada pemenang yang jelas
- Interface Types mengarah pada memungkinkan objek netral bahasa melewati batas memori Wasm tanpa encoding/decoding yang mahal
- Cara yang umum saat ini adalah menyalin JSON masuk dan keluar memori
- Secara default, modul Wasm hanya dapat mengakses hal yang diberikan kepadanya, sehingga model keamanannya kecil dan jelas
- Menjalankan kode Wasm yang tidak tepercaya umumnya cukup aman
- Permukaan serangan VM lebih kecil daripada Docker atau model isolasi lain
- Karena menjalankan instruksi yang diterjemahkan pada hardware host, timing attack mungkin terjadi, tetapi ada mitigasinya
- Wasm juga dapat dikompilasi menjadi biner native, tetapi permukaan serangannya menjadi lebih besar
Edge function dan eksekusi fungsi berbasis Wasm
- Jika lingkungan eksekusi dan alat pengembangan Wasm digunakan secara luas, bahasa skrip juga dapat terdorong untuk menyediakan pendekatan preboot seperti runtime Wasm dan Wizer
- Secara teori, aplikasi dapat dilanjutkan dari salinan tersnapshot untuk setiap request dan berjalan lebih cepat daripada model lain saat ini
- CLI lokal juga dapat ditulis dengan Ruby lalu didistribusikan sebagai modul Wasm tersnapshot dan dihubungkan ke runtime Wasm Ruby, sehingga memperoleh waktu startup mendekati utilitas C++ dan dapat dibatasi agar hanya bekerja di dalam direktori proyek
- Perubahan besar pertama adalah memindahkan fungsi ke edge yang dekat dengan pengguna
- Komputasi dilakukan di dekat pengguna, bukan di dekat database
- Vercel Edge Functions berbasis V8, tetapi disajikan sebagai contoh yang berbagi banyak prinsip
- next-auth dapat mengontrol akses ke halaman pra-render berdasarkan token login JWT
- Konten personalisasi dinamis yang tersusun dari data yang di-cache di CDN dapat disajikan
- Perubahan lain adalah mengganti fungsi berbasis proses dalam aplikasi serverless dengan fungsi berbasis Wasm
- Suborbital memungkinkan pembuatan langsung lingkungan eksekusi fungsi berbasis Wasm, dan juga menyediakan cara merangkai fungsi Wasm menjadi workflow
- Banyak platform eksekusi merekomendasikan satu modul per request dan dianggap belum cukup memanfaatkan kemungkinan berbagi memori atau pemanggilan cepat banyak modul
- Jika Interface Types distandardisasi, model data middleware yang mirip Rack dapat muncul
- Wasm juga dapat berjalan di dalam fungsi Lambda
- Versi aplikasi yang tersnapshot dapat digunakan pada infrastruktur yang ada
- Kombinasi ini menarik, tetapi diperlakukan sebagai campuran teknologi yang pada akhirnya bisa menghilang
Arah model aplikasi web berikutnya
- Wasm disajikan sebagai teknologi yang dapat meningkatkan performa, mempermudah keamanan tingkat proses, serta menurunkan biaya build dan eksekusi fungsi serverless
- Hampir semua bahasa dapat dijalankan, dan module linking serta Interface Types dapat menurunkan latensi antar-fungsi secara signifikan
- Dasar utama untuk melihat Wasm sebagai CGI yang baru adalah bahwa ketika batasan sistem berubah, hal-hal yang sebelumnya mustahil menjadi mungkin
1 komentar
Komentar Hacker News
Saya tidak begitu paham apa bedanya WASM dengan teknologi lama seperti Java Applet, ActiveX, Silverlight, dan Macromedia Flash
Saya kira kita sudah belajar dari menjalankan kode kompilasi pihak ketiga yang tidak tepercaya di browser, dan ini terlihat seperti struktur yang memindahkan biaya komputasi server ke klien atas nama peningkatan pengalaman pelanggan
Implementasinya penuh kerentanan dan pada akhirnya secara praktis tidak bisa lagi dipakai di browser; teknologi lain sepertinya bahkan sejak awal tidak membuat janji seperti itu
JavaScript benar-benar memenuhi janji itu, dan browser masa kini menjalankan JavaScript yang diunduh dari domain mana pun tanpa bertanya kepada pengguna apakah mereka memercayainya
WASM berjalan di atas engine JavaScript dan memberikan jaminan keamanan serupa, jadi secara mendasar tidak berbeda dari bytecode JVM; perbedaan praktisnya adalah WASM telah membuktikan keamanannya, sedangkan JVM tidak
Kini Google Chrome cukup aman sehingga sekalipun miliaran orang menjalankan WASM berbahaya, ponsel mereka tidak akan diretas; engine ini bisa dibawa ke server untuk menjalankan skrip dari banyak pengguna di dalam sandbox yang kuat sambil berbagi sumber daya
Alternatifnya adalah virtualisasi: kode bisa dikompilasi menjadi bongkahan WASM dan dijalankan di server WASM besar, atau binary amd64 bisa dibundel dengan kernel Linux yang dipangkas dan dijalankan di VM
Saat ini sulit mengatakan mana yang jelas menjadi pemenang, dan tiap pendekatan punya kelebihan serta kekurangan
Berbeda dari JVM, WASM menyediakan memori linear dan secara default tidak memiliki garbage collection, sehingga lebih cocok menjadi target kompilasi untuk jajaran bahasa yang lebih luas, seperti mengompilasi C/C++ dengan Emscripten atau menargetkan Rust
WASM adalah bytecode, dan menurut saya sebagian besar implementasi berbagi banyak hal dengan engine dan runtime JavaScript host
Perpindahan biaya komputasi antara klien dan server adalah bagian dari tren industri yang sejak lama berayun antara thick client dan thin client, dan pendulum ini akan terus bergerak
Ada spesifikasi validasi yang harus dipatuhi bytecode Wasm, dan subset yang tervalidasi ini membuat banyak kerentanan keamanan yang terlihat pada teknologi masa lalu menjadi mustahil sejak awal
Serangan seperti Heartbleed atau Rowhammer yang mengandalkan malfungsi hardware mungkin saja bisa terjadi, tetapi misalnya menipu VM agar menafsirkan angka sebagai pointer lalu mengacu ke luar memori Wasm miliknya sendiri tidak bisa dilakukan
Bytecode Wasm relatif sangat sederhana untuk diubah menjadi machine code, sehingga implementasinya bisa lebih kecil dan lebih cepat daripada memakai VM
Tidak dimiliki perusahaan tertentu, memiliki spesifikasi publik yang ditulis dengan baik dan bisa digunakan siapa saja, serta diadopsi sebagai standar web sehingga tidak membutuhkan ekstensi browser
Komputasi klien sudah terjadi di JavaScript, dan kode Wasm bisa efisien dengan cara yang tidak mungkin dilakukan JavaScript, jadi justru makin demikian
Applet dimediasi sampai batas tertentu, ActiveX hampir tidak sama sekali, dan “platform luar” WASM kira-kira adalah runtime JavaScript, sedangkan platform luar Applet lebih dekat ke execve(2)
WASM bisa saja digunakan untuk itu, tetapi tidak selalu, dan perbedaan seperti sandboxing serta isolasi yang lebih baik juga sudah dibahas dengan baik oleh jawaban lain
Mengatakan “Amazon membuka era komputasi serverless dengan Lambda” kurang tepat, karena Google App Engine hadir pada 2008, enam tahun lebih awal daripada Lambda
Produk-produk seperti itu sudah ada dan punya nama beberapa tahun sebelumnya, jadi saya tidak begitu tahu mengapa muncul nama “serverless” atau dari mana asalnya
App Engine juga punya batch worker dan web worker, begitu pula Heroku
Keduanya adalah produk sebelum Docker, jadi mungkin orang merasakannya berbeda, tetapi sepertinya Lambda juga tidak diluncurkan dengan Docker sejak awal
Pernyataan bahwa “karena alasan keamanan, pembuatan kode Wasm dinamis tidak diizinkan sehingga kompilasi JIT tidak mungkin” tampaknya tidak tepat
Untuk mengizinkan hal seperti hot reloading kode yang bersih, itu pada dasarnya mendekati fitur fundamental
Menurut saya logika keamanannya rapuh
JS bisa melakukan hot reload saat berjalan atau pembuatan kode yang lebih ekstrem tanpa merusak keamanan, dan jika seluruh runtime Wasm dimuat ulang secara dinamis sambil mempertahankan memori, pembuatan kode atau hot reload juga bisa ditiru, tetapi pengalaman penggunanya akan terasa kaku
Saya tidak melihat alasan mengapa secara teknis itu harus mustahil, dan jika ini langkah keamanan, tampaknya terlalu mudah diakali
Bytecode WASM secara konseptual sangat mirip dengan .NET IL atau bytecode Java, yang memang dirancang dengan kompilasi JIT dalam pikiran
Saya kurang menyukai WASM karena terasa seperti proyek yang kurang memiliki arah kuat dan kemauan untuk membuatnya berhasil tepat waktu
Namanya mengisyaratkan “assembly untuk web”, yaitu bahasa mesin untuk CPU virtual, tetapi kenyataannya lebih merupakan representasi perantara untuk backend compiler, dan konsepnya tidak jelas karena fitur tingkat tinggi seperti dukungan garbage collection juga direncanakan
Fitur dasar seperti hot reload yang disebutkan tadi, threading yang tidak terasa seperti peretasan, integrasi langsung dengan DOM tanpa JavaScript, API grafis/komputasi ber-overhead rendah, dan akses audio tingkat rendah juga masih kurang
Sulit menjalankan aplikasi multimedia besar tanpa kompromi besar
Wasm tidak dapat menandai memori sebagai dapat dieksekusi dan pada praktiknya kode dan memori terpisah seperti arsitektur Harvard
Selain itu, ia juga tidak bisa melompat ke posisi kode sembarang, dan bahkan tidak memiliki instruksi jump
JIT di sini berarti mengompilasi dan menjalankan kode native saat runtime, dan di browser atau sandbox Wasm itu menjadi kelemahan keamanan besar
Ini tertanam dalam desain dan set instruksinya, jadi bukan sesuatu yang mudah diakali; detailnya bisa dilihat di https://webassembly.org/docs/security/
Wasm memang mirip dengan .NET IL atau bytecode Java dalam arti engine yang menangani JIT, tetapi berbahaya memberikan pengguna hak untuk keluar dari runtime, membuat kode native, lalu melompat ke sana
Karena itu, seperti JIT, saat pertama kali menjalankan kode WASM bisa terlihat sedikit “tersendat saat pemanasan”, meski dalam beberapa tahun terakhir ini jauh membaik
Selain itu, setahu saya di browser kita bisa membuat, menginstansiasi, dan menjalankan bongkahan WASM secara dinamis
Saya tidak tahu apakah ini juga mungkin di runtime WASM lain, dan di browser pun harus lewat JavaScript, tetapi untuk mengakses “web API” apa pun, pada akhirnya itu memang diperlukan
WASM mengubah VM yang khusus untuk bahasa tertentu, seperti JavaScript VM, menjadi VM serbaguna yang bisa digunakan di mana pun JavaScript VM digunakan
Tentu saja tidak terbatas hanya di sana
Serbaguna berarti hampir apa pun bisa dijalankan selama ada compiler atau interpreter, termasuk JavaScript
Karena umumnya diimplementasikan sebagai bagian dari engine JavaScript, ia mewarisi banyak karakteristik seperti sandboxing dan akses ke API terkait
Standarisasi akses tersebut masih berjalan, tetapi pada akhirnya hal-hal yang saat ini hanya mungkin dengan JavaScript akan menjadi mungkin juga di WASM, dan lebih banyak hal yang sulit atau mustahil dengan JavaScript juga akan menjadi mungkin
Bisa juga berjalan lebih cepat dan lebih mulus
Inti WASM adalah menghapus banyak keterbatasan yang ada di lingkungan tempat JavaScript populer
JavaScript adalah bahasa yang sangat memecah selera, jadi ia berubah dari satu-satunya pilihan menjadi salah satu dari beberapa pilihan
WASM pernah digambarkan sebagai pengganti JavaScript, pengganti Docker, pengganti Java, dan pengganti CGI; singkatnya, ia semua itu dan lebih dari itu
Terlalu banyak alat yang melakukan hal serupa dan batasnya tidak jelas
Pada akhirnya, meski semuanya bisa dibuat berjalan, secara pribadi rasanya rapuh, dan menakutkan bagi orang yang tidak menekuninya secara profesional
Belakangan ketika harus membuat sesuatu untuk web saya memakai leptos; pengalaman developernya jauh lebih baik, dan meski belum 1.x, rasanya lebih stabil daripada merangkai lima alat untuk mentranspilasi, mengobfuskasi, mengecilkan, dan memaketkan bundle JS
Membaca tulisan ini mengingatkan saya pada hukum perangkat lunak yang dulu sering disebut-sebut
Aplikasi yang cukup besar dan bertahan cukup lama pada akhirnya akan mengimplementasikan ulang seluruh software stack tempat ia berjalan, bahkan sampai sistem operasinya, dan mengimplementasikannya dengan buruk
Saya tidak tahu sumbernya, tetapi sering kali cukup benar
“Program C atau Fortran yang cukup kompleks akan mengimplementasikan separuh Common Lisp secara ad hoc, berdasarkan spesifikasi informal, penuh bug, dan lambat”
Pola yang lebih umum disebut Inner-Platform Effect
Jika premis judulnya diperluas, agar WASM menjadi penerus sejati dari garis keturunan itu, ia harus semudah mengunggah dan mendistribusikan aplikasi PHP di stack LAMP milik penyedia hosting sembarang
Untuk saat ini, tampaknya belum semudah pengalaman deployment PHP
Saya tidak tahu apa yang Anda harapkan harus berubah di sisi hosting
Saya melihatnya berbeda
Menurut saya masa depan adalah local-first
Artinya aplikasi sebagian besar berjalan di dalam browser pengguna, dengan sangat sedikit bantuan dari server
Aplikasi seperti Figma, Linear, dan Superhuman memakai model ini dengan sangat sukses, dan Stackblitz juga sampai batas tertentu
Kalau aplikasi yang cukup kompleks seperti Figma bisa berjalan hampir sepenuhnya di dalam browser pengguna, saya rasa sebagian besar aplikasi juga bisa
Sisi server terutama berperan menyinkronkan data antarinstans yang berbeda saat pengguna memakai aplikasi dari beberapa lokasi
Alat seperti Electric-SQL sedang dibuat, tetapi belum matang; begitu pustaka-pustaka seperti ini matang, area ini akan tumbuh besar
Serverless pada umumnya ada agar perusahaan seperti Amazon dan Azure bisa menghasilkan uang, dan pada akhirnya akan menjadi seperti CGI
WASM juga bisa sukses, tetapi kemungkinan besar terutama di dalam browser pengguna
Microsoft memakai WASM untuk C#/Blazor, tetapi saya tidak yakin dotnet di dalam browser akan secepat JavaScript, jadi menurut saya itu bukan pendekatan yang tepat
Hanya saja tidak ada yang membicarakannya karena tidak bisa diskalakan sampai 1 triliun impresi iklan per detik
Setiap kali seseorang menulis satu serverless function, itu menambah 10 kaki pada yacht Bezos
Kalau sedang offline atau berada di tempat dengan Wi-Fi yang tidak stabil, desain tidak bisa dimuat; dan kalau belum berubah baru-baru ini, setelah mengedit lalu Wi-Fi terputus dan browser ditutup, perubahan tidak tersimpan
Dan ini juga sama sekali bukan ide baru
Kami sedang mengembangkan Blazor WASM, dan dari sisi performa dotnet bukan masalah
Pada dasarnya ini membuat ulang JVM dan ekosistemnya?
Terkadang membuat ulang X dengan pelajaran dari masa lalu memang bisa menjadi ide yang sangat bagus
Misalnya, sekitar 2010 ketika saya mulai mencari cara menjalankan kode C/C++ di browser, mengompilasi C/C++ ke JVM pada praktiknya mustahil
Saat itu Java Applet masih masuk akal, jadi kalau itu bisa dilakukan tentu bagus, tetapi WASM juga belum ada, sementara Emscripten sudah ada; dari situlah lewat asm.js pada akhirnya lahir WASM
Sebagai orang yang pernah mengutak-atik class loader dan menulis assembly JVM langsung di kelas bahasa pemrograman tahun 2000-an, saya juga tidak yakin JVM adalah puncak di bidang ini
Memang benar JVM memungkinkan ekosistem besar, tetapi antarmuka JVM dengan dunia luar benar-benar berantakan dan kaku
Selama lebih dari 20 tahun, setiap kali berhadapan dengan sesuatu terkait JVM, saya selalu mengeluh
Jika membandingkan packaging dan ekosistem Rust dengan Python, atau yang lebih mengerikan lagi C++, itu menunjukkan bahwa reinvention yang mengambil pelajaran dari beberapa dekade terakhir bisa menjadi hal yang sangat baik
Menggabungkan dua file wasm menjadi satu dan menyelaraskan penggabungan memorinya dengan benar masih sangat sulit
Component Model mungkin bisa memperbaikinya, tetapi terlalu banyak elemen yang membengkak tanpa perlu, sehingga adopsi Safari bisa memakan waktu lama
Sudah lama saya berpikir WASM akan menuju dunia di mana ia menggantikan kode fungsi Lambda di cloud
WASM secara tradisional dianggap berjalan di atas platform host, tetapi tidak ada alasan harus selalu begitu
Karena sifat sandbox WASM, secara teknis ia juga bisa dijalankan di luar sistem operasi atau di ring0 untuk melewati banyak overhead sistem operasi
Dengan mengompilasi ke WASM, berbagai masalah deployment menjadi jauh lebih sederhana bagi pengguna, dan lingkungan hosting punya lebih banyak ruang untuk optimasi
Bahkan hardware khusus untuk menjalankan WASM lebih cepat bisa saja memungkinkan
Buruk kalau harus mengeksekusi otomatis kode arbitrer yang tidak tepercaya dari sumber arbitrer yang tidak tepercaya, dan itu juga tidak bisa dianggap mengisi peran yang sama seperti CGI sisi server