Managing stateful resources safely and expressively is a longstanding challenge in programming languages, especially in the presence of aliasing. While scope-based constructs such as Java's synchronized blocks offer ease of reasoning, they restrict expressiveness and parallelism. Conversely, imperative, flow-sensitive management enables fine-grained control but demands sophisticated typestate analyses and often burdens programmers with explicit state tracking.
In this work, we present a novel approach that unifies the strengths of both paradigms by extending flow-insensitive capability mechanisms into flow-sensitive typestate tracking. Our system decouples capability lifetimes from lexical scopes, allowing functions to provide, revoke, and return capabilities in a flow-sensitive manner, based on the existing mechanisms explored for the safety and ergonomics of scoped capability programming.
We implement our approach as an extension to the Scala 3 compiler, leveraging path-dependent types and implicit resolution to enable concise, statically safe, and expressive typestate programming. Our prototype generically supports a wide range of stateful patterns, including file operations, advanced locking protocols, DOM construction, and session types. This work demonstrates that expressive and safe typestate management can be achieved with minimal extensions to existing capability-based languages, paving the way for more robust and ergonomic stateful programming.
تقترح هذه الورقة طريقة جديدة لتحقيق تتبع نوع الحالة (typestate) من خلال القدرات القابلة للإلغاء (revocable capabilities). توحد هذه الطريقة بين الأمان القائم على النطاق والقوة التعبيرية لإدارة الحساسية تجاه التدفق الإلزامي، وتعالج التحدي طويل الأمد في إدارة موارد الحالة بتوسيع آلية القدرات غير الحساسة للتدفق إلى تتبع نوع الحالة الحساس للتدفق. يفصل النظام دورة حياة القدرات عن النطاق المعجمي، مما يسمح للدوال بتوفير وإلغاء وإرجاع القدرات بطريقة حساسة للتدفق. طبق المؤلفون هذه الطريقة في مترجم Scala 3، مستفيدين من الأنواع المعتمدة على المسار والحل الضمني لتحقيق برمجة نوع حالة موجزة وآمنة بشكل ثابت وغنية بالتعبير.
المهمة الأساسية التي تعالجها هذه الورقة هي: توفير آلية إدارة موارد الحالة الآمنة والغنية بالتعبير في لغات دوال عالية الترتيب مع وجود أسماء مستعارة، بحيث يتمكن المبرمجون من:
val f = newFile("a.txt")
val fOpen = open(f)
write(fOpen, "Hello")
val fClosed = close(fOpen)
// write(fOpen, "World") // خطأ في الترجمة: استخدام قدرة ملغاة
تستشهد الورقة بأعمال ذات صلة غنية، تشمل بشكل أساسي:
أساس نوع الحالة: Strom و Yemini (1986) - العمل الأساسي لمفهوم نوع الحالة
أنظمة القدرات: Dennis و Horn (1966)، Miller و Shapiro (2003) - الأساس النظري لمفهوم القدرات
أنواع القابلية للوصول: Bao وآخرون (2021)، Wei وآخرون (2024) - الأساس النظري المباشر لهذا العمل
نظام نوع Scala: Amin وآخرون (2016) - حساب DOT والأنواع المعتمدة على المسار
أنواع الجلسات: Honda (1993)، Takeuchi وآخرون (1994) - الأساس النظري لأنواع الجلسات
تقدم هذه الورقة مساهمة مهمة في الجمع بين نظرية لغات البرمجة والممارسة، وحل مشكلة إدارة نوع الحالة طويلة الأمد من خلال الجمع الماهر بين التقنيات. على الرغم من أن هناك مجالاً لتحسين بعض التفاصيل النظرية، فإن ابتكارها وعمليتها تجعلها تقدماً مهماً في هذا المجال.