给岁月以文明,而不是给文明以岁月

文章分类

关于博主

头像不见了

体验一把 webassembly


/ 阅读 164

一直知道webassembly这个技术,但也没去了解过,于是最近抽出时间大概了解了一下。恰好在学rust,又恰好rust编译webassembly很方便,于是将一个javascript实现的小游戏,用rust + webassembly 重写了一下,体验了一把webassembly。

🌐 webassembly 官网

webassembly 乍一听以为是汇编语言,其实看上去也挺像的,下面是一段 rust 编译出来的webassembly。

block
    local.get 1
    i32.eqz
    br_if 0
    i32.const 43
    i32.const 1114112
    local.get 0
    i32.load offset=0 align=4
    local.tee 6
    i32.const 1
    i32.and
    local.tee 1
    select
    local.set 7
    local.get 1
    local.get 5
    i32.add
    local.set 8
    br 1
end

不过webassembly肯定不是汇编代码,只不过是一种中间代码,类似于java虚拟机的字节码,java的字节码被java虚拟机解释执行,而webassembly供浏览器解析执行。有了webassembly,许多后端语言,c/rust/go/c#等都可以将代码编译成webassembly,然后在浏览器上执行。

看到这里我的第一反应是,我擦嘞,难道以后前端要被替代啦?不过不用担心,webassembly的出现不是为了代替js,而是与js相辅相成,将一些模块用后端语言 + webassembly来实现。毕竟,目前js更加方便,何况还有Typescript,想想用c来写前端,那酸爽,怕是嫌头发还不够稀疏。

那为什么要弄一个webassembly出来呢?毕竟天下武功,唯快不破,webassembly的出现就是为了前端的性能。因为webassembly更容易解析和执行,比直接解析js要快。将一些性能要求高的模块用webassembly实现能极大提高效率。

webassembly标准是四大浏览器头子(Chrome,Firefox,Safari,Edge)共同制定的,所以目前主流浏览器已经支持1.0标准了。

更深入了解可以参考这篇文章:图说 WebAssembly

🎮 玩一下小游戏

小游戏源码: