为什么Haskell中Int的标准保证范围是[-2^29; 2^29)?

1rhkuytd  于 2023-11-18  发布在  其他
关注(0)|答案(1)|浏览(103)

为什么范围如此具体?为什么不是29位宽或32位宽,为什么是30位宽?
理由是什么?标准(1)似乎没有给予它

bq3bfh9z

bq3bfh9z1#

我最终在Haskell Discourse forum上询问了这个谜团,在那里有多种理论,直到一位用户能够确认这确实是因为耶鲁 haskell (正如这篇评论已经推测的那样)。
Yale Haskell将Haskell程序编译为Common Lisp程序。(具体来说,Yale Haskell旨在运行在Lucid Common Lisp,CMU Common Lisp(CMUCL)或Armed Bear Common Lisp(AKCL)上。Lisp是一种完全动态类型的编程语言(与Haskell不同),需要在运行时保留所有类型信息。
CMUCL采用的方法是在所有运行时值上使用三个较低的位作为此类型信息的标记[1,2]。为“偶数”和“奇数”小整数(fixnum s)保留了两种位模式,以给予30位范围。
因此,如果Haskell程序被编译为Common Lisp程序,并且意图是将Lisp fixnum重新用于Haskell的Int s,则它们的有效范围将仅为30位,换句话说,[-2^29..2^29-1]范围。
在当今时代,这一切都不再重要了,原因如下:

  • Yale Haskell在1995年停止使用[3]。GHC Haskell编译为机器码而不是Lisp,能够使用Int的完整32位/64位范围。
  • CMU Common Lisp仍然存在,并且仍然只有32位。但是it seems like it has been replaced in big part在Common Lisp社区中由Steel Bank Common Lisp (SBCL)使用,其中forked from it in 1999. SBCL为fixnum使用了不同的内部表示。
  • 现代硬件有着非常不同的限制:紧凑的内存使用比内联算法和满足分支预测器更重要。例如,CMUCL的标记方法与IEEE浮点数不兼容,这可能是现在使用其他技术的原因。
  1. CMU internal docs about tagging
  2. CMU internal docs about about Fixnum specifically
  3. A History of Haskell: Being Lazy With Class

相关问题