Ich habe mich gefragt, ob die heutigen modernen Compiler wie MS cc, gcc, clang, icc und neuere Versionen mit der aktuellen Version desselben Compilers erstellt wurden?
Wegen dieses Risikos natürlich:
http://scienceblogs.com/goodmath/2007/04/15/strange-loops-dennis-ritchie-a/
http://c2.com/cgi/wiki?TheKenThompsonHack
Ich bin mir sicher, dass jeder, der an der Entwicklung der oben erwähnten Compiler beteiligt ist, von diesem Problem weiß, bei dem Code von einer früheren Version von ihm selbst in den Compiler eingeschleust und unsichtbar weitergegeben wird.
Nun, das eigentliche Problem ist nicht wirklich eines der Hintertüren, sondern viel mehr die Korrektheit der Codegenerierung, nicht wahr? Wie wäre es, wenn irgendwo in der Build-Kette aus reinem Versehen irgendeine perverse Wendung eingeführt wurde und der heutige Compiler aufgrund des Fehlers von Ken Thompson falschen Code generiert, selbst wenn der Quellcode des Compilers OK aussieht?
Wenn sie also mit sich selbst gebaut sind, wie schützen sie sich?
Ich habe mich gefragt, ob die heutigen modernen Compiler wie MS cc, gcc, clang, icc und neuere Versionen mit der aktuellen Version desselben Compilers erstellt wurden.
Der Roslyn C#-Compiler kann sich selbst erstellen; Tatsächlich ist es einer seiner eigenen besten Testfälle. Natürlich konnte es dies nicht am ersten oder sogar am 100. Tag tun; Es wurde mit der vorherigen Version des C#-Compilers erstellt, der in C++ geschrieben wurde.
Wie wäre es, wenn irgendwo in der Build-Kette aus reinem Versehen eine perverse Wendung eingeführt wurde und der heutige Compiler falschen Code generiert, selbst wenn der Quellcode des Compilers in Ordnung aussieht
Dies ist eine ernsthafte Sorge.
Eine der interessanten Möglichkeiten, wie Sie nach Fehlern in einem selbsterstellenden Compiler suchen können, ist die folgende: Nennen Sie den ursprünglichen, nicht selbsterstellenden Compiler Alpha. Erstellen Sie den neuen Quellcode mit Alpha, um Beta zu produzieren. Lassen Sie dann Beta den Quellcode erstellen, um Gamma zu produzieren. Lassen Sie dann Gamma den Quellcode erstellen, um Delta zu produzieren. Wenn es signifikante Unterschiede in den für Gamma und Delta erstellten Binärdateien gibt, haben Sie wahrscheinlich ein Problem. Beta und Gamma sollten bei gleichen Eingaben die gleichen Ausgaben haben. (Insbesondere C# verspricht nicht, dass das zweimalige Kompilieren des gleichen Codes genau die gleiche Binärdatei erzeugt, also müssen Sie darauf achten, dass Ihr Test ausgefeilt genug ist, um dies zu berücksichtigen.)
Die Art und Weise, wie Sie dieses Risiko mindern, ist natürlich dieselbe Art und Weise, wie Sie jedes Risiko mindern, das mit schlechten Tools verbunden ist: Sie checken verschiedene Versionen der Compiler-Tools in das Repository ein, sodass Sie zu einer früheren, bekanntermaßen guten Version des Compilers zurückkehren können sollten Sie müssen. Und Sie testen den Compiler intensiv.
Im Allgemeinen lautet die Antwort „Ja“ für Compiler, die in ihren eigenen Sprachen implementiert sind. Den Compiler mit sich selbst zu bauen ist einer der besten Tests auf Korrektheit. Aufeinanderfolgende Läufe sollten weiterhin dieselbe Binärdatei produzieren. „GC“ zum Beispiel wird mit einem vierstufigen Bootstrap-Prozess erstellt.
Natürlich können einige Sprachen nicht zum Compiler-Schreiben verwendet werden.
BEARBEITEN Es sollte klargestellt werden, dass diese Antwort gepostet wurde, als die inhaltliche Frage lautete: “Werden Compiler mit früheren Versionen von sich selbst erstellt?” Es wurde nachträglich geändert.
stackoverflow.com/questions/193560/… stackoverflow.com/questions/494372/… stackoverflow.com/questions/5657454/…
– stijn
27. März 2014 um 8:03 Uhr
@DevSolar:
opinion based?
Ernsthaft ? und was sagen Sie zu dem perfekt nachprüfbaren Kommentar von EJP? und warum gibst du den Implementierern keine Chance zu antworten? Es gibt Leute von Microsoft in dieser Community. Ich bin mir sicher, dass es auch GCC-Beitragende gibt.– v.oddou
27. März 2014 um 8:20 Uhr
Möglicherweise. Was ist mit: Werden Förderbandanlagen in Fabriken mit einem Förderband gebaut? Werden Roboter aus Robotern gebaut (oder von Hand gefertigt)? Werden Computer mithilfe von Computern entworfen (oder auf Papier gezeichnet)?
– Patrick
27. März 2014 um 9:03 Uhr
Um etwas Vertrauen in den Compiler zu bekommen, würden Sie (a) ihn mit mehreren Compilern von verschiedenen Herstellern kompilieren; dies wird offensichtlich verschiedene Binärdateien erzeugen, dann (b) kompilieren Sie es mit diesen verschiedenen Binärdateien, was dann identische Binärdateien ergeben sollte. Das ist für einen Compiler, der die Sprache kompilieren kann, in der er geschrieben ist; COBOL-Compiler sind möglicherweise nicht in COBOL geschrieben.
– gnasher729
27. März 2014 um 9:08 Uhr
en.wikipedia.org/wiki/Bootstrapping_%28compilers%29
– phuklv
27. März 2014 um 9:23 Uhr