用 Rust 编译易经:WebAssembly 与古典术数的奇妙相遇
记录将易经演算引擎编译为 WebAssembly 的开发历程,以及在这个过程中对「变」的一些感想。
写这篇文章的时候,窗外正下着小雨。
我盯着终端里那行 wasm-pack build --target web,忽然觉得有些荒诞——一门诞生于三千年前的占卜之学,正在被编译成 WebAssembly 字节码,准备在全球各地的浏览器里运行。
为什么要做这件事
易经的演算逻辑并不复杂,核心不过是「蓍草法」的随机分组与阴阳判断。但市面上绝大多数的在线起卦工具,要么是纯前端的伪随机,要么是后端黑箱。我想做一个完全透明、可审计、本地运行的演算工具。
WebAssembly 是最合适的选择。它能将 Rust 的计算精度带入浏览器,同时保证所有演算在用户本地完成,不需要任何网络请求。
核心挑战:阴阳的数学表达
易经的阴阳爻有四种状态:
| 状态 | 数值 | 含义 |
|---|---|---|
| 老阳 | 9 | 阳极生阴,变爻 |
| 少阳 | 7 | 阳爻,不变 |
| 老阴 | 6 | 阴极生阳,变爻 |
| 少阴 | 8 | 阴爻,不变 |
蓍草法的关键在于三次分组操作,每次操作的余数决定了爻的状态。这个逻辑用 Rust 实现起来非常干净:
fn yarrow_stalk_operation(stalks: u32) -> u32 {
let left = stalks / 2;
let right = stalks - left;
let remainder_left = if left % 4 == 0 { 4 } else { left % 4 };
let remainder_right = if right % 4 == 0 { 4 } else { right % 4 };
remainder_left + remainder_right + 1
}
三次操作的结果相加,得到 6、7、8、9 之一,对应四种爻的状态。
关于「变」
在调试这段代码的过程中,我反复思考一个问题:易经的核心是「变」,而程序的核心是「确定性」。
这两者并不矛盾。蓍草法的随机性来自于初始的随机分组,而演算过程本身是完全确定的。就像量子力学——测量之前是叠加态,测量之后坍缩为确定值。
也许这正是古人的智慧:承认随机性的存在,但在随机性之后寻找规律。
工具已经上线,可以在上方的「周易起卦」入口体验。如果你对实现细节感兴趣,欢迎继续关注。