Was ist das Ziel der abstrakten Interpretation in Programmiersprachen?

9

Ich versuche jetzt besser zu verstehen, was "abstrakte Interpretation" in Programmiersprachen ist. Ich habe ein gutes Buchkapitel gefunden, das die Idee erklärt, die Domäne um ein am wenigsten festes Element zu erweitern, die vier Axiome, die einen festen Punkt für eine stetige Funktion ergeben, und so weiter. Ich verstehe diese technischen Details (obwohl ich nicht ganz sicher bin, worauf sich "abstrakte Interpretation" in diesem ganzen Schema genau bezieht).

Ich bin mir nicht sicher, was die Verwendung abstrakter Interpretation motiviert. Identifiziert es nur Fixpunkte für berechenbare Funktionen? Kommt die Hauptmotivation von einer Rekursion in den meisten Programmiersprachen?

Würde mich auch freuen, einen Überblick auf hoher Ebene zu bekommen, der technisch tief genug für jemanden ist, der einen Abschluss in Informatik hat. Ich finde die Wikipedia-Seite ziemlich beunruhigend.

newToPL
quelle
zitiere das Buch plz. Wikipedia abstrakte Interpretation
vzn
Könnten Sie bitte erwähnen, welches Buchkapitel Sie lesen?
Vijay D
Wikipedia ist nicht immer der beste Ort für ein Tutorial zu technischeren Themen.
Vijay D
@ Vijay und vzn Das ist eine Sache, die ich mir angesehen habe: cs.berkeley.edu/~necula/cs263/handouts/AbramskiAI.pdf
newToPL

Antworten:

16

Abstrakte Interpretation ist ein sehr allgemeines Konzept und je nachdem, wen Sie fragen, erhalten Sie unterschiedliche Erklärungen, da vielseitige Konzepte mehrere Perspektiven zulassen. Die Ansicht in dieser Antwort ist meine und ich würde nicht annehmen, dass es allgemein ist.

Rechenhärte als Motivation

Beginnen wir mit Entscheidungsproblemen, deren Lösungen eine solche Struktur haben:

Entscheidungsproblem

Es gibt oft eine NP-harte Untergrenze für das Verfahren. Die Überprüfung der semantischen Eigenschaften von Programmen ist sogar unentscheidbar. Was können wir tun?

Lassen Sie uns zwei Beobachtungen machen. Erstens können wir manchmal bestimmte Problemfälle lösen, auch wenn wir das allgemeine Problem nicht lösen können. Zweitens tolerieren Anwendungen wie die Compileroptimierung eine Annäherung, da ein Compiler nützlich ist, der einige, aber nicht alle Ursachen für Ineffizienz beseitigt. Um diese Intuition zu präzisieren, müssen wir antworten:

  1. Was bedeutet es formal, einige, aber nicht alle Problemfälle zu lösen?
  2. Was ist eine ungefähre Lösung für ein Entscheidungsproblem?

Abstrakte Interpretationsidee 1: Ändern Sie die Problemstellung

Für mich besteht eine wichtige Erkenntnis der abstrakten Interpretation darin, die Problemformulierung so zu ändern, dass wir nicht nach einer Ja / Nein- Antwort, sondern nach einer Ja / Nein / Vielleicht- Antwort fragen .

ja Nein Vielleicht

Infolgedessen hat jedes Problem eine triviale, zeitkonstante Lösung (Ausgabe vielleicht ). Wir können jetzt unsere Aufmerksamkeit darauf richten, ein Verfahren abzuleiten, das nicht immer Vielleicht hervorbringt . Um zu den obigen Fragen zurückzukehren, ist eine Lösung, die für einige Probleminstanzen funktioniert, eine, die möglicherweise bei Problemen zurückgegeben wird, die nicht gelöst werden können. Darüber hinaus ist Vielleicht eine Annäherung an Ja und Nein, weil wir nicht sicher sind, wie die Antwort lautet.

Diese Idee ist nicht auf Entscheidungsprobleme beschränkt. Betrachten Sie diese Probleme in Bezug auf Programme.

  1. Welche Codezeilen im Programm sind tot (werden niemals ausgeführt)?
  2. Welche Variablen im Programm haben konstante Werte?
  3. Welche Aussagen im Programm werden verletzt?

