Warum ist es unmöglich zu bauen, einen compiler, der bestimmen kann, ob eine C++ - Funktion, ändert sich der Wert einer bestimmten Variablen?

Lese ich diese Zeile in einem Buch:

Es ist nachweislich unmöglich, zu bauen, einen compiler, der kann eigentlich
bestimmen, ob oder ob nicht eine C++ - Funktion, ändert sich der Wert eines
bestimmte variable.

Wurde der Absatz darum, warum der compiler ist konservativ, wenn die Prüfung für const-ness.

Warum ist es unmöglich, den Bau eines solchen compiler?

Kann der compiler überprüfen Sie immer, ob eine variable zugewiesen wird, eine nicht-const-Funktion aufgerufen wird, oder wenn es weitergegeben wird in eine nicht-const-parameter...

  • Erste Sache, die kommt meiner Meinung dynamic link libraries. Wenn ich kompilieren von code auf meinem Rechner, und kompilieren Sie code auf Ihrem Rechner, und wir verknüpfen zur Laufzeit, wie könnte dein compiler wissen, ob ich die modifizierten Variablen oder nicht?
  • Wenn ich bitten Sie für die Eingabe in mein Programm und basiert auf, dass ich entweder ändern oder nicht ändern, eine bestimmte variable. Dann kann nie vorausgesagt werden zur compile-Zeit, ob ich den Wert der variable nicht. Es könnte, aber Sie kann nicht sicher sagen, es "wird".
  • Genau dieses. Mehr breit, die der compiler nicht kompilieren der Funktion einzeln, aber kompiliert es als Teil eines umfassenderen Bildes, die möglicherweise nicht alle innerhalb der compiler-Bereich.
  • aber ich bin nicht immer, warum jemand wollen, um zu wissen, dass die Funktion ändern sich einige Werte während der Ausführung,da gibt es einige andere Möglichkeiten, um die Spur der Zustand der Variablen oder den Wert.
  • MooingDuck Hat code-Objekt markieren, wenn eine bestimmte Funktion ist const? Auch in Ihrem header-Datei, wenn Sie markiert eine oder mehrere Ihrer Funktionen als const oder einen der Parameter const, der compiler kann dann bestimmen, wenn der code ändert Variablen oder nicht. Richtig? Wenn ja, dann auch wenn Sie kompiliert deinen code an Ihre Maschine, und Sie gab mir Ihre Kopf, mein compiler kann ermitteln, ob die variable geändert wird oder nicht. Richtig?
  • "unmöglich" ist vielleicht eine übertreibung - "rechnerisch unmöglich" (wie im NP-hart) eine bessere Charakterisierung, ist aber ein wenig schwieriger für die Schüler zu fassen. Stellen Sie sich eine Link-Liste oder andere abstrakte Datenstruktur. Wenn ich eine Funktion aufzurufen, die änderungen, die man Knoten in der Liste/Baum/was auch immer, wie kann ein compiler jemals hoffen, um zu beweisen genau, welche Knoten geändert habe (und was vielleicht noch wichtiger ist, welche nicht), ohne im wesentlichen vollständig zu simulieren, das Programm mit den erwarteten Eingang, alle zwar nicht unter 3 Tagen zu kompilieren eine source-Datei...
  • Unmöglich ist keine übertreibung, das Halteproblem gilt hier mehrere Antworten erklären. Es ist einfach nicht möglich, algorithmisch vollständig analysieren zu einem Allgemeinen Programm.
  • Wie vereinbart, für die ganz Allgemeine/willkürliche Fall. Jedoch, viele gut ausgebaute Programme ordnungsgemäße überprüfung der Eingabe nicht zu tun haben mit "beliebige Eingabe", und so kann nicht von Instanzen der vollständige Halteproblem, aber einige reduzierte Teilmenge, die möglicherweise sehr gut nachweisbar, wenn auch nicht unbedingt effizient...
  • Compiler, die nur kompilieren eine Teilmenge der gültigen Programme sind nicht sehr nützlich.
  • Ich Stimme zu, es ist definitiv eine subsprache, wo das Halteproblem nicht gelten. Aber von Turing ' s Beweis wir können folgern, dass solche subsprache ist nicht mehr turing-vollständig, also wirklich nicht so interessant.
  • Wenn der Compiler könnte diese Art von Analyse darüber, wie sich ein Programm verhält, würden wir nicht brauchen, um ausführen unserer Programme. (Ich bin mir sicher, dass ist ein grober overgeneralization.)
  • Ich denke, das ist eine Variante der so genannten "Halteproblem". Gegeben ein beliebiges Programm in einem genügend reiche Programmier-Sprache ist es unmöglich zu bestimmen, ob die Kontrolle überhaupt fließt durch einen bestimmten Punkt. Beachten Sie, dass dies nicht einfach "schwierig", es ist wirklich unmöglich.
  • Sie scheinen zu vergessen, dass dies keine reinen Mathe-problem - "Das problem ist, zu bestimmen, da ein Programm und einen input an das Programm, ob das Programm irgendwann stoppen, wenn mit diesem Eingang." Wenn einer sagt: "Während die Entscheidung, ob diese Programme (wie "Hallo Welt") die Einstellung ist einfach, komplexere Programme als problematisch erweisen." - dies bedeutet, dass Sie gehen in das Gebiet der mathematischen Logik.
  • Während eine "richtige" compiler sollte in der Lage sein zu kompilieren jede gültige Programm, die Teilmenge der gültigen Programme, die wirklich nützlich sind, ist sehr klein (aber immer noch unendlich, und keine mögliche Art und Weise zu charakterisieren, den Satz), so ist auch eine "gebrochene" compiler beherrscht nur "nützliche" Programme (was auch immer das bedeutet) ist noch... die Meisten Compiler bemühen, "richtig" ist, aber aufgrund von bugs und anderen Unzulänglichkeiten nie ganz komplett, dieses Ziel zu erreichen...
  • void UserChange() { int* p; scanf("%p", &p); (*p)++; } unmöglich zu sagen, was hier geändert werden zur Laufzeit.
  • Das Buch ist text, ist unklar, welche verschleiert das Problem. Es ist der Versuch zu sagen, "Holen wir uns eine unendliche Anzahl von Affen, die schreiben jeden erdenklichen C++ - Funktion, die jemals geschrieben werden. Es wird Fälle geben, wo, wenn wir wählen eine variable, die (einige bestimmte Funktion, die Affen geschrieben) verwendet, können wir nicht herausfinden, ob die Funktion ändern, die variable." Natürlich für einige (sogar viele) Funktionen in einer bestimmten Anwendung, diese kann bestimmt werden, indem der compiler, und sehr leicht. Aber nicht für alle (oder unbedingt die meisten).
  • Aus demselben Grund kann man nicht erkennen, Endlosschleife, (können Sie feststellen, es gibt eine Pause-Taste auf der Tastatur, die Sie drücken müssen, selbst wenn man glaubt, dass Sie Ihren code in Endlosschleife)
  • Kann jemand erklären warum der Letzte Satz meiner Frage falsch ist? Warum ist diese Prüfung nicht genug? Hier ist die Letzte Frage: Der compiler kann immer überprüfen, ob seine zugewiesen wird, eine nicht-const-Funktion aufgerufen wird, oder wenn es weitergegeben wird in eine nicht-const-parameter. Warum ist diese Prüfung nicht ausreichend, um zu bestimmen, const-ness?

InformationsquelleAutor Cricketer | 2013-07-01
Schreibe einen Kommentar