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
,如果循环永远运行,它最终会溢出。然而,我怀疑我可以忽略这种可能性,因为:
初始化为0,仅通过反复向其中添加1进行修改,这意味着需要263次循环迭代才能使其溢出i
- 如果
做了任何有用的工作,那么DoStuff
溢出将需要几个世纪的时间(根据我非常粗糙的测试推断)。程序运行的机器不会持续那么长时间。不仅如此,它的架构可能也不会持续那么久,所以我也不需要担心它在迁移到新硬件的VM上运行i
- 如果
没有做任何有用的工作,操作员最终会注意到它在浪费CPU周期并终止进程DoStuff
有没有编译器已经使用过这种技术?很好。。在我看来,你已经回答了你的问题 但我怀疑这个问题是否真的有任何有用的结果 如果唯一的内置整数在默认情况下具有无限范围,则对于循环计数器等典型用途,它不应效率低下
我认为,只有在实际溢出发生后才扩展值范围(并为变量分配更多内存),这对这种语言来说并不难。您的BigInt是否有一个小的int优化?如果是这样的话,我怀疑您的优化是否那么令人兴奋,尽管我猜它仍然可以避免一些测试,并且根据您的专有语言,可能可以避免执行增量的越轨调用。如果没有,那么我会说,在寻找可以在BigInt代码之外应用一个的狭窄情况之前,首先开始实现一个:-)
public static void Main(string[] args)
{
Int64 i = 0;
while (true)
{
DoStuff(i++);
}
}