いくつかの最新のプログラミング言語 (C++、Java、および C# を含む) では、この言語では、実行時に整数オーバーフローが発生しても、エラー状態が発生することはありません。
たとえば、オーバーフロー/アンダーフローの可能性を考慮していない、この (考案された) C# メソッドについて考えてみましょう。(簡潔にするために、このメソッドは、指定されたリストが null 参照の場合も処理しません。)
//Returns the sum of the values in the specified list.
private static int sumList(List<int> list)
{
int sum = 0;
foreach (int listItem in list)
{
sum += listItem;
}
return sum;
}
このメソッドが次のように呼び出された場合:
List<int> list = new List<int>();
list.Add(2000000000);
list.Add(2000000000);
int sum = sumList(list);
sumList()
メソッドでオーバーフローが発生します( int
C# の型は 32 ビット符号付き整数であり、リスト内の値の合計が最大 32 ビット符号付き整数の値を超えるため)。sum 変数の値は -294967296 になります (4000000000 の値ではありません)。これはおそらく、sumList メソッドの (架空の) 開発者が意図したものではありません。
明らかに、開発者が整数オーバーフローの可能性を回避するために使用できるさまざまな手法があります。たとえば、Java の のような型を使用しBigInteger
たり、 C# でchecked
キーワードと/checked
コンパイラ スイッチを使用したりします。
しかし、私が興味を持っているのは、これらの言語が、たとえば、実行時に操作が実行されたときに例外を発生させて、オーバーフロー。このような動作は、オーバーフローが発生する可能性のある算術演算を実行するコードを記述する際に、開発者がオーバーフローの可能性を考慮することを怠った場合に、バグを回避するのに役立つようです。(これらの言語には、開発者がその動作を明示的に意図している場合に、例外が発生することなく整数オーバーフローの発生が許可されるブロックを指定できる「unchecked」キーワードのようなものが含まれていた可能性があります。C# には実際に this . )
答えは単純にパフォーマンスに帰着しますか?言語設計者は、該当するすべての算術演算で、オーバーフローが発生したかどうかを確認するためにランタイムが余分な作業を行う必要がある「遅い」算術整数演算をそれぞれの言語にデフォルトで設定することを望んでいませんでした。操作 - このパフォーマンスの考慮事項は、不注意なオーバーフローが発生した場合の「サイレント」障害を回避する価値を上回りましたか?
パフォーマンスの考慮事項以外に、この言語設計の決定にも他の理由はありますか?