假装64位整数具有无限范围

时间:2011-01-25 16:23:24

标签: language-agnostic compiler-construction integer biginteger compiler-optimization

我正在为专有语言实现编译器。

该语言有一个内置整数类型,范围无限。有时变量使用较小的类型表示,例如,如果ab是整数变量,但b只分配了表达式a % 100000或{{1}的值},然后a & 0xFFFFFF可以表示为b

我正在考虑实施以下优化。假设它看到了这个C#方法的等价物:

Int32

从数学上讲,转换为以下是有效:

public static void Main(string[] args)
{
    BigInt i = 0;
    while (true)
    {
        DoStuff(i++);
    }
}

因为我已经用public static void Main(string[] args) { Int64 i = 0; while (true) { DoStuff(i++); } } 替换了BigInt,如果循环永远运行,它最终会溢出。但是我怀疑我可以忽略这种可能性,因为:

  • Int64被初始化为0并且仅通过重复添加1来修改,这意味着将循环的2 63 迭代使其溢出
  • 如果i做了任何有用的工作,那么DoStuff溢出需要花费几个世纪(从我粗略的测试中推断出来)。程序运行的机器不会持续那么久。不仅如此,它的体系结构也可能不会持续那么久,所以我也不必担心它在迁移到新硬件的VM上运行。
  • 如果i没有做任何有用的工作,操作员最终会注意到它浪费CPU周期并终止进程

那么的场景我需要担心什么? 有没有编译器已经使用过这个hack?

1 个答案:

答案 0 :(得分:0)

嗯..在我看来,你已经回答了你的问题。

但我怀疑这个问题确实有任何有用的结果。

如果默认情况下唯一的内置整数具有无限范围,则对于典型用法(例如循环计数器)应该效率不高。

我认为只有在发生实际溢出之后,扩展值范围(并为变量分配更多内存)对于这种语言来说并不难。