Worüber wir hier letztendlich sprechen, ist Kompilierungszeit gegen Laufzeit.
Wenn Sie darüber nachdenken, führen Kompilierungszeitfehler letztendlich dazu, dass der Compiler feststellen kann, welche Probleme Sie in Ihrem Programm haben, bevor es überhaupt ausgeführt wird. Es ist offensichtlich kein Compiler für "beliebige Sprachen", aber ich werde gleich darauf zurückkommen. Der Compiler listet jedoch in all seiner unendlichen Weisheit nicht jedes Problem auf, das vom Compiler bestimmt werden kann. Dies hängt teilweise davon ab, wie gut der Compiler geschrieben ist. Der Hauptgrund dafür ist jedoch, dass zur Laufzeit viele Dinge bestimmt werden .
Laufzeitfehler sind, wie Sie sicher wissen, jede Art von Fehler, der während der Ausführung des Programms selbst auftritt. Dies umfasst das Teilen durch Null, Nullzeigerausnahmen, Hardwareprobleme und viele andere Faktoren.
Aufgrund der Art der Laufzeitfehler können Sie diese Fehler beim Kompilieren nicht vorhersehen. Wenn Sie könnten, würden sie mit ziemlicher Sicherheit zur Kompilierungszeit überprüft. Wenn Sie garantieren können, dass eine Zahl zur Kompilierungszeit Null ist, können Sie bestimmte logische Schlussfolgerungen ziehen. Wenn Sie beispielsweise eine Zahl durch diese Zahl dividieren, wird ein Rechenfehler verursacht, der durch die Division durch Null verursacht wird.
Als solches führt der Feind der programmgesteuerten Gewährleistung des ordnungsgemäßen Funktionierens eines Programms auf sehr reale Weise Laufzeitprüfungen durch, anstatt Zeitprüfungen zu kompilieren. Ein Beispiel hierfür könnte eine dynamische Umwandlung in einen anderen Typ sein. Wenn dies zulässig ist, überschreiben Sie als Programmierer im Wesentlichen die Fähigkeit des Compilers, zu wissen, ob dies eine sichere Sache ist. Einige Programmiersprachen haben entschieden, dass dies akzeptabel ist, während andere Sie zumindest beim Kompilieren warnen.
Ein weiteres gutes Beispiel könnte sein, dass Nullen Teil der Sprache sein dürfen, da Nullzeigerausnahmen auftreten können, wenn Sie Nullen zulassen. Einige Sprachen haben dieses Problem vollständig beseitigt, indem sie verhindert haben, dass Variablen, die nicht explizit deklariert wurden, Nullwerte enthalten können, die deklariert werden sollen, ohne sofort einen Wert zugewiesen zu bekommen (z. B. Kotlin). Sie können einen Laufzeitfehler für eine Nullzeigerausnahme zwar nicht beseitigen, aber Sie können dies verhindern, indem Sie die Dynamik der Sprache entfernen. In Kotlin können Sie natürlich die Möglichkeit erzwingen , Nullwerte zu halten, aber es versteht sich von selbst, dass dies eine metaphorische "Käufer aufgepasst" ist, da Sie dies ausdrücklich als solche angeben müssen.
Könnten Sie konzeptionell einen Compiler haben, der Fehler in jeder Sprache überprüfen kann? Ja, aber es wäre wahrscheinlich ein klobiger und höchst instabiler Compiler, in dem Sie unbedingt die Sprache angeben müssten, die zuvor kompiliert werden soll. Es konnte auch nicht viel über Ihr Programm wissen, genauso wenig wie Compiler für bestimmte Sprachen bestimmte Dinge darüber wissen, wie zum Beispiel das von Ihnen erwähnte Problem des Anhaltens. Wie sich herausstellt, sind viele Informationen, die interessant sein könnten, um etwas über ein Programm zu erfahren, unmöglich zu finden. Dies wurde bewiesen, so dass es sich wahrscheinlich nicht so schnell ändern wird.
Zurück zu Ihrem Hauptpunkt. Methoden sind nicht automatisch threadsicher. Dafür gibt es einen praktischen Grund: Thread-sichere Methoden sind auch dann langsamer, wenn keine Threads verwendet werden. Rust entscheidet, dass sie Laufzeitprobleme beseitigen können, indem sie Methoden standardmäßig threadsicher machen, und das ist ihre Wahl. Es hat jedoch einen Preis.
Es mag möglich sein, die Richtigkeit eines Programms mathematisch zu beweisen, aber mit der Einschränkung, dass Sie buchstäblich keine Laufzeitfunktionen in der Sprache haben würden. Sie können diese Sprache lesen und wissen, was sie ohne Überraschungen tut. Die Sprache würde wahrscheinlich sehr mathematisch aussehen, und das ist dort wahrscheinlich kein Zufall. Der zweite Nachteil ist , dass Laufzeitfehler noch passieren, die nichts haben , kann sich mit dem Programm zu tun. Daher kann das Programm korrekt nachgewiesen werden, eine Reihe von Annahmen über den Computer unter der Annahme , es auf ausgeführt wird, genau und nicht ändern, was natürlich immer nicht sowieso und oft passieren.