A maneira como entendo a diferença é que os tipos de propriedade restringem a forma do gráfico do objeto e os sistemas subestruturais (como a lógica de separação) gerenciam permissões para acessar o heap .
No trabalho original sobre tipos de propriedade, a idéia é manter a invariância dos proprietários como dominadores . Um objeto é dominado por um objeto , se todos os caminhos da raiz configurada para contiver . Portanto,
é acessível apenas a partir de . Portanto, o sistema é projetado para que as declarações de classe sejam parametrizadas por seus proprietários, e esse fato fornece uma condição de quadro derivada para : seu estado não pode mudar, a menos que um método em seu proprietário seja chamado.odododod
Por outro lado, sistemas subestruturais como tipos lineares e lógica de separação dependem da idéia de recursos . Cada região da pilha é um recurso e, se você não possui o recurso, não pode tocá-lo. Isso facilita muito as condições de quadro: elas sempre se mantêm.
Uma diferença superficial (que, no entanto, me confundiu por um longo tempo) foi que os tipos de propriedade eram tipos e a lógica de separação era uma lógica de programa. Felizmente, enquanto os tipos de propriedade nasceram em um cenário teórico, as pessoas também aplicaram essas idéias para programar lógicas.
As duas partes principais do trabalho teórico que conheço são o trabalho de Kassios sobre estruturas dinâmicas , que Bannerjee e Naumann (e seus alunos) exploraram sistematicamente em seu trabalho sobre lógica regional .
Pelo que entendi, a abordagem básica deles é usar a lógica Hoare e, em seguida:
- Adicione um novo tipo de variáveis de região, que você usa para associar objetos e regiões.
- Adicione um sistema de efeitos à lógica Hoare para rastrear as regiões que leem e escrevem o toque.
- Use os efeitos para determinar se uma asserção respeita ou não o quadro. Se for, você pode enquadrar e, se não, não pode.
Cada abordagem tem benefícios e fraquezas.
A propriedade torna as propriedades do quadro significativamente menos convenientes de usar do que nas abordagens subestruturais, pois é necessário calcular as condições do quadro.
Por outro lado, os algoritmos nos DAGs suportam provas indutivas mais bonitas em um estilo de propriedade, pois é possível dissociar a pegada da estrutura do ponteiro. Em uma especificação de estilo de separação, o natural é fornecer um invariante indutivo em uma árvore de abrangência. Mas se a árvore de abrangência que o algoritmo calcula for sempre diferente daquela que o seu invariante possui, você terá um mundo de mágoa.
Meu senso geral é que a separação é mais fácil de usar do que a propriedade, pois precisamos de propriedades de quadro para quase todos os comandos em um programa imperativo. (Dave Naumann argumenta que a lógica da região é mais passível de automação, uma vez que a lógica de asserção permanece simples e antiga FOL e, portanto, você pode usar provadores de teoremas prontos para uso e solucionadores de SMT).
Edição: Acabei de encontrar o seguinte artigo de Matt Parkinson e Alex Summers, A relação entre lógica de separação e quadros dinâmicos implícitos , onde eles alegam fornecer uma lógica que unifica os dois métodos.