0

私は独自の言語用のコンパイラを実装しています。64ビット整数に無制限の範囲があることを推測する

言語には、1つの組み込み整数型があり、無制限の範囲があります。 abが整数変数であるが、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++); 
    } 
} 

は私がInt64BigIntを交換したので、その最終的意志ループが永遠に実行されるとオーバーフローします。

  • iが0に初期化され、繰り返しているが、それは
  • をオーバーフローさせるために、ループの2 反復を取る意味し、それに1を加えただけで修正されています。しかし、私は、私はこの可能性を無視することができます疑います
  • DoStuffが役に立った場合は、iがオーバーフローするまで何世紀もかかるでしょう(私の非常に粗いテストから外挿されます)。プログラムが実行されているマシンはそれほど長くは続かないでしょう。それだけでなく、そのアーキテクチャもおそらく長く続くことはないので、新しいハードウェアに移行されたVM上で動作することについても心配する必要はありません。
  • DoStuffは、任意の有用な仕事をしていない場合、オペレータは、最終的にはCPUサイクルを無駄にし、プロセス

を殺すだから私は心配する必要がを何のシナリオを行うていることがわかりますか?
既にこのハッキングを使用しているコンパイラはありますか?

+0

BigIntのint最適化は小さいですか?もしそうなら、私はあなたの最適化がすべてエキサイティングであるとは思っていますが、それでも2回のテストは避けられますが、あなたの独自の言語に応じて、もしそうでなければ、まずBigIntコードの外に1つを適用できる狭い状況を探しに行く前に、まず最初に実装してみましょう:-) –

答えて

0

まあ、すでにあなたの質問に答えてくれたようです。

しかし、質問には本当に有用な結果があるとは思えません。

デフォルトで唯一の組み込み整数に無制限の範囲がある場合、ループカウンタなどの一般的な使用には非効率的ではありません。

実際のオーバーフローが発生した後にのみ、値の範囲を拡大し(さらに変数を割り当てる)、そのような言語では難しくないと思います。

関連する問題