GO官方将支持编译成WebAssembly 目标取代Javascript

看来网页环境现在是系统程序语言的兵家必争之地,除了Mozilla积极改进Rust,增加与WebAssembly和Javascript的互通性外,新兴系统语言Go也开始行动,即将在GO 1.11的编译器中,让开发者直接把程序编译成WebAssembly,让字节码可以在浏览器或是Node.js等非Web环境执行,Go社区直言,这个动作的目的就是要让Go取代Javascript。

Go社区在今年2月的时候发布,在Go编译器中加入WebAssembly架构的设计文件以及程序代码项目,Go官方认为,让Go成为JavaScript的替代品,作为一种Web应用程序的开发语言,将对软件工程生态系统有积极的影响。

官方文件提到了一些Go语言与WebAssembly的差异,以及可能的处理方式。与Javascript相反,WebAssembly完全支持64位整数,但目前只能用32位整数寻址,因此使用的内存容量被限制在4GB,不过在Go的WebAssembly架构中支持64位指标,因此计划在容许的条件下,可转换成64位运算。

与多数的托管器机架构不同,WebAssembly属于堆栈机器,会维护自己的堆栈,每个函数也都可以有任意数量的区域变量,官方表示,完全使用WebAssembly的堆栈,并非Go现在的选择,Go需要可以检查堆栈做垃圾回收还有关注堆栈等工作。

Go的WebAssembly架构完全支持垃圾回收功能,而WebAssembly也正着手进行增加自己的垃圾回收功能,但文件提到,很难想象能比专门为Go量身订制的垃圾回收有更好的性能。

官方表示,他们的开发方向会支持所有Go的规格,并且尽量保留开发者喜欢的Go重要功能,目前还有不少提升性能的工作要进行,特别是Go语言中的goto 语法在WebAssembly会特别有用,现在项目的进度已经可以让有兴趣的人开始尝试。

另外,WebAssembly除了可以被设计成能在Web环境中执行外,在非Web环境像是Node.js这种JavaScript VM也没问题,同时也能在小型壳层测试或是被使用在完整的应用程序。关于这方面的设计,官方表示有很多还需要考量,毕竟不同环境需要的功能不同,在非Web环境会需要与Web环境不同的API,但在Web与非Web使用场景大量重叠的状况,将会对此提出共同规范。