i32 | i64 | f32 | f64
;u32 | u64 | s32 | s64 | i8 | i16 | i32 | i64
, Boolean
和内存地址
使用32位的整数表示;f32 | f64
, IEEE-754-2019标准;clz | ctz | popcnt
;add | sub | mul | div_sx | rem_sx | and | or | xor | shl | shr_sx | rotl | rotr
;abs | neg | sqrt | ceil | floor | trunc | nearest
;add | sub | mul | div | min | max | copysign
;eqz
;eq | ne | lt_sx | gt_sx | le_sx | ge_sx
;eq | ne | lt | gt | le | ge
;drop | select
;local.get | local.set | local.tee | global.set | global.get
;memory.grow | memory.size | load | store
, 对于多字节的内存的读写是按照小端序解释的;nop | unreachable | block | loop | if/else | br | br_if | br_table | return | call | call_indirect
;end
;注: _sx后缀表示可能会存在数值类型转换;
模块按如下形式组织:
module ::= {
types vec(functype),
funcs vec(func),
tables vec(table),
mems vec(mem),
globals vec(global),
elem vec(elem),
data vec(data),
start start?,
imports vec(import),
exports vec(export),
}
types
: 模块中使用的所有函数类型必须定义在types类型序列中. 该序列中, 从外部导入的函数类型签名放在本模块的签名的签名;funcs
: 模块中使用的所有函数必须定义在funcs序列中, 有func ::= type typeidx, locals vec{valtype}, body expr
:
type
: 函数类型(签名), 可从types序列中找到;locals
: 函数参数和函数使用的局部变量, 参数和局部变量均可修改. 其中, 函数参数在locals
序列的头部;body
: 函数体的指令序列, 函数最后一个执行的指令的返回类型必须和该函数的返回类型匹配;tables
: 模块定义或从其他模块导入的表类型序列;mems
: 模块定义或从其他模块导入的内存类型序列;globals
: 模块定义或从其他模块导入的全局类型序列;elem
: tables
序列中某个表的元素的初始化组成的序列, elem ::= {table tableidx, offset expr, init vec(funcidx)}
;data
: mems
序列中某个内存的数据初始化组成的序列, data ::= {data memidx, offset expr, init vec(byte)}
;start
: 模块的初始化函数在funcs
序列中的索引. 模块初始化函数在模块实例化时调用, 且在tables
和mems
初始化后调用;import
: import ::= {module name, name name, desc importdesc}
从其他模块导入到本模块中的函数/表/内存全局变量, desc
描述了导入的函数在funcs
中的索引/表的类型/内存类型/全局变量类型;export
: export ::= {name name, desc exportdesc}
从本模块导出函数/表/内存/全局变量, desc
描述了导出的函数/表/内存/全局变量在funcs
/tables
/mems
/globals
序列中的的索引;记有语境C
如下:
C ::= {
types functype*,
funcs functype*,
tables tabletype*,
mems memtype*,
globals globaltype*,
locals valtype*,
labels resulttype*,
return resulttype?,
}
记如下符号为: 若条件\(premise_1, premise_2, \dots, premise_n\)成立, 则在语境C
中\(A\)满足从\(T1\)映射\(T2\)的约束;
val ::= i32.const | i64.const | f32.const | f64.const
;result ::= val* | trap
;store ::= {funcs funcinst*, tables tableinst*, mems meminst*, globals globalinst*}
;moduleinst ::= {types functype*, funcaddrs funcaddr*, tableaddrs tableaddr*, memaddrs memaddr*, globaladdrs globaladdr*, exports exportinst*}
;funcinst ::= {type functype, module moduleinst, code func} | {type functype, hostcode hostfunc}
;tableinst ::= {elem vec(funcaddr), max u32?}
;meminst ::= {data vec(byte), max u32?}
;globalinst ::= {value val, mut mut}
;exportinst ::= {name name, value externval}
, externval ::= func funcaddr | table tableaddr | mem memaddr | global globaladdr
;label ::= label_n{instr*}
;activation ::= frame_n{local val*, module moduleinst}
;原文:https://www.cnblogs.com/mengsuenyan/p/12950541.html