我正在为专有语言实现编译器。
该语言有一个内置整数类型,范围无限。有时变量使用较小的类型表示,例如,如果a
和b
是整数变量,但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?
答案 0 :(得分:0)
嗯..在我看来,你已经回答了你的问题。
但我怀疑这个问题确实有任何有用的结果。
如果默认情况下唯一的内置整数具有无限范围,则对于典型用法(例如循环计数器)应该效率不高。
我认为只有在发生实际溢出之后,扩展值范围(并为变量分配更多内存)对于这种语言来说并不难。