S-expressions 符号表达式
S-expressions(全称符号表达式,Symbolic Expressions)是一种源自 Lisp 编程语言家族的基础语法和数据结构形式,其核心特点是通过括号嵌套的前缀表示法来描述代码和数据。
S-expressions 的基本结构
- 语法形式:
S-expressions 以括号()作为基本包裹单位,内部元素按 “操作符 + 操作数” 的顺序排列(即前缀表示法)。例如:- 数学表达式
2 + 3用 S-expressions 表示为:(+ 2 3) - 函数调用
factorial(5)表示为:(factorial 5)
- 数学表达式
- 嵌套特性:
S-expressions 支持无限嵌套,因此可以用统一的语法表示复杂逻辑。例如:
(if (< x 10)
(add x 5)
(multiply x 2))
这表示 “如果 x 小于 10,则执行 x+5,否则执行 x×2”。
在 WebAssembly(.wat)中的应用
WebAssembly 的文本格式(.wat)使用 S-expressions 作为语法基础,例如What is WebAssembly?中提到的阶乘函数:
(module
(func $fac (param f64) (result f64)
local.get 0
f64.const 1
f64.lt
if (result f64)
f64.const 1
else
local.get 0
local.get 0
f64.const 1
f64.sub
call $fac
f64.mul
end)
(export "fac" (func $fac)))
- 结构解析:
- 最外层
(module ...)表示一个 WebAssembly 模块。 (func $fac ...)定义一个名为$fac的函数,参数和返回值类型为f64(64 位浮点数)。if (result f64) ... else ... end是条件表达式,采用 S-expressions 的嵌套格式。- 每个操作符(如
local.get、f64.const)后跟操作数,形成前缀表达式。
- 最外层
- 优势:
S-expressions 的语法简单且规范,便于机器解析和转换为二进制.wasm格式,同时能清晰表示 WebAssembly 的底层指令结构。
为什么 WebAssembly 选择 S-expressions?
- 简洁性:语法规则极少(仅括号和空格分隔),便于定义和解析。
- 可转换性:S-expressions 能直接映射到 WebAssembly 的二进制指令结构,方便通过工具(如
wat2wasm)转换为.wasm文件。 - 跨平台性:与具体编程语言无关,适合作为中间表示格式。