成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一分鐘搞明白!快速掌握 Go WebAssembly

開發 前端
今天我們快速的對 WebAssembly 進行了背景了解、Go 快速上手、擴展場景了解等。雖然 WebAssembly 是一個新輪子,也號稱可以借助 WASI 集成和被集成。

大家好,我是煎魚。

最近因為各種奇怪的原因,更多的接觸到了 WebAssembly。雖然之前很多博客也翻過寫過各種文章,但總感覺欠些味道。于是今天梳理了一版,和大家一起展開學習。

先來一張經典圖:

圖片

WebAssembly 是什么

以下是 Mozilla 在 MDN 上給出的定義:

WebAssembly(縮寫:Wasm)是一種新的編碼方式,可以在現代的網絡瀏覽器中運行 - 它是一種低級的類匯編語言,具有緊湊的二進制格式,可以接近原生的性能運行,并為諸如 C/C++ 等語言提供一個編譯目標,以便它們可以在 Web 上運行。它也被設計為可以與 JavaScript 共存,允許兩者一起工作。

Wasm 官網自己挑出的重點是:

  • 是一種基于堆棧的虛擬機的二進制指令格式。
  • 被設計為編程語言的可移植編譯目標。
  • 能夠在網絡上部署客戶端和服務器應用程序。

新編碼方式,可以在瀏覽器中運行。可以以接近原生的性能運行。可以跨語言,例如:C/C++;可以與 JavaScript 共存。

看著是一個不錯的可跨平臺運行的新玩具。

由哪家研發

最早 WebAssembly1.0 基于 asm.js(Javascript 的嚴格子集,靜態類型,取消垃圾回收機制等)的特性集實現。隨后的 WebAssembly2.0 又根據新的標準進行了進一步的延伸和開發。

WebAssembly 的開發團隊分別來自 Mozilla、Google、Microsoft、Apple,代表著四大網絡瀏覽器 Firefox、Chrome、Microsoft Edge、Safari。

圖片

一些重要的時間線:

  • 2015 年 WebAssembly 首次發布,在上述四大瀏覽器中進行了 Unity 的 Angry Bots(憤怒的機器人)的演示。
  • 2017 年 3 月,首次發布 WebAssembly MVP 版本,預覽版本結束,正式進行發布,可以理解為 1.0。
  • 2018 年 2 月,WebAssembly 工作組(WebAssembly Working Group)發布了核心規范、JavaScript 接口和 Web API 的三個公開工作草案。
  • 2019 年,Chrome 75 發布,默認啟用 WebAssembly 線程。
  • 2022 年 6 月,開始發布 WebAssembly 2.0。

幾家大廠派人一起做的,比較新,近幾年才開始更多的被支持。當前還在 WebAssembly 2.0 的階段,還在發展階段。

1.0 和 2.0 區別之一

直觀上來看,1.0 和 2.0 最大的區別在于:

  • 1.0 主要目標是在所有主要瀏覽器中能運行 WebAssembly。根據統一截至 2022 年 10 月 ,96% 的已安裝瀏覽器支持 WebAssembly(1.0 版),基本實現了全覆蓋。
  • 讓 WebAssembly 煥發第二春(2.0)的:可以借助 WASI(WebAssembly System Interfac) 的模塊化系統接口,能夠借此中間產物 .wasm 實現各語言的集合和互相集成。

WebAssembly 2.0 起,邊界更大了,目標完全就是可移植、安全的高級語言。期望應用于瀏覽器、各編程語言、各系統中。

大有一個 JVM 的感覺:

圖片

Go 快速上手

在我們快速了解了 WebAssembly 的背景后。我們落到實處,看看 Go 語言的 WebAssembly 情況如何,又是如何使用。

Go 目前有兩種使用 WebAssembly 的方式,第一種是使用 syscall/js 標準庫,四舍五入算勉強支持了 WebAssembly 1.0。

代碼如下:

package main

import "syscall/js"

func main() {
alert := js.Global().Get("alert")
alert.Invoke("腦子進煎魚了!")
}

編譯命令:

$ GOOS=js GOARCH=wasm go build -o jianyu.wasm

再使用 JS 中對應 WebAssembly 的調用就可以了。

第二種使用方式,是使用開源庫 tinygo-org/tinygo[1],其基于 LLM,支持了 WebAssembly1.0/2.0 (WASM/WASI)。

tinygo brew 安裝方式:

$ brew tap tinygo-org/tools
$ brew install tinygo

如果安裝成功,執行 tinygo version 就可以看到版本信息。

Go wasm 代碼如下:

import (
figure "github.com/common-nighthawk/go-figure"
)

//export HelloWorld
func HelloWorld() {
myFigure := figure.NewFigure("Hello World", "", true)
myFigure.Print()
}

func main() {}

編譯命令:

tinygo build -o module.wasm -target wasi .

運行成功后,將會在對應目錄編譯出 module.wasm 二進制文件,可以由其他的平臺、語言進行使用。

如果你希望在 Go 或其他語言中調用所生成的 .wasm,需要找到對應符合 WASI 的庫和規則。

下面是 Go wasmer-go 調用 .wasm 的代碼:

