Я реализую компилятор для проприетарного языка.Притворив, что 64-разрядное целое число имеет неограниченный диапазон
Язык имеет один встроенный целочисленный тип с неограниченным диапазоном. Иногда переменные представлены с использованием меньших типов, например, если a
и b
являются целыми переменными, но b
только когда-либо присваивается значение выражения a % 100000
или a & 0xFFFFFF
, то b
может быть представлена как Int32
вместо этого.
Я рассматриваю возможность реализации следующей оптимизации. Пусть он видит эквивалент этой C# метод:
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
, который в конечном итоге переполнение, если цикл работает вечно. Однако я подозреваю, что я могу игнорировать эту возможность, потому что:
i
инициализируется 0 и изменяется только путем многократного добавления к нему 1, что означает, что будет принимать 2 итераций цикла, чтобы сделать его переполнение- Если
DoStuff
выполняет какую-либо полезную работу, понадобится столетие (экстраполированное из моих очень грубых тестов) дляi
для переполнения. Машина, на которой работает программа, длится недолго. Не только это, но и архитектура , вероятно, тоже недолговечны, поэтому мне также не нужно беспокоиться о том, что она работает на виртуальной машине, которая перенесена на новое оборудование. - Если
DoStuff
не делает никакой полезной работы, в конце концов, оператор заметит, что он тратит процессорное время и убить процесс
Так что сценарии делать мне нужно беспокоиться?
Неужели какие-либо компиляторы уже используют этот хак?
У вашей BigInt есть небольшая оптимизация int? Если это так, я сомневаюсь, что ваша оптимизация - это все, что увлекательно, хотя я думаю, что это все равно позволяет избежать нескольких тестов, и в зависимости от вашего фирменного языка, возможно, можно избежать вызова вне очереди для выполнения приращения. Если нет, я бы сказал, что сначала приступим к внедрению, прежде чем переходить к поиску узких ситуаций, когда вы можете применить один за пределами кода BigInt :-) –