Ending定律:一切可编译为WebAssembly的,终将会被编译WebAssembly。
最近V5刚发布7.5版本,增强了对WebAssembly的支持。原文可以看这里:https://v8.dev/blog/v8-release-75
WebAssembly部分的改进
官方计划在Chrom75版本中对WebAssembly模块增加隐式的缓存支持。也就是说当第二次访问同一个WebAssembly模块是可以从缓存直接加载编译好的WebAssembly模块。
内存批量操作
此外还对WebAssembly的内存披露操作的新指令提供了支持。这是对内存操作进行优化的新提案,新加的指令中,memory.copy
提供类似C语言的memmove
函数的功能,而memory.fill
则用于对内存进行批量填充。
;; Copy 500 bytes from source 1000 to destination 0.(memory.copy (i32.const 0) (i32.const 1000) (i32.const 500));; Fill 1000 bytes starting at 100 with the value `123`.(memory.fill (i32.const 100) (i32.const 123) (i32.const 1000));; Copy 10 table elements from source 5 to destination 15.(table.copy (i32.const 15) (i32.const 5) (i32.const 10))
;; Fill 1000 bytes starting at 100 with the value `123`.
(memory.fill (i32.const 100) (i32.const 123) (i32.const 1000))
;; Copy 10 table elements from source 5 to destination 15.
(table.copy (i32.const 15) (i32.const 5) (i32.const 10))
memory.copy
和memory.file
指令的参数和C语言的memmove
和memset
一样。此外,批量操作不仅仅针对内存,table也有对应的指令,比如table.copy
用于辅助表格数据。
内存数据初始化
新的提案还提出一种** passive段,类似传统的只读静态数据段。这些 passive**段在定义模块实例时不会被初始化,但是可以用于填充内存数据。
比如:
;; Define a passive data segment.(data $hello passive "Hello WebAssembly");; Copy "Hello" into memory at address 10.(memory.init (i32.const 10) (i32.const 0) (i32.const 5));; Copy "WebAssembly" into memory at address 1000.(memory.init (i32.const 1000) (i32.const 6) (i32.const 11))
;; Copy "Hello" into memory at address 10.
(memory.init (i32.const 10) (i32.const 0) (i32.const 5))
;; Copy "WebAssembly" into memory at address 1000.
(memory.init (i32.const 1000) (i32.const 6) (i32.const 11))
首先通过data指令定义一个passive只读数据段。然后memory.init
指令用只读数据来初始化内存。种种迹象都表明WebAssembly要从走一遍计算机发展的长征路,这对于兲朝来说是绝对一个机遇。
JavaScript还在挣扎自我革命
JS语言天生具备吸星大法的能力,到处吸收各种语法糖。这次是给数字增加了下划线分隔符:
var a = 1000000000000 var b = 1019436871.42 // 新语法var a = 1_000_000_000_000 var b = 1_019_436_871.42 1000000000000
var b = 1019436871.42
// 新语法
var a = 1_000_000_000_000
var b = 1_019_436_871.42
没什么值得说的。最终发布的时候还是不敢放心使用,还会再编译一次。
性能:流式解析JS脚本
流式解析JS脚本说得通俗一点就是边下载边解析。因为历史包袱,之前的Chrome虽然支持流式解析,但是首先要经过主线程绕一次。大家知道JS的主线程是非常容易导致程序卡顿的,这也导致流式解析经常不能在第一时间启动。
可以看下官方给出的对比:
红圈圈都是大便梗塞的位置。总之新版本又NB了。
最后
Chrome已经成功继承了IE的垄断衣钵,但是谁来担起FireFox的责任呢?WebAssembly该你上场了……