import (
"fmt"
"io/ioutil"

wasmer "github.com/wasmerio/wasmer-go/wasmer"
)

func main() {
wasmBytes, _ := ioutil.ReadFile("module.wasm")

store := wasmer.NewStore(wasmer.NewEngine())
module, _ := wasmer.NewModule(store, wasmBytes)

wasiEnv, _ := wasmer.NewWasiStateBuilder("wasi-program").
// Choose according to your actual situation
// Argument("--foo").
// Environment("ABC", "DEF").
// MapDirectory("./", ".").
Finalize()
importObject, err := wasiEnv.GenerateImportObject(store, module)
check(err)

instance, err := wasmer.NewInstance(module, importObject)
check(err)

start, err := instance.Exports.GetWasiStartFunction()
check(err)
start()

HelloWorld, err := instance.Exports.GetFunction("HelloWorld")
check(err)
result, _ := HelloWorld()
fmt.Println(result)
}

func check(e error) {
if e != nil {
panic(e)
}
}

運行成功后會輸出 “Hello World”。

Go 標準庫 syscall/js 標準庫只支持 WebAssembly1.0,只能應用于 JS 相關的場景,并不能被其他語言所集成。

其中 tinygo 實現了 WASI,借助 WASI 這一標準接口與其他平臺語言互相集成。但 tinygo 并沒有支持所有的 Go 語法特性,具體可以查看 Go language features[2]。

這塊需要特別注意,不同語言對 WebAssembly(WASI)的支持程度均不一樣。

其他應用場景

帶火 WebAssembly 的還有一個重要的因素,那就是在各種云原生的組件上都可以集成和使用,進一步延伸了場景。

圖片

例如在 Envoy 和 Istio 上,可以使用 wasm 很方便的將自定義 filter 集成到 Envoy 中,實現 Envoy 代理的功能增強。

總結

今天我們快速的對 WebAssembly 進行了背景了解、Go 快速上手、擴展場景了解等。雖然 WebAssembly 是一個新輪子,也號稱可以借助 WASI 集成和被集成。

但實際上現在各語言對 WebAssembly 的支持程度都不一樣,像 Go 官方自己提供的標準庫就維護的不怎么樣,WASI 的 issues 也沒有繼續推進。

甚至在其他語言的互通,現在仍然有著或多或少會導致阻塞無法應用的問題。可能,還需要再過個 3~5 年?

但如此多語言的庫維護,能否長久的迭代和維護。也是一個更大的問題。

參考資料

[1]tinygo-org/tinygo: https://github.com/tinygo-org/tinygo

[2]Go language features: https://tinygo.org/docs/reference/lang-support/

責任編輯:武曉燕 來源: 腦子進煎魚了
相關推薦

2020-07-17 07:44:25

云計算邊緣計算IT

2017-03-30 19:28:26

HBase分布式數據

2016-12-21 15:08:14

數據庫垂直拆分

2017-02-21 13:00:27

LoadAverage負載Load

2018-07-31 16:10:51

Redo Undo數據庫數據

2009-11-25 09:33:27

Cisco路由器密碼設

2018-06-26 05:23:19

線程安全函數代碼

2017-07-06 08:12:02

索引查詢SQL

2020-05-21 19:46:19

區塊鏈數字貨幣比特幣

2022-07-18 06:16:07

單點登錄系統

2011-04-19 09:27:25

Spring

2018-12-12 22:51:24

Java包裝語言

2016-09-12 17:28:45

云存儲應用軟件存儲設備

2020-07-09 07:37:06

數據庫Redis工具

2011-02-21 17:48:35

vsFTPd

2015-11-12 10:32:40

GitHub控制系統分布式

2016-12-16 11:05:00

分布式互斥線程

2021-08-06 08:50:45

加密貨幣比特幣區塊鏈

2018-03-27 09:28:33

緩存策略系統

2020-06-11 08:04:12

WDMDWDMMWDM
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 99伊人| 三级免费av | 五月天国产在线 | 亚洲国产成人精品久久久国产成人一区 | 亚洲av毛片| 日韩欧美一区二区在线播放 | 国产精品一区二区久久 | 国产精品色 | 成人亚洲精品久久久久软件 | 精品国产一区二区三区性色 | 99热国产精品| 天天草天天干天天 | 99色在线视频 | 国产精品成人一区二区三区夜夜夜 | 国产精品一区二区视频 | 中文字幕爱爱视频 | 欧美久久免费观看 | 亚洲精品久久久久久国产精华液 | 亚洲一区二区三区免费 | 亚洲成人一区二区 | 国产成人叼嘿视频在线观看 | 精品视频在线观看 | 自拍偷拍第一页 | 激情a| 国产精品一区二区久久 | 久久人人爽人人爽 | 在线观看国产www | 亚洲国产一区二区三区在线观看 | 国产一区二区三区四 | 91影视 | 国产欧美一区二区三区久久人妖 | 国产色婷婷精品综合在线手机播放 | 午夜激情网 | 色综合一区二区三区 | 真人毛片 | 日韩中文字幕在线视频观看 | 国产黄色网址在线观看 | 先锋资源网 | 欧美成年人视频在线观看 | 国产一区二区精华 | 欧美一二三 |