【问题标题】:Bit Size of GHC's Int TypeGHC 的 Int 类型的位大小
【发布时间】:2023-03-06 20:59:01
【问题描述】:

为什么 GHC 的 Int type 不能保证使用 32 位精度? This document claim 它具有至少 30 位有符号精度。它是否与将Maybe Int 或类似的东西装入 32 位有关?

【问题讨论】:

  • 会有更多细节的其他人,但我认为这与垃圾收集和懒惰有关。一点用于“被评估”,一点用于由 GC 复制。虽然不是 100% 确定。
  • 如果您需要保证 32 位,在 Data.Int 中有 Int32 类型。
  • 没有上限,因为它取决于平台:在 64x 机器上 Prelude.ma­xBound :: Int 应该在 2^63 左右

标签: haskell types size ghc


【解决方案1】:

这是为了允许使用标签的 Haskell 实现。使用标记时,您需要一些位作为标记(至少一个,两个更好)。我不确定目前是否有这样的实现,但我似乎记得 Yale Haskell 使用过它。

标记可以在一定程度上避免装箱的缺点,因为您不再需要装箱;相反,标签位会告诉你它是否被评估等等。

【讨论】:

  • 您能解释一下“标记”和“装箱”吗?
【解决方案2】:

Haskell 语言定义指出type Int covers at least the range [−229, 229−1]. 还有其他编译器/解释器使用此属性来增加结果程序的执行时间。

所有对(对齐的)Haskell 数据的内部引用都指向在 32 位(64 位)系统上是 4(8) 倍数的内存地址。因此,引用只需要 30 位(61 位),因此允许 2(3)位用于 “指针标记”

如果是数据,GHC 使用这些标签来存储有关该引用数据的信息,即该值是否已被评估,如果已评估,则它具有哪个构造函数。

如果是 30 位 Ints(因此,不是 GHC),您可以使用一位来确定它是指向未评估的 Int 的指针还是指向 Int 本身的指针。

指针标记可用于一位引用计数,这可以加快垃圾收集过程。这在运行时创建直接的一对一生产者-消费者关系的情况下很有用:它将直接导致内存重用,而不是垃圾收集器馈送。

因此,使用 2 位进行指针标记,可能会有一些激烈优化的疯狂组合...... 如果是 Ints,我可以想象这 4 个标签:

  • 对未评估的Int 的单数引用
  • 许多相同的引用之一可能仍未评估Int
  • Int 本身的 30 位
  • 对已评估的 32 位 Int 的引用(可能有很多引用)。

【讨论】:

  • @hvr:我不知道为什么我记得 28 位; Haskell 98 报告指出与 2010 年相同的范围。感谢更正。
  • 我已经修改了所有内容。全新的文本,比以前更精确。
【解决方案3】:

我认为这是因为早期实现 GC 和所有这些东西的方法。如果您有 32 位可用并且您只需要 30 位,您可以使用这两个备用位来实现有趣的事情,例如在最低有效位中使用零来表示值,而在指针中使用 1。

今天的实现不使用这些位,因此Int 在 GHC 上至少有 32 位。 (这并不完全正确。IIRC 可以将一些标志设置为具有 30 位或 31 位 Ints)

【讨论】:

    猜你喜欢
    • 2012-11-10
    • 1970-01-01
    • 2016-10-26
    • 2018-03-10
    • 2012-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多