Frage

Wann haben Sie jemals persönlich kommen auf die Halteproblem im Feld? Dies kann sein, wenn ein Mitarbeiter / Chef eine Lösung vorgeschlagen, die die grundlegenden Grenzen der Berechnung verletzen würde, oder wenn Sie sich klar, dass ein Problem, das Sie war zu lösen versuchten, zu lösen in der Tat unmöglich.

Das letzte Mal, dass ich mit ihm kam, als Typ Kontrolleure zu studieren. Unsere Klasse erkannte, dass es unmöglich wäre, eine perfekte Art Kontrolleur schreiben (eine, die alle Programme akzeptieren würde, die ohne Typfehler führen würde, und alle Programme abzulehnen, die mit Typ-Fehler führen würde), denn dies würde in der Tat, das Halteproblem lösen . Ein andere war, als wir merkten, in der gleichen Klasse, dass es unmöglich sein würde, um zu bestimmen, ob eine Teilung jemals von Null, in der Typprüfung Stufe, weil die Überprüfung, ob eine Zahl, während der Laufzeit auftreten würde, gleich Null ist, ist auch eine Version des Halteproblems.

War es hilfreich?

Lösung

I wörtlich wurde das Halteproblem zugeordnet, wie im Abschnitt „Monitor-Plugin schreiben, um zu bestimmen, ob ein Host permanent nach unten ist“. Ernsthaft? OK, also werde ich es nur einen Grenzwert geben. „Nein, denn es könnte wieder kommen bis später.“

Viel theoretische Exposition folgte.

Andere Tipps

Vor Jahren, ich erinnere mich, einen Beitrag zu lesen (in Byte-Magazin, glaube ich) ein Produkt Grund Endlosschleife Finder oder BILF genannt. BILF sollte Ihren Microsoft Basic-Quellcode scannen und alle Schleifen finden, das nicht beenden. Sie machte geltend, die Lage sein, jede beliebige Endlosschleifen im Code zu finden.

Der Rezensent war klug genug darauf zu hinweisen, dass für das Programm in allen Fällen zu arbeiten, würde es das Halteproblem zu lösen hat und ging so weit, einen mathematischen Beweis zu liefern, warum es nicht in allen Fällen funktionieren könnte.

In der nächsten Ausgabe veröffentlichten sie einen Brief von einem Vertreter des Unternehmens erklärt, dass das Problem in der nächsten Version behoben werden würde.

Update: ich über ein Bild des Artikels auf Imgur lief. Ich erinnerte mich an die falsche Magazin. Es war Creative Computing, nicht Byte. Ansonsten ist es ziemlich genau, wie ich es in Erinnerung hatte.

Sie können eine hallo-res Version davon sehen Imgur .

eingeben Bild Beschreibung hier eingeben Bild Beschreibung hier

Das Projekt arbeite ich an jetzt hat unentscheidbar Probleme alle über sie. Es ist ein Unit-Test-Generator, so dass im Allgemeinen, was es versucht zu erreichen, ist die Frage zu beantworten „was dieses Programm tut“ . Das ist ein Beispiel eines Halteproblem. Ein weiteres Problem, das bei der Entwicklung kam ist „ist zwei (testing) Funktionen des gleiche gegeben“ ? Oder auch "hat die Reihenfolge der beiden Anrufe (Assertions) Materie"

Was ist mit diesem Projekt interessant ist, dass, auch wenn Sie diese Fragen nicht in alle Situationen beantworten können, Sie können finden intelligente Lösungen, die das Problem 90% lösen von die Zeit, die für diese Domain eigentlich sehr gut ist.

Andere Tools, die über einen anderen Code zur Vernunft versuchen, wie Compiler / Interpreter, statische Code-Analyse-Tools zu optimieren, auch Refactoring-Tools, sind wahrscheinlich zu treffen (also gezwungen werden Abhilfen zu finden), um das Halteproblem.

Beispiel 1. Wie viele Seiten in meinem Bericht?

Als ich zum Programm Lernen ich mit der Herstellung eines Werkzeugs gespielt ziemlich Berichte von Daten auszudrucken. Offensichtlich wollte ich es wirklich flexibel und leistungsfähig sein, so dass es der Berichtgenerator wäre, alle Reportgeneratoren zu beenden.

Die Berichtsdefinition endete so flexibel ist, dass es Turing abgeschlossen. Es könnte an Variablen sucht, wählt zwischen Alternativen, Verwendung Schleifen Dinge zu wiederholen.

, daß die „Seite n von N“ auf jeder Seite

I definiert eine integrierte Variable N, die Anzahl der Seiten im Berichtsinstanz, so dass Sie einen String setzen könnte. Ich habe zwei Durchgänge, wobei die ersten, die Seiten zu zählen (während welchen N auf Null gesetzt wurde), und die zweite, um sie tatsächlich zu erzeugen, unter Verwendung des N aus dem ersten Durchlauf erhalten.

