Equivalência de análise de fluxo de dados, interpretação abstrata e inferência de tipos?

9

A resposta de @ Babou a uma pergunta recente me lembra que, uma vez, acho que li um artigo sobre a equivalência (em termos de fatos que podem ser inferidos ou provados e a complexidade do tempo de execução do algoritmo de inferência) da análise de fluxo de dados , interpretação abstrata e inferência de tipo .

Em alguns sub-casos (como entre análise de fluxo de dados interprocedural sensível ao contexto e interpretação abstrata), a equivalência é relativamente óbvia para mim, mas a questão parece mais sutil para outras comparações. Por exemplo, não consigo descobrir como a inferência do tipo Hindley-Milner poderia ser usada para provar algumas das propriedades que podem ser comprovadas com a análise de fluxo de dados sensível ao fluxo.

Quais são as referências seminais discutindo as equivalências (ou diferenças) entre análise de fluxo de dados, interpretação abstrata e inferência de tipos?

Lógica Errante
fonte

Respostas:

4

A análise do fluxo de dados e a inferência de tipos são instâncias específicas da interpretação abstrata.

A análise do fluxo de dados e a interpretação abstrata parecem semelhantes, pois ambas tratam da computação de um ponto fixo. As análises de fluxo de dados geralmente têm domínios abstratos de altura finita, o que garante a finalização. Em geral, a interpretação abstrata não assume tais domínios abstratos; para lidar com domínios de altura infinita, a interpretação abstrata utiliza técnicas de alargamento e estreitamento.

Acontece que a inferência de tipo também se refere à computação de pontos de correção, embora isso esteja longe de ser óbvio. Aqui está um artigo que mostra explicitamente que os tipos são interpretações abstratas: papel . Basicamente, os tipos são vistos como uma abstração da semântica concreta do programa. No sistema de tipos Hindley-Milner, por exemplo, o domínio abstrato dos tipos é de altura infinita e computar um tipo (mais geral) usando a unificação está executando essencialmente uma operação de ampliação (muito imprecisa).

bellpeace
fonte
4

Um bom lugar para aprender sobre essas três abordagens e como o relacionamento é o livro Principles of Program Analysis, de Nielson, Nielson e Hankin.

Não acho correto dizer que análise de fluxo de dados, interpretação abstrata e inferência de tipos são a mesma coisa. Embora existam muitas semelhanças, e talvez mais do que o esperado, dado que os três se originaram em comunidades diferentes, também existem muitas diferenças.

Martin Berger
fonte
3

Eu os considero basicamente os mesmos. Eles tinham inicialmente objetivos diferentes e foram criados por diferentes facções da ciência da computação.

A análise de fluxo de dados vem da facção de engenharia do compilador, tentando falar sobre seus algoritmos de otimização e revisar os limites superiores de complexidade, etc.

A interpretação abstrata vem do campo formal e matemático da ciência da computação. Esta é uma versão ainda mais formal, com mais interesse na correção e menos na criação de compiladores reais.

A inferência de tipo vem do campo acadêmico da programação funcional, onde inicialmente era uma ferramenta para fazer coisas legais com os compiladores. Então surgiu a idéia de que um tipo pode ser muito mais do que apenas "int" ou "float", mas também outras coisas, como na análise clássica de fluxo de dados.

lambdapower
fonte