In mehreren modernen Programmiersprachen (einschließlich C++, Java und C#) ermöglicht die Sprache integer overflow zur Laufzeit auftreten, ohne irgendeine Art von Fehlerzustand zu erhöhen.Warum verursachen Sprachen nicht standardmäßig Fehler beim Integerüberlauf?
Betrachten Sie zum Beispiel diese (erfundene) C# -Methode, die die Möglichkeit eines Überlaufs/Unterlaufs nicht berücksichtigt. (Der Kürze halber wird das Verfahren auch nicht den Fall behandeln, in denen die angegebene Liste NULL-Verweis ist.)
//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;
}
Wenn diese Methode aufgerufen wird, wie folgt:
List<int> list = new List<int>();
list.Add(2000000000);
list.Add(2000000000);
int sum = sumList(list);
Ein Überlauf wird treten in der sumList()
-Methode auf (da der int
-Typ in C# eine 32-Bit-Ganzzahl mit Vorzeichen ist und die Summe der Werte in der Liste den Wert der maximalen 32-Bit-Ganzzahl mit Vorzeichen überschreitet). Die Summenvariable hat einen Wert von -294967296 (kein Wert von 4000000000); Das ist höchstwahrscheinlich nicht der (hypothetische) Entwickler der sumList-Methode.
Offensichtlich gibt es verschiedene Techniken, die von Entwicklern verwendet werden können, die Möglichkeit einer Integer-Überlauf, wie unter Verwendung eines Typ wie Java BigInteger
oder dem checked
Schlüsselwort und /checked
Compiler-Schalter in C# zu vermeiden. Die Frage, die mich interessiert, ist die Frage, warum diese Sprachen so entworfen wurden, dass standardmäßig Integer-Überläufe zuerst vorkommen, anstatt zum Beispiel eine Ausnahme auszulösen, wenn zur Laufzeit eine Operation ausgeführt wird würde zu einem Überlauf führen. Es scheint, als würde ein solches Verhalten dazu beitragen, Fehler zu vermeiden, wenn ein Entwickler es versäumt, die Möglichkeit eines Überlaufs zu berücksichtigen, wenn er Code schreibt, der eine arithmetische Operation ausführt, die zu einem Überlauf führen könnte. (Diese Sprachen könnten etwas wie ein "ungeprüftes" Schlüsselwort enthalten, das einen Block angeben könnte, in dem Integerüberlauf zulässig ist, ohne dass eine Ausnahme ausgelöst wird. In den Fällen, in denen das Verhalten explizit vom Entwickler beabsichtigt ist. C# eigentlich does have this.)
Geht die Antwort einfach auf die Leistung zurück - die Sprachentwickler wollten nicht, dass ihre jeweiligen Sprachen auf "langsame" arithmetische Integer-Operationen zurückgreifen, bei denen die Laufzeit zusätzliche Arbeit leisten müsste, um zu überprüfen, ob ein Überlauf aufgetreten ist jede anwendbare arithmetische Operation - und diese Leistungsüberlegung überwog den Wert der Vermeidung von "stillen" Fehlern in dem Fall, dass ein unbeabsichtigter Überlauf auftritt?
Gibt es andere Gründe für diese Sprachentwurfsentscheidung, abgesehen von Leistungsüberlegungen?
Wie sehr hätte die Integer-Überlaufprüfung irgendwelche realistischen Benchmarks beeinflusst? Es scheint mir, dass es viele andere Dinge in C# gibt, die viel schlechter sind (zB ein Feld 'readonly rect foo;', eine Aussage wie 'DoSomething (foo.X, foo.Y');' erfordert eine Kopie von ' foo', indem sie ihre 'X'-Accessor-Methode aufruft, eine weitere Kopie von' foo' erstellt und ihre 'Y'-Accessor-Methode aufruft. Ziemlich massiver Overhead - genug, um Integer-Overflow-Checking vergleichsweise trivial erscheinen zu lassen. – supercat
@supercat: In den meisten realen Code wäre "/ checked" standardmäßig nicht messbar langsamer und würde eine bestimmte Klasse von wichtigen Fehlern fangen. Wie ich jedoch in meiner Antwort sagte, eines der ersten Dinge, die ein früher Rezensent von C# könnte Testen Sie die Leistung der Integer-Arithmetik in einer engen Schleife –
Denken Sie daran, dass C# ist jetzt 12 Jahre alt. Damals glaubten viele Programmierer "C++ ist schnell, Java ist langsam, C# ist wie Java". Heute denke ich, die meisten Programmierer sehen die Zeit bis zur Markteinführung und die Bewältigung der Komplexität als einen größeren Einfluss auf das Geschäftserfolg ss diese Tight-Loop-Optimierung. –