Manchmal ist der erste Durchgang berechnen würde N, und dann würde der zweite Durchgang eine unterschiedliche Anzahl von Seiten (weil jetzt die Nicht-Null-N ändern, was der Bericht täte, würde) erzeugen. Ich habe versucht, Pässe iterativ, bis die N sesshaft zu tun. Dann erkannte ich, das war aussichtslos, denn was, wenn es nicht sesshaft?

Dies führt dann zu der Frage: „Kann ich zumindest erkennen und den Benutzer zu warnen, wenn die Iteration nie auf einen stabilen Wert für die Anzahl der Seiten ihren Bericht erzeugt absetzen wird?“ Zum Glück dieser Zeit hatte ich zu interessieren in der Lektüre über Turing, Gödel, Berechenbarkeit usw. und machte die Verbindung.

Einige Jahre später bemerkte ich, dass MS Access manchmal druckt „Seite 6 von 5“, die eine wirklich wunderbare Sache ist.

Beispiel 2: C ++ Compiler

Der Übersetzungsvorgang beinhaltet Vorlagen erweitert. Vorlagendefinitionen können aus mehreren Spezialisierungen (gut genug, um als „cond“ dienen) ausgewählt werden, und sie können auch rekursiv sein. So ist es eine Turing komplett (rein funktional) meta-System, in dem die Vorlage Definitionen der Sprache sind, sind die Typen, die Werte, und der Compiler ist wirklich ein Dolmetscher. Dies war ein Unfall.

Folglich ist es nicht möglich, jedes beliebige C ++ Programm zu untersuchen und sagen, ob der Compiler im Prinzip mit einer erfolgreichen Kompilierung des Programms beenden könnte.

Compiler-Anbieter umgeht dies, indem die Stapeltiefe Vorlage rekursive begrenzen. Sie können die Tiefe in g ++ anpassen.

Viele vor vielen Monden war ich als Berater für unser Unternehmen zu unterstützen, die ein sehr komplexes Schienensystem Umsetzung wurde Körbe von Metallteilen in und aus einem 1500-Grad-Hochofen zu bewegen. Die Strecke selbst war ein ziemlich komplexer ‚Mini-Rangierbahnhof‘ in der Werkstatt, die sie von Orten in ein Paar durchteuft. Mehrere motorisierte Paletten würden nach Shuttle-Körbe von Teilen um zu einem Zeitplan. Es war sehr wichtig, dass die Ofentüren für so kurze Zeit wie möglich offen waren.

Da die Anlage in voller Produktion war, war der Berater nicht in der Lage seine Software in ‚Echtzeit‘ laufen seine Scheduling-Algorithmen zu testen. Stattdessen schrieb er einen hübschen, Grafik-y-Simulator. Wie wir virtuelle Paletten bewegen auf seinem Bildschirm-Spur-Layout sah, fragte ich, „wie werden Sie wissen, wenn Sie Terminkonflikte haben?“

Seine schnelle Antwort, "Easy -. Die Simulation wird nie aufhören"

Hoch entwickelte statische Code-Analyse in das Halteproblem führen kann.

Zum Beispiel, wenn eine virtuelle Java-Maschine, dass ein Stück Code nachweisen kann, wird niemals out-of-bounds einen Arrayindex zugreifen, kann es, dass die Check weglassen und schneller laufen. Für einige Codes ist dies möglich; wie es komplexer wird wird es das Halteproblem.

Dies ist immer noch ein Problem für Shadern in GPU-Anwendungen. Wenn ein Shader eine Endlosschleife (oder eine sehr lange Berechnung) hat, soll es der Fahrer (nach einiger Zeit Grenze) stoppen, zu töten, das Fragment, oder einfach nur laufen lassen? Für Spiele und andere kommerzielle Sachen, ist der ehemalige wahrscheinlich das, was Sie wollen, aber für wissenschaftliche / GPU-Computing ist die letztere, was Sie wollen. Schlimmer noch, übernehmen einige Versionen von Windows, dass der Grafiktreiber seit einiger Zeit nicht geantwortet hat, es tötet, die künstlich die Rechenleistung begrenzt, wenn auf der GPU-Berechnung zu tun.

Es gibt keine API für eine Anwendung zu steuern, wie der Fahrer sollte das Timeout oder etwas verhalten oder eingestellt, und es gibt sicherlich keine Möglichkeit für den Fahrer zu sagen, wenn Ihr Shader beenden oder nicht wird.

Ich weiß nicht, ob diese Situation vor kurzem hat sich verbessert, aber ich würde gerne wissen.

Eine weitere häufige Version davon ist „brauchen wir keine Deadlocks in unserem multi-threaded Code zu beseitigen“. Eine perfekt angemessene Anfrage von der Management-Perspektive, sondern um Deadlocks im allgemeinen Fall zu verhindern, müssen Sie alle möglichen Verriegelungszustand analysieren, dass die Software in bekommen, das ist, keine Überraschung, das entspricht das Halteproblem.

