Насколько я понимаю, разница заключается в том, что типы владения ограничивают форму графа объектов , а субструктурные системы (например, логика разделения) управляют разрешениями на доступ к куче .
В оригинальной работе над типами собственности идея состоит в том, чтобы поддерживать инвариант владельцев в качестве доминирующих . Объект находится во власти с помощью объекта , если каждый путь от корневого набора к содержит . Так что
можно добраться только от . Таким образом, система спроектирована так, чтобы объявления классов параметризировались их владельцами, а затем этот факт дает вам производное условие фрейма для : его состояние не может измениться, если не будет вызван метод для его владельца .оdоdоdоd
Напротив, субструктурные системы, такие как линейные типы и логика разделения, полагаются на идею ресурсов . Каждый регион кучи - это ресурс, и если вы не обладаете этим ресурсом, вы не можете его коснуться. Это делает условия кадра очень легкими: они всегда выполняются.
Одним поверхностным отличием (которое, тем не менее, смущало меня долгое время) было то, что типы собственности были типами, а логика разделения - программной логикой. К счастью, хотя типы собственности были рождены в теоретико-типовой среде, люди применили эти идеи и к программной логике.
Две основные части теоретической работы, которую я знаю по этому вопросу, - это работа Кассиоса над динамическими кадрами , которую систематически использовали Баннерджи и Науманн (и их ученики) в своей работе по региональной логике .
Насколько я понимаю, их основной подход - взять логику Хоара, а затем:
- Добавьте новый тип переменных региона, который вы используете для связывания объектов и регионов.
- Добавьте систему эффектов в логику Hoare для отслеживания областей чтения и записи.
- Используйте эффекты, чтобы определить, является ли утверждение фреймовым или нет. Если это так, вы можете создать его, а если нет, то не сможете.
Каждый подход имеет свои преимущества и недостатки.
Собственность делает свойства фрейма значительно менее удобными для использования, чем в субструктурных подходах, так как вам приходится вычислять условия фрейма.
С другой стороны, алгоритмы в группах обеспечения доступности баз данных поддерживают более симпатичные индуктивные доказательства в стиле владения, поскольку вы можете отделить след от структуры указателя. В спецификации в стиле разделения естественным является дать индуктивный инвариант на остовном дереве. Но если связующее дерево, которое вычисляет алгоритм, отличается от того, которое имеет ваш инвариант, вы попадете в мир боли.
Мой общий смысл заключается в том, что разделение проще в использовании, чем владение, поскольку нам нужны свойства фрейма почти для каждой команды в императивной программе. (Дейв Науман утверждает, что региональная логика более поддается автоматизации, поскольку логика утверждений остается простым старым FOL, и поэтому вы можете использовать готовые средства проверки теорем и решатели SMT.)
РЕДАКТИРОВАТЬ: Я только что нашел следующую статью Мэтта Паркинсона и Алекса Саммерса, «Отношения между логикой разделения и неявными динамическими фреймами» , где они утверждают, что дают логику, объединяющую два метода.