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

Language agnostic 假装64位整数具有无限范围,language-agnostic,compiler-construction,integer,biginteger,compiler-optimization,Language Agnostic,Compiler Construction,Integer,Biginteger,Compiler Optimization,我正在为一种专有语言实现一个编译器 该语言有一个内置的整数类型,具有无限的范围。有时变量使用较小的类型表示,例如,如果a和b是整数变量,但b仅分配表达式a%100000或a&0xFFFFFF的值,则b可以表示为Int32 我正在考虑实施以下优化。假设它看到了这种C#方法的等价物: 从数学上讲,转换为以下值是无效的: public static void Main(string[] args) { Int64 i = 0; while (true) { Do

我正在为一种专有语言实现一个编译器

该语言有一个内置的整数类型,具有无限的范围。有时变量使用较小的类型表示,例如,如果
a
b
是整数变量,但
b
仅分配表达式
a%100000
a&0xFFFFFF
的值,则
b
可以表示为
Int32

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

从数学上讲,转换为以下值是无效的:

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

  • i
    初始化为0,仅通过反复向其中添加1进行修改,这意味着需要263次循环迭代才能使其溢出
  • 如果
    DoStuff
    做了任何有用的工作,那么
    i
    溢出将需要几个世纪的时间(根据我非常粗糙的测试推断)。程序运行的机器不会持续那么长时间。不仅如此,它的架构可能也不会持续那么久,所以我也不需要担心它在迁移到新硬件的VM上运行
  • 如果
    DoStuff
    没有做任何有用的工作,操作员最终会注意到它在浪费CPU周期并终止进程
那么,我需要担心哪些情况呢?

有没有编译器已经使用过这种技术?

很好。。在我看来,你已经回答了你的问题

但我怀疑这个问题是否真的有任何有用的结果

如果唯一的内置整数在默认情况下具有无限范围,则对于循环计数器等典型用途,它不应效率低下


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

您的BigInt是否有一个小的int优化?如果是这样的话,我怀疑您的优化是否那么令人兴奋,尽管我猜它仍然可以避免一些测试,并且根据您的专有语言,可能可以避免执行增量的越轨调用。如果没有,那么我会说,在寻找可以在BigInt代码之外应用一个的狭窄情况之前,首先开始实现一个:-)
public static void Main(string[] args)
{
    Int64 i = 0;
    while (true)
    {
        DoStuff(i++);
    }
}