Wenn die Arbeit eines Compilers im Wesentlichen darin besteht, Quellcode in Code auf Maschinenebene zu übersetzen, kann es dann zu Störungen in einem Compiler kommen, dh zu einer fehlerhaften "Übersetzung"?
Das Gleiche gilt für einen Dolmetscher: Kann er manchmal den erforderlichen Inhalt nicht ausgeben?
Ich habe keine Fehler in Compilern / Interpreten gehört, aber gibt es sie?
compiler
bug
interpreters
Hexenkönig
quelle
quelle
Antworten:
Ja
Sie finden sie eher in Sprachen, die aktiv entwickelt werden, als in Sprachen, die relativ ausgereift sind (und daher häufig keine großen Veränderungen feststellen ). Dies ist wahrscheinlich der Grund, warum die meisten Sprachen in verschiedenen Stabilitätsphasen veröffentlicht werden. Ein nächtlicher Build ist mit weitaus geringerer Wahrscheinlichkeit stabil als ein Release-Kandidat , der selbst mit geringerer Wahrscheinlichkeit stabiler ist als eine vollständig freigegebene und aktiv genutzte Version.
Glücklicherweise verfügen die meisten dieser Sprachen (insbesondere Open Source-Sprachen) über ein öffentliches Fehlerverfolgungssystem, bei dem Sie Berichte einreichen können.
Aus eigener Erfahrung bin ich in Scala unter Windows auf einen ziemlich dunklen, aber schweren Fehler gestoßen . Ich habe meine Ergebnisse an den Bug-Tracker übermittelt und das Problem wurde ziemlich schnell behoben. In diesem Fall waren die Sprachentwickler klug genug, um einen hilfreichen Hinweis in die Ausgabe des Fehlerprotokolls aufzunehmen. Sie schlugen vor, dass es sich bei dem, was mir begegnete, tatsächlich um einen Compilerfehler handelte, und sagten, wo der Bericht einzureichen sei.
quelle
Mit den Worten des Laien:
Alle Programme können Fehler enthalten.
Compiler sind Programme.
Ergo können Compiler Fehler haben.
quelle
Es kann sogar Fehler in der Hardware geben; Ein berühmtes Beispiel ist der Pentium FDIV-Fehler . Ohne Zweifel besteht die Möglichkeit, dass die Compiler Fehler enthalten.
quelle
Compiler und Interpreter sind ebenfalls Software und daher nicht frei von den Problemen anderer Software.
Dies ist ein Beispiel eines Compilers aus MSVC 11 (2012) . Hier ist ein Artikel darüber, wie er das Backend testet .
quelle
Natürlich, weil Compiler Software sind.
Im Jahr 2005 hatte ich einen Codefehler in einer äußerst kritischen Software, die ich für ein großes Unternehmen geschrieben hatte. Da es das Unternehmen buchstäblich Millionen von Dollar gekostet hat, haben sie natürlich eine großartige Untersuchung eingeleitet.
Zum Glück (aus meiner Sicht) erwies sich das Problem als Compiler-Problem in Delphi. Im try finally-Block wurde der Rückgabewert einer Funktion zerstört und führte zu absolut zufälligen Ergebnissen für den Aufrufer. Dies wurde von Borland dokumentiert und bestätigt.
Es ist allgemein bekannt, dass .NET buchstäblich Hunderte verschiedener Speicherverluste aufweist, insbesondere in den frühen Implementierungen.
Ich würde behaupten, dass es keine fehlerfreie Software gibt. Compiler sind keine Ausnahme. Sie werden jedoch gründlicher getestet als die meisten Unternehmenssoftwareprodukte und von intelligenten, kritischen und umstrittenen Personen konsumiert, sodass ihre Erfolgsbilanz im Großen und Ganzen ziemlich gut ist.
quelle
Nicht nur Fehler, sondern auch vorsätzliche Malware.
Der "Login" -Trojan, den Brian Kernighan für den ursprünglichen Unix C-Compiler implementiert hat, ist der bekannteste. Der Artikel http://cm.bell-labs.com/who/ken/trust.html enthält Hintergrundinformationen.
quelle
Ja, natürlich haben Software-Compiler Fehler, zum Beispiel ist die GCC-Fehlerliste hier
quelle
Ja.
Außerdem nicht nur mit Compilern, sondern auch mit Interpretern / Debuggern und allen Softwaretools von Drittanbietern.
Wir verwenden derzeit Software von Drittanbietern und haben einige Probleme. Manchmal danken sie uns, dass wir einen Fehler gefunden und gemeldet haben. :)
Einige von ihnen haben auch Speicherlecks, die zum Absturz führen. Hier könnte die wichtige Frage lauten, wie festgestellt werden kann, ob das Drittanbieter-Tool oder der Compiler Fehler aufweist, damit Ihre Anwendung ordnungsgemäß funktioniert.
quelle
Compiler ist ein Programm, das ein Programm liest, das in einer Sprache (der Ausgangssprache) geschrieben ist, und es in ein anderes äquivalentes Programm in einer anderen Sprache (der Zielsprache), meistens Maschinensprache, übersetzt.
Es gibt verschiedene Phasen des Compilers, in denen der Quellcode zeilenweise gescannt wird. Es gibt eine Symboltabelle, in der alle Keywords aufgeführt sind, nach denen im Quellcode gesucht wird.
Phase 1: Lexical Analyzer - liest alle Zeichen im Quellprogramm und bildet die logische Trennung der Token (int, char, float, if-else, for, while usw.)
Phase 2: Syntax Analyzer - Analyse der Struktur von Tokenströmen. Hierarchisches Parsen von Ausdrücken, einschließlich Postfix / Präfix usw. (a = b + c * d)
Phase 3: Semantic Analyzer - Typüberprüfung von Tokens (Ganzzahl zu Real, Float usw.) und vielen Dingen wie Operator-Priorität usw.
Phase 4: Zwischencode-Generator - a = b + c * de (temp1 = c * d, temp2 = temp1 + b, temp3 = temp2-e)
Phase 5: Code-Optimierung - Verschiedene Analysen (Kontrollfluss, Datenfluss, Transformationen)
die Folgendes beinhalten: Redundanzcode, Konstanten-Propogation, Teil-Dead-Code, gemeinsamer Teilausdruck, Schleifen-Invarianten-Code
Phase 6: Codegenerierung - Generierung von Zielcode (meistens Assembler), wobei Werte in Register eingetragen werden
All diese Phasen sind nichts anderes als gut geschriebene Programme und es könnte N Fehler in der Anzahl geben.
quelle
Natürlich sind Compiler nur Programme und ihre Autoren sind auch Idioten :). Sogar Sprachspezifikationen können einen Fehler aufweisen. Beispiel: c # + foreach + lambda .
Oder in Python, Fehler im Interpreter: Kompilieren des bösen Ast Crashs Interpreter .
Nun, wenn Sie nach Fehlern in Compiler / Interpeter suchen wollen -> schauen Sie sich PHP an. Es gibt einen berühmten Fehler mit Integer-Überlauf. Der erste Fix wurde von gestartet
if (size > INT_MAX) return NULL;
. Fortsetzung der Geschichte .quelle