In all diesen Situationen können wir von einer exakten zu einer ungefähren Lösung übergehen, indem wir Lösungen berücksichtigen, die einige Unsicherheiten aufweisen.

  1. Was ist eine Reihe von Codezeilen, die tot sind?
  2. Was ist eine Reihe von Variablen im Programm, die konstante Werte haben?
  3. Was ist eine Reihe von Behauptungen im Programm, die nicht verletzt werden?

Die produzierten Sets müssen nicht die größten sein. Diese Idee ist äußerst allgemein gehalten und gilt für Probleme, die wenig mit der Programmanalyse zu tun haben.

  1. mn[ein,b]]
  2. mnk
  3. Anstatt nach den befriedigenden Zuordnungen zu einer Formel zu fragen, können wir nach einem Satz fragen, der die befriedigenden Zuordnungen enthält.

Beachten Sie, dass wir das Problem nicht nur geändert, sondern auch streng verallgemeinert haben, da eine Lösung für das ursprüngliche Problem immer noch eine Lösung für das geänderte Problem ist. Die große unbeantwortete Frage lautet nun: Wie können wir eine ungefähre Lösung finden?

Abstrakte Interpretationsidee 2: Fixpunktcharakterisierung der ursprünglichen Lösungen

tsR.eeinch(s)stR.eeinch(s)

X.={s}}{w | v ist in X. und (v,w) ist eine Kante}}

nns

Die Festpunktcharakterisierung ist eine Entwurfsentscheidung. Es gibt viele verschiedene Charakterisierungen einer Reihe von Lösungen. Jeder von ihnen kann unterschiedliche Vorteile haben. Bei Programmiersprachen haben wir mehr Struktur als nur einen Graphen. Die Fixpunktgleichungen, die uns wichtig sind, können durch Induktion der Struktur des Eingabeprogramms definiert werden. Diese Idee ist nicht programmspezifisch. Wenn wir abstrakte Interpretationen auf Elemente einer strukturierten Sprache wie Grammatik, logische Formel, Programm, arithmetischen Ausdruck usw. anwenden, können wir Fixpunkte durch Induktion auf die Struktur eines syntaktischen Objekts definieren.

Mit dieser Festpunktcharakterisierung bekennen wir uns zu einer bestimmten Art der Berechnung von Lösungen. Wir werden diesen Fixpunkt nicht wirklich berechnen, da er mindestens so schwierig ist wie die Lösung des ursprünglichen Problems, was uns zum nächsten Schritt bringt.

Abstrakte Interpretationsidee 3: Fixpunktnäherung

F.L.GM.M.L.M.L.

L.M.F.G

Möglicherweise finden Sie die Intuition hinter der Fixpunktübertragung aufschlussreich. Wir können uns einen festen Punkt als die Grenze einer (möglicherweise transfiniten) Kette von Elementen vorstellen. Die Berechnung von Näherungslösungen entspricht der Annäherung an diese Grenze, die wir durch Annäherung von Elementen der Kette erreichen können.

stst

Abstrakte Interpretationsidee 4: Fixpunkt-Approximationsalgorithmen

Alles, was bisher gesehen wurde, war ein mathematisches Existenzergebnis. Der letzte Schritt besteht darin, die Näherung zu berechnen. Wenn das Näherungsgitter endlich ist (oder wenn die Bedingung der aufsteigenden / absteigenden Kette erfüllt ist), können wir ein einfaches iteratives Verfahren verwenden. Wenn das Gitter unendlich ist, reicht eine iterative Prozedur möglicherweise nicht aus, obwohl die Berechnung eines festen Punkts möglicherweise noch entscheidbar ist. In dieser Situation werden viele Techniken verwendet, um die Lösung weiter zu approximieren oder um schneller zu einer exakten Lösung zu springen als bei einem naiven Iterationsalgorithmus. Im Zusammenhang mit der Berechnung einer Lösung hören Sie Begriffe wie Erweitern , Verengen , Strategie-Iteration , Beschleunigen usw.

Zusammenfassung

Meiner Meinung nach bietet die abstrakte Interpretation eine mathematische Grundlage für den Begriff der Abstraktion, genauso wie die mathematische Logik eine mathematische Grundlage für das Denken darstellt. Die Lösungen für viele Probleme, die uns wichtig sind, werden als Fixpunkte charakterisiert. Diese Beobachtung beschränkt sich nicht nur auf Programmiersprachenprobleme und sogar auf die Informatik. Näherungslösungen können als Näherungen von Fixpunkten charakterisiert werden und werden mit speziellen Algorithmen berechnet. Diese Charakterisierungen und Algorithmen nutzen die Struktur der Probleminstanz aus. Bei Programmen ist diese Struktur durch die Syntax der Sprache gegeben.

