作者回复: 如果只是写简单的解释器,其实可以直接按照 Spec 上的指令用 switch 的方式去逐个解释就可以。具体的实现模型也可以参考 Spec 上给出的抽象(https://webassembly.github.io/JS-BigInt-integration/core/exec/index.html)。更高性能的需要考虑一些 threading 的方法,同时考虑是否整合 JIT。这部分就没有具体的教程了,不过可以参考一些已有的实现,比如 LuaJIT、WABT 中提供的简易 Wasm 解释器等等。书籍的话市面上大部分都是介绍 JVM 的,手把手教学的也是比较少,相对好一些的可以参考《Advanced Design and Implementation of VMs》,虽然也是以 JVM 为背景,但对 VM 组成结构介绍的比较全面,可以有个初步了解。其他比如 GC 之类的就得单独学习了,比如《垃圾回收算法与实现》等等。JIT 可以参考 LLVM 给出的例子,整合起来会快很多。
作者回复: 比如这个:https://www.codeproject.com/Articles/5298048/Using-SIMD-to-Optimize-x86-Assembly-Code-in-Array,可以 Google 上搜一搜,内容还是蛮多的。
作者回复: 抱歉,回复晚了。是会有一定区别的,具体如何映射到字节码完全由对应语言编译器来决定。Go 语言会把 GC 也一起打包,用 Wasm 来实现,因此对应的字节码在执行时会有一定的运行时损耗。
作者回复: 哈哈,作为编译目标确实可以这样讲。但虽然志在千里,也得着眼于实际。
作者回复: 嗯嗯,看到了。感谢分享消息! “Combining the power of Lucet and Wasmtime exemplifies why the Bytecode Alliance formed: it specifically enables this kind of collaboration — aimed at making developers’ lives easier and powering trustworthy computation on the edge and beyond. ”
作者回复: 哈哈,这个应该不会的。字节码联盟旗下其实囊括了包含Intel在内的几家大型公司开发的Runtime,每个Runtime支持的特性和开发路径也都不尽相同。倒是没有“自家”这一说。大家对各个特性的开发也都是建立在Wasm和WASI标准基础之上的。