gpt4 book ai didi

compiler-construction - WebAssembly 中如何管理堆内存?

转载 作者:行者123 更新时间:2023-12-04 17:18:56 25 4
gpt4 key购买 nike

我正在开发一种旨在针对 WebAssembly 的纯函数式编程语言的工具链。我对类型理论有点熟悉,因此,这种语言的类型检查器已经准备好了。我现在面临的问题是将这种高级语言翻译到 WebAssembly 的较低级别。
在检查类型之后,编译器能够采用 AST 并将其转换为相当标准的 super 组合器,即 lambda 提升形式。每个表达式都将是:

  • 函数调用(顶级函数的名称+代表参数的表达式)
  • 引用(顶级函数或常量的名称);
  • 变量(参数名称或本地名称);
  • 整数(i32 数字文字);
  • Double ( f64 数字文字);
  • 字节串( size + 序列 size UTF-8 字节);
  • Thunk(顶级函数的名称 + 捕获值的环境)。

  • 函数调用、引用、变量、整数、 double 和字节串是不言自明的。 Thunk 是从部分应用函数或 lambda 提升的闭包中获得的。编译器知道 thunk 何时何地饱和,并能够自动插入 force指示。
    指针和数字文字会很高兴地存在于堆栈中,它们很小且易于复制。但是复制字节串(取决于它们的大小)可能代价高昂,并且也有溢出的可能性。在堆栈内存上操作字节串也需要副本。操作递归数据结构的函数可能需要在每一步复制整个 thunk。
    这意味着一些堆分配将非常有用(几乎是必不可少的),但是无需像 malloc 这样的工具就可以手动管理堆内存。/ free是灾难的秘诀。线程如 this和类似 this 的帖子提到我认为仅适用于 C 的 WebAssembly 分配器,我不知道我如何将其中之一引入我的语言的运行时。还有 this存储库,但我不知道如何将这个用 Rust 编写的分配器转换为通用 WebAssembly 模块并使用导出的函数。
    我将如何开始将分配器集成到来自我的语言编译器的生成的 WebAssembly 字节码的运行时中?

    最佳答案

    从堆和内存管理的角度来看,WebAssembly 程序与您在其他计算机上运行的 C 程序非常相似。事实上,这就是重点。
    所以你不使用像 malloc()/free() 这样的东西,你使用 malloc 和 free 自己 - 编译成 wasm 字节码,而不是 x64 或 arm 机器代码。
    如果在 wasm 模块的 RAM 模型中有任何奇特之处,那就是在 wasm 和托管它的 Javascript 代码之间的消息传递协议(protocol)中。

    关于compiler-construction - WebAssembly 中如何管理堆内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67340197/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com