我正在编写一个 Haskell 到 Javascript 代码生成器,使用 GHC 作为库。由于 Javascript 没有整数类型,并且它的 Number 类型只能正确表示最大为 2⁵³ 的整数,因此我将整数表示为数字,显式执行所有算术模 2³²。这在 32 位 GHC 上效果很好,但在 64 位版本上效果更差。
GHC 很乐意将 Int64 值强制转换为 Int 并将 Int 常量解释为 64 位值(例如,0xffffffff 变为 4294967295 而不是 -1),这会导致各种烦人的问题。
如果标准库是在 32 位机器上构建的,编译器即使在 64 位系统上也能很好地处理“普通”网络内容,但是“请不要使用大数字,好吗?” 不是您想在编译器手册中看到的内容。使用 -O0 编译可以缓解一些问题(但不是全部),但是(不出所料)生成的代码不仅速度慢,而且太大。
所以,我需要阻止 GHC 假设 Int 和 Int64 是等价的。这甚至可能吗?