gpt4 book ai didi

haskell - Haskell 运行时如何区分指针和未装箱的字大小值?

转载 作者:行者123 更新时间:2023-12-02 14:15:08 25 4
gpt4 key购买 nike

在 64 位平台上,由于指针标记,OCaml 的 int 类型为 63 位。这使得 int 可以被拆箱,并且在运行时仍然可以与指针区分开来,从而允许精确的 GC。 IIRC,GHC RTS 中的 GC 也很精确,但 GHC 的 Int 是 64 位的,可以拆箱。如果是这样的话,那么运行时系统如何区分整型和指针呢?区分其他未装箱的字大小值和指针似乎也会出现同样的问题。

最佳答案

简短的版本是:将所有指针和所有非指针组合在一起分配值,并包含一些元数据,以便 GC 知道接下来要做什么。

请注意,Haskell 报告实际上允许 Int 为 31 或 63 位,从而使 OCaml 策略有效 - 但这不是 GHC 所做的。

稍微长一点的版本是,所说的“元数据”实际上是垃圾收集器使用的几个函数。为了给出一个粗略的草图,您可以将 Haskell 中的值视为在运行时表示为带有方法的 OO 风格对象:

class Fn:
# By far the most used; this evaluates the value:
enter(...) -> ...
# Used by the garbage collector:
scavenge(...) -> ...
evacuate(...) -> ...

这样做的结果是,值对自己有足够的了解来进行簿记,并且对于一些常见的布局,GHC 定义了这些函数的专门版本;垃圾收集器可能根本不知道清理和疏散的具体工作方式。指针和非指针的分离是为了可以为常见情况创建和共享通用实现。

请注意,即使对于不是“函数”的 Haskell 值,也存在“enter”函数,因为惰性意味着即使类型是例如Int,求值可能仍然涉及到计算。

如果您想要很长的版本,我建议阅读:

https://www.microsoft.com/en-us/research/publication/implementing-lazy-functional-languages-on-stock-hardware-the-spineless-tagless-g-machine/

其中详细介绍了 Haskell 如何映射到硬件。这是一本引人入胜的书,其中有很多巧妙的东西,与大多数(严格的)函数式语言的实现方式有很大不同。这篇论文很旧,但仍然有意义。

关于haskell - Haskell 运行时如何区分指针和未装箱的字大小值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54016849/

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