1 poin oleh GN⁺ 2025-02-16 | 3 komentar | Bagikan ke WhatsApp
  • Di Go 1.24, fitur terkait WebAssembly (Wasm) diperluas
  • Direktif go:wasmexport ditambahkan 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:wasmexport yang baru ditambahkan di Go 1.24, fungsi Go dapat diekspos sebagai export agar bisa dipanggil dari luar modul Wasm
  • Contoh: setelah mendeklarasikan //go:wasmexport add lalu menulis fungsi, host Wasm dapat memanggil fungsi tersebut
  • Ini mirip dengan direktif export di 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
  • 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:wasmimport dilonggarkan
  • 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:wasmexport dapat 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:wasmimport dan go:wasmexport
    • Masih ada kendala dalam pengiriman tipe komposit yang menyertakan pointer

Kesimpulan

  • Penambahan build WASI reactor dan fitur go:wasmexport di 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

 
click 2025-02-16

Sebelum Wasm/gc diadopsi secara luas, sepertinya lebih baik mengembangkan target wasm dengan bahasa yang tidak memiliki gc.

 
xguru 2025-02-16

Di rilis Go 1.24 hal ini hanya dijelaskan secara singkat, tetapi ini pembaruan yang jauh lebih penting.

 
GN⁺ 2025-02-16
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

    • Jika ingin mencoba Go WASM di Cloudflare Workers, langganan diperlukan karena ukuran binernya
    • Pada percobaan terakhir, hello-world bisa dijalankan, tetapi yang lebih kompleks melebihi batas ukuran
    • Situasi yang disayangkan
  • Ini mengejutkan. Hal yang perlu diingat:

    • Pengerjaan WebAssembly di Go dirancang dan diimplementasikan oleh relawan, bukan oleh tim Go. Karena itu, jadwalnya bergantung pada ketersediaan para relawan
  • 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

    • Akan membantu jika dijelaskan bagaimana fitur WASI yang baru ini lebih baik dibanding sebelumnya (selain mendukung lebih banyak tipe melalui FFI)
    • Pertanyaan kedua: dengan me-cast pointer menjadi integer, string dan tipe kompleks bisa diambil dari memori instance modul WASM. Jika representasi biner tipe saya di Go dijamin stabil, saya penasaran apakah cara mengoper pointer ini masih tetap valid untuk modul WASM yang dihasilkan saat menggunakan goos=wasip1
  • Rasanya 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

    • Ini sama dengan cara ekspor cgo yang sudah ada. Mengikuti contoh sebelumnya. Usability-nya tetap berada di luar bahasa
  • 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

    • Standarnya berkembang lambat, dan seiring adopsi meningkat ada risiko bahwa fitur nonstandar seperti WASI harus didukung selamanya