In der Zukunft werden verwaltete Laufzeiten zusätzliche Schutzmechanismen gegen subtile Datenkorruptionsprobleme bieten?
Verwaltete Laufzeiten wie Java und der .NET CLR reduzieren oder beseitigen die Möglichkeit vieler Speicherkorruptionsfehler, die in nativen Sprachen wie C# häufig vorkommen. Dennoch sind sie überraschenderweise nicht immun gegen alle Speicherkorruptionsprobleme. Man erwartet intuitiv, dass eine Methode, die ihre Eingaben validiert, keine Fehler enthält und Ausnahmen robust handhabt, ihr Objekt immer von einem gültigen Zustand in einen anderen transformiert, aber das ist nicht der Fall. (Es ist genauer zu sagen, dass dies nicht der Fall ist unter Verwendung der vorherrschenden Programmierkonventionen - Objektimplementierer müssen besondere Maßnahmen ergreifen, um die von mir beschriebenen Probleme zu vermeiden.)
Betrachten Sie die folgenden Szenarien:
-
Mehrfädigkeit. Der Aufrufer könnte das Objekt mit anderen Threads teilen und gleichzeitig Aufrufe darauf tätigen. Wenn das Objekt keine Synchronisation implementiert, könnten die Felder beschädigt werden. (Möglicherweise sollten Laufzeiten - es sei denn, es wurde mitgeteilt, dass das Objekt threadsicher ist - bei jedem Methodenaufruf ein Interlock verwenden, um eine Ausnahme zu werzeugen, wenn irgendeine Methode am selben Objekt gleichzeitig auf einem anderen Thread ausgeführt wird. Dies wäre ein Schutzmechanismus und, genauso wie andere weit verbreitete Sicherheitsfunktionen von verwalteten Laufzeiten, hat dies Kosten.)
-
Rekursivität. Die Methode ruft eine beliebige Funktion (wie einen Ereignishandler) auf, die letztendlich Methoden auf dem Objekt aufruft, die nicht dafür vorgesehen sind, zu diesem Zeitpunkt aufgerufen zu werden. Dies ist noch kniffliger als die Thread-Sicherheit und viele Klassenbibliotheken setzen dies nicht richtig um. (Noch schlimmer ist, dass Klassenbibliotheken bekannt dafür sind, schlecht zu dokumentieren, welche Rekursivität erlaubt ist.)
Für all diese Fälle kann man argumentieren, dass eine umfangreiche Dokumentation eine Lösung ist. Allerdings kann die Dokumentation auch vorschreiben, wie Speicher in nicht verwalteten Sprachen alloziert und freigegeben wird. Wir wissen aus Erfahrung (z.B. bei der Speicherzuteilung), dass der Unterschied zwischen Dokumentation und Sprache/Laufzeitdurchsetzung Tag und Nacht ist.
Was können wir in der Zukunft von Sprachen und Laufzeiten erwarten, um uns vor diesen Problemen und anderen subtilen Problemen dieser Art zu schützen?