您当前的位置: 首页 > 热点 > > 内容页

快看:一分钟搞明白!快速掌握GoWebAssembly

来源:面包芯语 2023-04-19 10:45:34

新编码方式,可以在浏览器中运行。可以以接近原生的性能运行。可以跨语言,例如:C/C++;可以与 JavaScript 共存。

看着是一个不错的可跨平台运行的新玩具。

由哪家研发

最早 WebAssembly1.0 基于 asm.js(Javascript 的严格子集,静态类型,取消垃圾回收机制等)的特性集实现。随后的 WebAssembly2.0 又根据新的标准进行了进一步的延伸和开发。


【资料图】

WebAssembly 的开发团队分别来自 Mozilla、Google、Microsoft、Apple,代表着四大网络浏览器 Firefox、Chrome、Microsoft Edge、Safari。

一些重要的时间线:

几家大厂派人一起做的,比较新,近几年才开始更多的被支持。当前还在 WebAssembly 2.0 的阶段,还在发展阶段。

1.0 和 2.0 区别之一

直观上来看,1.0 和 2.0 最大的区别在于:

WebAssembly 2.0 起,边界更大了,目标完全就是可移植、安全的高级语言。期望应用于浏览器、各编程语言、各系统中。

大有一个 JVM 的感觉:

Go 快速上手

在我们快速了解了 WebAssembly 的背景后。我们落到实处,看看 Go 语言的 WebAssembly 情况如何,又是如何使用。

Go 目前有两种使用 WebAssembly 的方式,第一种是使用 syscall/js标准库,四舍五入算勉强支持了 WebAssembly 1.0。

代码如下:

packagemainimport"syscall/js"funcmain(){alert:=js.Global().Get("alert")alert.Invoke("脑子进煎鱼了!")}

编译命令:

$GOOS=jsGOARCH=wasmgobuild-ojianyu.wasm

再使用 JS 中对应 WebAssembly 的调用就可以了。

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

tinygo brew 安装方式:

$brewtaptinygo-org/tools$brewinstalltinygo

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

Go wasm 代码如下:

import(figure"github.com/common-nighthawk/go-figure")//exportHelloWorldfuncHelloWorld(){myFigure:=figure.NewFigure("HelloWorld","",true)myFigure.Print()}funcmain(){}

编译命令:

tinygobuild-omodule.wasm-targetwasi.

运行成功后,将会在对应目录编译出 module.wasm 二进制文件,可以由其他的平台、语言进行使用。

如果你希望在 Go 或其他语言中调用所生成的 .wasm,需要找到对应符合 WASI 的库和规则。

下面是 Go wasmer-go 调用 .wasm 的代码:

import("fmt""io/ioutil"wasmer"github.com/wasmerio/wasmer-go/wasmer")funcmain(){wasmBytes,_:=ioutil.ReadFile("module.wasm")store:=wasmer.NewStore(wasmer.NewEngine())module,_:=wasmer.NewModule(store,wasmBytes)wasiEnv,_:=wasmer.NewWasiStateBuilder("wasi-program").//Chooseaccordingtoyouractualsituation//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)}funccheck(eerror){ife!=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 年?

但如此多语言的库维护,能否长久的迭代和维护。也是一个更大的问题。

上一篇 下一篇
x
推荐阅读 更多
快看:一分钟搞明白!快速掌握GoWebAssembly

大家好,我是煎鱼。最近因为各种奇怪的原因,更多的接触到了WebAssembly。虽然之前很多博客也翻过写过各种

面包芯语 2023-04-19
环球通讯!【融通高中】名校学长学姐说——BTEC艺术篇(四)

【融通高中】名校学长学姐说——BTEC艺术篇(四)宁乡碧桂园融通高中于2017年在中国首先引进了BTEClevel3Ex

国际教育网 2023-04-19
魔兽世界祖达萨怎么回奥格瑞玛_祖达萨怎么回奥格瑞玛

1、90级在双月殿吧,去双月殿二楼,走右边,二楼有传送门,到达各个城市的。2、或者请个法师哥哥或姐姐帮忙

互联网 2023-04-19
新鲜韭菜的保存方法 新鲜韭菜的保存方法和时间

1、去除黄色的叶子末端、用保鲜袋密封后放入冰箱可以较好的保存新鲜的韭菜。2、刚买回来的韭菜多少叶子的末

互联网 2023-04-19
当前通讯!科研人员发现藏族人适应高原的新基因

记者18日从中国科学院昆明动物研究所获悉,该所宿兵团队与西藏大学、西藏阜康医院等单位合作,发布“藏族人

中国新闻网 2023-04-19
【全球热闻】一季度国内生产总值同比增长4.5%

新数据新看点原标题:经济增长企稳回升 国内需求逐步扩大(引题)一季度国内生产总值同比增长4 5%(主题)

人民日报 2023-04-19
全球滚动:洛阳钼业:TFM混合矿项目中区项目已实现短流程投料试车

证券时报e公司讯,洛阳钼业(603993)4月19日早间公告关于刚果(金)TFM铜钴矿混合矿项目进展,TFM混合矿项目基

证券时报·e公司 2023-04-19
激光技术助力打造“第三生活空间” 光峰科技发布全球首款车规级彩色激光大灯_最新资讯

【深圳商报讯】(首席记者王海荣)4月18日,第二十届上海国际汽车工业展览会拉开帷幕。作为全球领先的激光

深圳商报 2023-04-19
今日视点:举报环境污染怎么举报

一、举报环境污染怎么举报举报环境污染可以通过以下方式举报:1 拨打全国统一的环保举报热线1653电话12369

法务网 2023-04-19
环球热头条丨大全能源(688303.SH):募投项目“年产10万吨高纯硅基材料项目”开始投产运行

格隆汇4月18日丨大全能源688303SH公布公司2022年度向特定对象发行A股股票的募投项目年产10万吨高纯硅基材料

格隆汇 2023-04-19