WebAssembly:从头开始重建堆栈
Posted
技术标签:
【中文标题】WebAssembly:从头开始重建堆栈【英文标题】:WebAssembly: Reconstructing the stack from scratch 【发布时间】:2018-07-11 18:00:27 【问题描述】:通过转换 .wasm 源文件或使用 javascript 与合适的调试器交互,应该可以序列化完整的 Wasm 执行状态(主要是堆栈、调用帧、局部变量等)。
我想知道是否可以使用这个序列化的表示来重建它,并继续运行在另一台机器上停止的程序。
当前的浏览器运行时是否支持此功能?
【问题讨论】:
【参考方案1】:不确定您想到的是什么转换或调试器,但您认为可以序列化 JavaScript 执行状态的前提是错误的。事实上,在浏览器引擎中实现这样的机制是极其困难的。我所知道的生产 JS 引擎在一般情况下甚至都无法序列化其堆(尽管有些引擎,如 V8,对启动堆的快照机制非常有限)。更不用说调用堆栈和实时函数状态了,它们可能处于多种优化模式之一,任意与来自运行时或嵌入器的 C 或汇编堆栈帧混合,而且通常非常棘手。
您想到的机械化需要在一流的无定界延续之上进行一般序列化。 JavaScript 委员会 TC39 多年前放弃了向该语言添加完整延续的想法,因为它被认为在大多数引擎中实现起来太难且太昂贵(这就是为什么 ES6 转而引入生成器作为一种更有限的机制) .编辑:甚至从未考虑过通用序列化,因为它实际上会通过闭包或代理破坏封装,从而破坏该语言的所有现有安全模式。
【讨论】:
我只对在 Webassembly 中执行此操作感兴趣。我不知道他们甚至考虑过 Javascript 中的一般序列化,所以仍然感谢您的回答。以上是关于WebAssembly:从头开始重建堆栈的主要内容,如果未能解决你的问题,请参考以下文章
WebAssembly 系列WebAssembly 工作原理