- Di Go 1.24, fitur terkait WebAssembly (Wasm) diperluas
- Direktif
go:wasmexportditambahkan sehingga fungsi Go dapat dipanggil dari luar modul Wasm - Mode build “reactor” untuk WASI juga didukung, sehingga kode dapat dijalankan dalam keadaan aktif untuk jangka panjang
- Dengan ini, terbuka kemungkinan untuk memperluas aplikasi Go di lingkungan Wasm dengan lebih fleksibel
WebAssembly and the WebAssembly System Interface
- WebAssembly adalah format biner yang dibuat untuk menjalankan kode low-level berperforma tinggi di browser web
- Kini juga digunakan secara luas di luar browser, dan dapat berinteraksi dengan resource sistem melalui WebAssembly System Interface (WASI)
- Go mulai mendukung kompilasi Wasm pada versi 1.11 melalui port js/wasm, dan pada versi 1.21 menambahkan port baru yang menargetkan API system call WASI Preview 1 melalui port baru GOOS=wasip1
Export Fungsi Go ke Wasm dengan go:wasmexport
- Melalui direktif
go:wasmexportyang baru ditambahkan di Go 1.24, fungsi Go dapat diekspos sebagai export agar bisa dipanggil dari luar modul Wasm - Contoh: setelah mendeklarasikan
//go:wasmexport addlalu menulis fungsi, host Wasm dapat memanggil fungsi tersebut - Ini mirip dengan direktif
exportdi cgo, tetapi diimplementasikan dengan mekanisme yang lebih sederhana
Building a WASI Reactor
- WASI “reactor” berarti modul WebAssembly yang terus aktif dan dapat merespons event atau request
- Di Go 1.24, build WASI reactor didukung dengan opsi
-buildmode=c-shared - Flag build ini memberi tahu linker untuk tidak membuat fungsi _start (entry point modul perintah), dan sebagai gantinya membuat fungsi _initialize
- Reactor diinisialisasi melalui fungsi
_initialize, dan fungsi ini harus dipanggil lebih dulu alih-alih fungsi main
- Reactor diinisialisasi melalui fungsi
- Jika digunakan bersama runtime seperti Wazero, setelah memanggil
_initialize, fungsi yang diekspor dapat dipanggil ulang sebanyak yang diinginkan - Pendekatan ini berguna di lingkungan yang memanfaatkan Wasm sebagai mekanisme plugin atau ekstensi aplikasi
Dukungan Tipe yang Lebih Kaya antara Host dan Klien
- Di Go 1.24, batasan pada parameter/tipe return fungsi yang dipanggil dengan
go:wasmimportdilonggarkan - Misalnya, kini bisa mengoper bool, string, pointer int32, pointer struct, dan sebagainya
- Namun, masih ada batasan terkait perbedaan antara lingkungan 64-bit dan 32-bit
- Ini memungkinkan penulisan aplikasi Go Wasm yang lebih natural dan nyaman, sekaligus menghilangkan konversi tipe yang tidak perlu
Keterbatasan
- Wasm adalah arsitektur single-thread tanpa pemrosesan paralel
- Fungsi
go:wasmexportdapat membuat goroutine baru, tetapi fungsi yang membuat goroutine latar belakang tidak akan terus berjalan setelah fungsi go:wasmexport mengembalikan kontrol, sampai ada pemanggilan kembali ke modul Wasm berbasis Go - Meski beberapa batasan tipe telah dilonggarkan, masih ada pembatasan pada tipe yang dapat digunakan bersama fungsi
go:wasmimportdango:wasmexport- Masih ada kendala dalam pengiriman tipe komposit yang menyertakan pointer
Kesimpulan
- Penambahan build WASI reactor dan fitur
go:wasmexportdi Go 1.24 merupakan peningkatan yang sangat memperluas ekosistem Wasm di Go - Ini membuka kemungkinan baru bagi Go di ekosistem Wasm dengan membantu developer membuat aplikasi Wasm berbasis Go yang lebih beragam
3 komentar
Sebelum
Wasm/gcdiadopsi secara luas, sepertinya lebih baik mengembangkan target wasm dengan bahasa yang tidak memiliki gc.Di rilis Go 1.24 hal ini hanya dijelaskan secara singkat, tetapi ini pembaruan yang jauh lebih penting.
Komentar Hacker News
Ada masalah besar bahwa biner WASM yang dihasilkan oleh Go sangat besar. TinyGo mengatasi hal ini, tetapi kecepatan kompilasinya lambat dan pemilihan library perlu diperhatikan. Untuk mengatasi keduanya, dibutuhkan banyak kesabaran
hello-worldbisa dijalankan, tetapi yang lebih kompleks melebihi batas ukuranIni mengejutkan. Hal yang perlu diingat:
Saya tidak begitu ingat apakah sebelum Go 1.24 juga sudah dimungkinkan untuk mengekspor fungsi Go ke JS. Saya ingat sebelumnya fungsi Go yang diekspor bisa dipanggil dari JS tanpa masalah
goos=wasip1Rasanya akan lebih "Go-like" jika semua fungsi yang diawali huruf besar di package utama diekspor. Karena ekspor bekerja seperti itu secara umum di bahasa ini, arahan compiler sebaiknya hanya dipakai saat secara eksplisit menamai yang diawali huruf kecil
Tidak ada penyebutan tentang bekerja dengan model komponen WASM
Saya penasaran bagaimana garbage collection di Go dan WASM bekerja
Andai ada bahasa tingkat rendah dengan strong typing dan dukungan WASM yang hebat
Saya penasaran bagaimana cara melakukan debug pada modul WASM yang berjalan di program host
Saya khawatir keinginan akan lebih banyak fitur WASM bisa merusak ekosistem yang masih muda ini secara permanen. Sebagian besar fitur yang ditambahkan Go ke WASM sebenarnya bisa dilakukan secara native jika proposal model komponen sudah digabungkan