"Compiler zertifizieren" bedeutet normalerweise etwas anderes: Es bedeutet, dass Sie einen Compiler haben, der nachweisen kann, dass der von ihm ausgegebene Maschinencode die allgemeine Semantik korrekt implementiert. Das heißt, dies ist ein Beweis dafür, dass es keine Compiler-Fehler gibt. Die Programme, die der Compiler erhält, können immer noch falsch sein, der Compiler generiert jedoch eine korrekte Maschinencodeversion des falschen Programms. Die größte Erfolgsgeschichte in dieser Hinsicht ist der CompCert-verifizierte Compiler , der einen Compiler für eine große Teilmenge von C darstellt.
Der Compcert-Compiler selbst ist ein Programm mit einem Korrektheitsnachweis (in Coq erstellt), der garantiert, dass, wenn Code für ein Programm generiert wird, dieser korrekt ist (in Bezug auf die von den CompCert-Designern verwendete Betriebssemantik von Assembly & C). Der Aufwand, diese Dinge maschinell zu überprüfen, ist ziemlich groß; Normalerweise liegt der Korrektheitsnachweis zwischen 1x und 100x der Größe des zu überprüfenden Programms. Das Schreiben von maschinengeprüften Programmen und Beweisen ist eine neue Fähigkeit, die Sie lernen müssen - es ist nicht wie üblich Mathematik oder Programmierung, obwohl es von der Fähigkeit abhängt, beides gut zu können. Es fühlt sich an, als würden Sie von vorne anfangen, als wären Sie wieder ein Anfänger in der Programmierung.
Hierfür gibt es jedoch keine besonderen theoretischen Hindernisse. Das einzige, was in diese Richtung geht, ist das Blum-Size-Theorem , das besagt, dass Sie für jede Sprache, in der alle Programme total sind, ein Programm in einer allgemein rekursiven Sprache finden können, das mindestens exponentiell größer ist, wenn es in der Gesamtsprache programmiert wird. Der Weg, dieses Ergebnis zu verstehen, besteht darin, dass eine Gesamtsprache nicht nur ein Programm, sondern auch einen Terminierungsnachweis codiert. So können Sie kurze Programme mit langen Abschlussprüfungen haben. In der Praxis spielt dies jedoch keine Rolle, da wir nur Programme mit verwaltbaren Termination Proofs schreiben werden.
EDIT: Dai Le bat um eine Ausarbeitung des letzten Punktes.
Dies ist meistens eine pragmatische Behauptung, die auf der Tatsache beruht, dass, wenn Sie verstehen können, warum ein Programm funktioniert, es unwahrscheinlich ist, dass der Grund eine riesige Invariante ist, die Millionen von Seiten umfasst. (Die längsten Invarianten, die ich verwendet habe, sind ein paar Seiten lang, und sie bringen die Rezensenten zum Murren. Verständlicherweise auch, da die Invariante der Grund ist, warum das Programm ohne die gesamte Erzählung arbeitet, die den Leuten hilft, es zu verstehen.)
Aber es gibt auch einige theoretische Gründe. Grundsätzlich kennen wir nicht viele Möglichkeiten, Programme systematisch zu erfinden, deren Korrektheitsnachweise sehr lang sind. Die Hauptmethode besteht darin, (1) die Logik zu verwenden, in der Sie die Richtigkeit nachweisen, (2) eine Eigenschaft zu finden, die in dieser Logik nicht direkt ausgedrückt werden kann (Konsistenznachweise sind die typische Quelle), und (3) ein Programm zu finden, dessen Der Korrektheitsnachweis beruht auf einer Reihe von ausdrücklichen Konsequenzen des unaussprechlichen Eigentums. Da (2) unaussprechlich ist, bedeutet dies, dass der Beweis für jede ausdrückliche Konsequenz unabhängig durchgeführt werden muss, wodurch Sie die Größe des Korrektheitsbeweises sprengen können. Beachten Sie als einfaches Beispiel, dass Sie in der Logik erster Ordnung mit einer übergeordneten Beziehung die Vorfahrenbeziehung nicht ausdrücken können.kkk
Die differenzierte Sichtweise auf dieses Thema wird "Umkehrmathematik" genannt und ist das Studium der Axiome, die erforderlich sind, um gegebene Theoreme zu beweisen. Ich weiß nicht so viel darüber, aber wenn Sie eine Frage zu ihrer Bewerbung an CS stellen und ich bin sicher, dass Timothy Chow und wahrscheinlich mehrere andere Leute Ihnen interessante Dinge erzählen können.