Es gibt Wege, teilweise zu „lösen“ Deadlocks in einem komplexen System durch eine andere Schicht auf der Oberseite der Verriegelungs Auferlegung (wie einen definierten Reihenfolge von acquisition), aber diese Verfahren sind nicht immer anwendbar.


Warum dies entspricht das Halteproblem:

Stellen Sie sich vor, Sie haben zwei Schlösser, A und B, und zwei Threads, X und Y. Wenn Gewinde X A hat sperren, und will auch Schloss B, und Faden Y Sperre B und will A zu, dann haben Sie ein Deadlock .

Wenn sowohl X und Y Zugang zu beiden A und B haben, dann ist der einzige Weg, um sicherzustellen, dass Sie nie in den schlechten Zustand erhalten ist, alle möglichen Wege, um zu bestimmen, dass jeder Faden durch den Code nehmen, und die Reihenfolge, in denen sie Schlösser in all jenen Fällen, erwerben und halten. Dann legen Sie fest, ob die beiden Fäden immer mehr als eine Sperre in einer anderen Reihenfolge erwerben können.

Aber alle möglichen Pfade zu bestimmen, die jeder Faden durch den Code nehmen kann, ist (im allgemeinen Fall), der dem Halteproblem.

Perl-Testsystem unterhält einen Testzähler. Sie entweder die Anzahl der Tests setzen Sie an der Spitze des Programms laufen gehen, oder erklären Sie, dass Sie sich nicht gehen zu verfolgen. Dieser Schutz vor dem Test vorzeitig austritt, aber es gibt andere Wachen, es ist also nicht so wichtig.

Jeder einmal in eine Weile jemand versucht, ein Programm zu schreiben, die Anzahl der Tests für Sie zu zählen. Dies ist natürlich, durch eine einfache Schleife besiegt. Sie pflügen voraus ohnehin immer aufwendigere Tricks tun Schleifen zu versuchen und zu erkennen und erraten, wie viele Iterationen wird es sein und das Halteproblem zu lösen. Normalerweise erklären sie, dass es nur um „gut genug“ hat.

Hier ist ein besonders aufwendiges Beispiel.

Ich war einmal arbeite an einem Integrationsprojekt im ATM (Automated Tellern Machines) Domäne. Der Kunde wünschte mich für Transaktionen einen Bericht von meinem System zu erzeugen, die von dem Land Switch gesendet, die von meinem System nicht empfangen wurde !!

fand ich ein Berkeley Papier: Looper: Leichte Erkennung Endlosschleifen bei Runtime http://www.eecs.berkeley.edu/~jburnim/pubs /BurnimJalbertStergiouSen-ASE09.pdf

LOOPER kann nützlich sein, da die meisten Endlosschleifen triviale Fehler sind. Doch dieses Papier nicht einmal das Halteproblem erwähnen!

Was sagen sie über ihre Grenzen?

  

[LOOPER] kann in der Regel nicht über Schleifen folgern, wo Nicht-Kündigung   hängt von den Einzelheiten der Heap-Mutation in jedem Schleifendurchlauf.   Dies liegt daran, unsere symbolische Ausführung ist insofern konservativ   konkretisiert unzureichend Zeiger und unsere symbolische Argumentation   mächtig. Wir glauben, dass die Kombination unserer Techniken mit Formanalyse   und leistungsfähigeren invariant Generation und beweis wäre wertvoll   zukünftige Arbeit.

Mit anderen Worten, "das Problem in der nächsten Version behoben werden."

Von den Funktionsübersicht (Eclipse) Visual Editor :

  

Die Eclipse Visual Editor (VE) können   zu öffnen alle .java-Datei verwendet. Es dann   parst der Quellcode Java suchen   für visuelle Bohnen. ...

     

Einige visuelle Bearbeitungstools werden nur   bietet ein visuelles Modell von Code,   dass insbesondere visuelles Werkzeug selbst hat   erzeugt. Die anschließende direkte Bearbeitung   des Quellcodes kann die verhindern   visuelles Werkzeug aus der Code-Parsing und   ein Modell zu bauen.

     

Eclipse-VE, aber ... kann entweder   bearbeiten GUIs von Grund auf neu verwendet werden, oder   von Java-Dateien das gewesen   ‚Fest einprogrammiert‘ oder in einem anderen gebaut   visuelles Werkzeug. Die Quelldatei kann   entweder wird aktualisiert, um die Graphical mit   Viewer, Java Beans Baum oder Eigenschaften   Ansicht oder direkt bearbeitet werden, indem   der Quellcode-Editor.

Vielleicht mit Matisse-Stick jetzt ich soll.

Nicht verwandte, hier ist jemand fordern das Halteproblem innerhalb von Eclipse.

Um fair zu sein, VE der Domain ist recht begrenzt, und es wird wahrscheinlich nicht verrückt über heikle Dinge wie Reflexion gehen. Noch auf der Anspruch GUI aus zu bauen jeder Java-Datei scheint halt-ish.

"Wie können Sie mir versichern, Ihr Code ist 100% frei von Fehlern?"

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top