Das Berechnen von Annäherungen an Probleme, die keine natürliche Metrik haben, ist eine Kunst, die von Praktikern ständig weiterentwickelt und verfeinert wird. Abstrakte Interpretation ist eine mathematische Theorie für die Wissenschaft hinter dieser Kunst.

Referenzen Es gibt mehrere gute Tutorials zur abstrakten Interpretation, die Sie lesen können.

  1. Eine beiläufige Einführung in die abstrakte Interpretation , Patrick Cousot (gemeinsame Arbeit mit Radhia Cousot), Workshop zu Systembiologie und Formalsmethoden (SBFM'12)
  2. Eine sanfte Einführung in die formale Verifikation von Computersystemen durch abstrakte Interpretation , Patrick und Radhia Cousot, Marktoberdorf Summer School 2010.
  3. Vorlesung 13: Abstraktion Teil I , Patrick Cousot, Abstrakte Interpretation, MIT-Kurs.
  4. Einführung in die abstrakte Interpretation , Samson Abramsky und Chris Hankin, Abstrakte Interpretation deklarativer Sprachen, 1987.
  5. Abstrakte Interpretation und Anwendung auf Logikprogramme , Patrick und Radhia Cousot, 1992. Die ersten beiden Abschnitte bieten einen allgemeinen Überblick auf hoher Ebene mit mehreren Beispielen.
Vijay D.
quelle
7

Ich stimme zu, dass es oft schwierig ist, den Hauptpunkt aus all diesen Details herauszuholen. (Tatsächlich ist mein großes Problem bei jeder Behandlung der abstrakten Interpretation, die ich gesehen habe, dass sie so viel Maschinerie darstellen, ohne sie zu motivieren.)

So denke ich darüber:

Bei der abstrakten Interpretation werden Programme ungefähr auf großen Mengen von Eingaben gleichzeitig ausgeführt.

Dies deckt nicht alles ab, hält aber im Allgemeinen gut.

Das kanonische Beispiel bewertet arithmetische Ausdrücke, um das Vorzeichen des Ergebnisses zu bestimmen. Sie können sich eine hypothetische, unendlich schnelle Maschine vorstellen, die bei jeder positiven Eingabe einen Ausdruck auswerten und die Ergebnisse zurückgeben kann. Wenn Sie eine davon hätten, könnten Sie im Prinzip Dinge wie "Dieses Programm gibt positive Zahlen zurück, wenn positive Zahlen angegeben werden" bestimmen.

Aber natürlich haben Sie diese Maschine nicht wirklich. Sie stecken im wirklichen Leben fest, also müssen Sie entweder symbolisch dasselbe tun , was manchmal genaue Antworten geben kann, aber oft fehlschlägt, oder ungefähr auf eine Weise, die immer Antworten zurückgibt, aber möglicherweise nicht genau ist. Letzteres ist das, was abstrakte Interpretation tut.

Sie können nicht einmal die Menge aller positiven Zahlen direkt darstellen. Stattdessen benötigen Sie eine Abstraktion dieser Menge. Sie müssen auch die negativen Zahlen und Null abstrahieren. Sie erhalten eine Familie endlicher abstrakter Mengen {neG,zerÖ,pÖs}}{{...,- -2,- -1}},{0}},{1,2,...}}}}

eindd::pÖs×pÖspÖs

eindd::pÖs×pÖspÖseindd(ein,b)ist positiv für jedes positive undeinbpÖs×neG(pÖszerÖneG)

Wenn Sie beweisen möchten, dass Ihre abstrakte Interpretation so eng wie möglich ist, möchten Sie eine Galois-Verbindung , um diese Korrespondenz zu formalisieren. Nur eine zu haben, stellt sicher, dass für jede gegebene konkrete Menge eine engste abstrakte Menge existiert.

IOW, was Sie als Motivation für die abstrakte Interpretation identifiziert haben, ist wirklich die Motivation für die Maschinerie, die für die abstrakte Interpretation von Turing-äquivalenten Sprachen erforderlich ist. Die eigentliche Motivation besteht darin, das Verhalten von Programmen sinnvoll zusammenzufassen, indem sie auf vielen Eingaben gleichzeitig ausgeführt werden.

Neil Toronto
quelle