0

Я реализую компилятор для проприетарного языка.Притворив, что 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 не делает никакой полезной работы, в конце концов, оператор заметит, что он тратит процессорное время и убить процесс

Так что сценарии делать мне нужно беспокоиться?
Неужели какие-либо компиляторы уже используют этот хак?

+0

У вашей BigInt есть небольшая оптимизация int? Если это так, я сомневаюсь, что ваша оптимизация - это все, что увлекательно, хотя я думаю, что это все равно позволяет избежать нескольких тестов, и в зависимости от вашего фирменного языка, возможно, можно избежать вызова вне очереди для выполнения приращения. Если нет, я бы сказал, что сначала приступим к внедрению, прежде чем переходить к поиску узких ситуаций, когда вы можете применить один за пределами кода BigInt :-) –

ответ

0

Ну .. Мне кажется, вы уже ответили на свой вопрос.

Но я сомневаюсь, что у вопроса действительно есть какой-то полезный результат.

Если по умолчанию единственное встроенное целое число имеет неограниченный диапазон, оно не должно быть неэффективным для обычного использования, например, для счетчика циклов.

Я думаю, что расширение диапазона значений (и выделение большего количества памяти для переменной) только после фактического переполнения не так уж сложно для такого языка.

Смежные вопросы