Ich verstehe den Unterschied so, dass Besitzertypen die Form des Objektgraphen einschränken und unterstrukturelle Systeme (wie die Trennungslogik) Berechtigungen für den Zugriff auf den Heap verwalten .
odododod
Im Gegensatz dazu beruhen substrukturelle Systeme wie lineare Typen und Trennungslogik auf der Idee von Ressourcen . Jede Region des Heaps ist eine Ressource. Wenn Sie die Ressource nicht besitzen, können Sie sie nicht berühren. Dies macht die Rahmenbedingungen sehr einfach: Sie halten immer.
Ein oberflächlicher Unterschied (der mich dennoch lange verwirrte) war, dass Besitzertypen Typen waren und Trennungslogik eine Programmlogik. Glücklicherweise haben die Eigentümer diese Ideen, obwohl sie in einer typentheoretischen Umgebung geboren wurden, auch auf die Programmlogik angewendet.
Die beiden wichtigsten theoretischen Arbeiten, die ich dazu kenne, sind Kassios 'Arbeiten zu dynamischen Rahmen , die Bannerjee und Naumann (und ihre Schüler) in ihrer Arbeit zur regionalen Logik systematisch genutzt haben .
Nach meinem Verständnis besteht ihr grundlegender Ansatz darin, die Hoare-Logik zu übernehmen und dann:
- Fügen Sie einen neuen Typ von Regionsvariablen hinzu, mit denen Sie Objekte und Regionen zuordnen.
- Fügen Sie der Hoare-Logik ein Effektsystem hinzu, um die Lese- und Schreibvorgänge der Regionen zu verfolgen.
- Verwenden Sie die Effekte, um festzustellen, ob eine Behauptung den Frame respektiert oder nicht. Wenn ja, können Sie es einrahmen, und wenn nicht, können Sie es nicht.
Jeder Ansatz hat Vor- und Nachteile.
Durch die Eigentümerschaft sind Frame-Eigenschaften wesentlich weniger bequem zu verwenden als bei substrukturellen Ansätzen, da Sie Frame-Bedingungen berechnen müssen.
Andererseits unterstützen Algorithmen auf DAGs hübschere induktive Beweise in einem Besitzstil, da Sie den Footprint von der Zeigerstruktur entkoppeln können. In einer Spezifikation im Trennungsstil besteht die natürliche Sache darin, eine induktive Invariante auf einem Spannbaum zu erzeugen. Aber wenn der Spanning Tree, den der Algorithmus berechnet, jemals anders ist als der, den Ihre Invariante hat, werden Sie in eine Welt voller Verletzungen geraten.
Mein allgemeiner Eindruck ist, dass die Trennung einfacher zu verwenden ist als das Eigentum, da wir für fast jeden Befehl in einem imperativen Programm Rahmeneigenschaften benötigen. (Dave Naumann argumentiert, dass die Regionslogik für die Automatisierung besser geeignet ist, da die Assertionslogik einfach alte FOL bleibt und Sie daher Standard-Theoremprüfer und SMT-Löser verwenden können.)
EDIT: Ich habe gerade das folgende Papier von Matt Parkinson und Alex Summers, Die Beziehung zwischen Trennungslogik und impliziten dynamischen Frames , gefunden, in dem sie behaupten, eine Logik zu geben, die die beiden Methoden vereint.