When Lifetimes Liberate: A Type System for Arenas with Higher-Order Reachability Tracking
He, Jia, Bao et al.
Static resource management in languages remains challenging due to tensions among control, expressiveness, and flexibility. Region-based systems [Grossman et al . 2002; Tofte et al. 2001] offer bulk deallocation via lexically scoped regions, where all allocations follow a stack discipline. However, both regions and their resources are second-class, and neither can escape its scope nor be freely returned. Ownership and linear type systems, exemplified by Rust [Clarke et al. 2013], offer non-lexical lifetimes and robust static guarantees, but rely on invariants that limit higher-order patterns and expressive sharing.
In this work, we propose a new type system that unifies these strengths. Our system treats all heap-allocated resources as first-class values, while allowing programmers to control lifetime and granularity through three allocation modes: (1) fresh allocation for individual, non-lexical references; (2) subsequent coallocation grouping resources collectively within shadow arenas; and (3) scoped allocation with lexically bounded lifetimes following stack discipline. Regardless of mode, all resources share a uniform type and have no distinction for generic abstractions, preserving the higher-order parametric nature of the language.
Obtaining static safety in higher-order languages with flexible sharing is nontrivial. We address this by extending reachability types [Wei et al. 2024] to collectively track first-class resources, and by adopting flow-insensitive deallocation reasoning for selective stack discipline. These mechanisms yield Aq<: and {A}q<: atop, both formalized and proven type safe and memory safe in Rocq.
academic
Wenn Lebenszeiten Befreien: Ein Typsystem für Arenen mit Erreichbarkeitsverfolgung höherer Ordnung
Die statische Ressourcenverwaltung in Programmiersprachen bleibt eine Herausforderung, die hauptsächlich aus der Spannung zwischen Kontrollierbarkeit, Ausdruckskraft und Flexibilität resultiert. Bereichsbasierte Systeme bieten durch lexikalisch begrenzte Bereiche Massenlöschung, doch Bereiche und ihre Ressourcen sind Bürger zweiter Klasse, die ihren Gültigkeitsbereich nicht verlassen oder frei zurückgegeben werden können. Eigentums- und lineare Typsysteme wie Rust bieten nicht-lexikalische Lebenszeiten und starke statische Garantien, doch die erforderlichen Invarianten beschränken Muster höherer Ordnung und ausdrucksstarke Teilung.
Diese Arbeit schlägt ein neues Typsystem vor, das diese Vorteile vereinigt. Das System behandelt alle Heap-Ressourcen als Werte erster Klasse und ermöglicht es Programmierern, Lebenszeiten und Granularität durch drei Allokationsmodi zu kontrollieren: (1) Frische Allokation für einzelne nicht-lexikalische Referenzen; (2) nachfolgende Co-Allokation zur kollektiven Gruppierung von Ressourcen in Schattenarenen; (3) Bereichsallokation mit lexikalischen Grenzen, die der Stack-Disziplin folgen. Unabhängig vom gewählten Modus teilen sich alle Ressourcen einen einheitlichen Typ und sind in generischen Abstraktionen nicht zu unterscheiden, wodurch die Eigenschaften der Sprache für höherordnungsparametrisierung erhalten bleiben.
Das Kernproblem dieser Forschung ist die Implementierung sicherer, flexibler und kontrollierbarer Ressourcenverwaltung in höherordnungsfunktionalen Sprachen. Traditionelle Ansätze sehen sich folgenden Dilemmata gegenüber:
Abwägung zwischen Stack- und Heap-Allokation: Stack-Werte haben strikte lexikalische Lebenszeiten, sind sicher und effizient, aber grundsätzlich Bürger zweiter Klasse; Heap-Allokation erzeugt frei zirkulierende Werte erster Klasse, opfert aber vorhersehbare Freigabekontrolle.
Einschränkungen bestehender Systeme:
Bereichsbasierte Systeme (wie MLKit, Cyclone): Bieten Massenlöschung, aber Bereiche und Ressourcen sind Bürger zweiter Klasse
Eigentumstypensysteme (wie Rust): Bieten nicht-lexikalische Lebenszeiten, beschränken aber Muster höherer Ordnung und ausdrucksstarke Teilung
Erreichbarkeitstypensysteme: Unterstützen höherordnungsfunktionen, sind aber durch Teleskopstrukturen begrenzt und können zyklische Speicherstrukturen nicht verarbeiten
Die Autoren beabsichtigen, die Vorteile verschiedener Ressourcenverwaltungsstrategien zu vereinigen: die Sicherheit der Stack-Disziplin, die Ausdruckskraft höherordnungssprachlicher Konstrukte und die Flexibilität, Ressourcen als Werte erster Klasse zu behandeln.
Einheitliche Ressourcenbehandlung: Alle Speicherressourcen sind Werte erster Klasse mit einem einzigen Referenztyp, abstrahieren Stack- und Heap-Allokation und ermöglichen es Client-Code, generisch bezüglich des spezifischen Speichermodells von Referenzen zu bleiben.
Kontrollflexibilität: Speicherressourcen können durch Benutzerkontrolle nicht-lexikalisch oder lexikalisch, individuell oder kollektiv sein, ohne Typunterscheidung.
Statische Sicherheitsgarantien: Erreichbarkeitstypverfolgung überwacht den Speicherressourcenfluss und garantiert sichere Verwendung; Benutzer können durch flussunempfindliche Schlussfolgerung selektive Stack-Disziplin auferlegen, um vorhersehbare Freigabe und Freiheit von Use-After-Free-Fehlern zu garantieren.
Ausdrucksstarke höherordnungsfunktionale Eigenschaften: Das System unterstützt höherordnungsfunktionen mit veränderlicher Teilung und zyklischen Speicherstrukturen, die über die Ausdruckskraft vorheriger Erreichbarkeitssysteme hinausgehen.
Schattenarenen sind die Schlüsselinnovation des Systems mit folgenden Eigenschaften:
Implizite Identifikation: Arenen haben keine expliziten Namen oder Konstruktoren in der Oberflächensyntax, werden durch Referenzen implizit identifiziert
Drei Allokationsformen:
val fr = new Ref(42) // Frische Allokation
val ar = new Ref(42) scoped // Bereichsallokation
val a1 = new Ref(42) at ar // Co-Allokation
Das System verwendet ein zweidimensionales Speichermodell, wobei jede Referenz durch eine Arenenlokation und einen internen Offset (ℓ, o) indiziert wird:
Erreichbarkeit wird auf Arenenlevel ℓ grobkörnig verfolgt
Alle Objekte innerhalb einer Arena teilen die gleiche Erreichbarkeitsidentifikation
Eliminiert Teleskopbeschränkungen und unterstützt beliebige interne Arenaobjektgraphen
Satz 4.1 (Fortschritt): Wenn [∅ | Σ] φ ⊢ t : Q und Σ ok,
dann ist t ein Wert oder es existieren t', σ' so dass t | σ → t' | σ'
Satz 4.2 (Erhaltung): Wenn ein typwohlgeformter Term reduziert wird,
dann existiert eine erweiterte Typumgebung, so dass das Reduktionsergebnis
immer noch typwohlgeformt ist
val makeHandler = {
val rp = new Ref() // Nicht-lexikalischer Ressourcenpool
(cb: Int => Unit) => {
val h = new Ref(cb) at rp
h // Handler zurückgeben
}
}
Zeigt, wie nicht-lexikalische Arenen zur Verwaltung von Callback-Lebenszeiten verwendet werden.
{ // Bereichsbeginn
val a = new Ref() scoped
val c1, c2, c3 = new Ref(f) at a
c1 := x => { (!c2)(x) } // Zyklus bilden
c2 := x => { (!c3)(x) }
c3 := x => { (!c1)(x) }
} // Massenlöschung {a, c1, c2, c3}
Demonstriert sichere Konstruktion und Freigabe zyklischer Referenzstrukturen.
Das Paper vereinigt erfolgreich Erreichbarkeitssysteme, arenbasierte Ressourcenverwaltung und Stack-Disziplin und bietet eine leichte und ausdrucksstarke Grundlage für sichere Ressourcenverwaltung in höherordnungssprachlichen Konstrukten.
Bedeutende theoretische Beiträge: Erste Realisierung der Schnittmenge von Stack-Disziplin, ausdrucksstarker Teilung, Ressourcen erster Klasse und Höherordnungsfunktionen in einem einheitlichen System
Herausragende technische Innovationen: Schattenarenen und grobkörnige Erreichbarkeitsverfolgung sind wichtige Innovationen
Formale Strenge: Vollständige mechanisierte Beweise erhöhen die Glaubwürdigkeit der Ergebnisse
Diese Arbeit hat bedeutende Auswirkungen auf die Theorie von Programmiersprachen und bietet eine neue theoretische Grundlage für Ressourcenverwaltung, die zukünftige Sprachdesigns beeinflussen könnte. Besonders für Systemprogrammierung, die präzise Ressourcenkontrolle erfordert, bietet diese Methode neue Möglichkeiten.