Que perguntas a semântica denotacional responde que a semântica operacional não pode?

14

Eu estou familiarizado com a semântica operacional (passo a passo e passo a passo) para definir linguagens de programação. Também estou interessado em aprender semântica denotacional, mas não sei se valerá a pena. Estarei aprendendo o mesmo material de um ponto de vista diferente, ou há idéias que só posso obter com a compreensão da semântica denotacional?

Gardenhead
fonte

Respostas:

11

Não há um acordo real sobre o que caracteriza a semântica denotacional (consulte também este artigo), exceto que deve ser de composição . Isso significa que se é a função semântica, mapeando os programas para seu significado, algo como o seguinte deve ser o caso de todos os n construtores de programas f e todos os programas M_1 , ..., M_n (assumindo implicitamente a boa digitação):n f M 1 M n[[]]nfM1Mn

[[f(M1,...,Mn)]]=trumans(f)([[M1]],...,[[Mn]])

Aqui trumans(f) é o construtor correspondente a f no domínio semântico. A composicionalidade é semelhante ao conceito de homomorfismo na álgebra.

A semântica operacional não é composicional nesse sentido. Historicamente, a semântica denotacional foi desenvolvida em parte porque a semântica operacional não era composicional. Seguindo a semântica denotacional teórica da ordem da teoria de ordem de λ -calculus, a maioria das semânticas denotacionais costumava ser teórica da ordem. Eu imagino que - além do puro interesse intelectual - a semântica denotacional foi inventada principalmente porque na época (1960):

  1. Costumava ser difícil argumentar sobre semântica operacional.
  2. Costumava ser difícil dar semântica axiomática a linguagens não triviais.

Parte do problema era que a noção de igualdade de programas não era tão bem compreendida como é agora. Eu argumentaria que ambos os problemas foram melhorados em um grau substancial (1), por exemplo, por técnicas baseadas em bisimilação provenientes da teoria de processos (que podem ser vistas como uma forma específica de semântica operacional) ou, por exemplo, Pitts trabalha com semântica e programa operacionais equivalência e (2) pelo desenvolvimento de, por exemplo, lógica de separação ou lógica Hoare derivada como versões digitadas da lógica Hennessy-Milner via incorporação de linguagem de programação em π-cálculo calculado. Observe que as lógicas do programa (= semântica axiomática) também são composicionais.

Outra maneira de olhar para a semântica denotacional é que existem muitas linguagens de programação e todas elas são parecidas, então talvez possamos encontrar uma meta-linguagem simples, porém universal, e mapear todas as linguagens de programação de maneira composicional para essa meta- língua. Nos anos 60, pensava-se que algum -calculus digitado é essa meta-linguagem. Uma imagem pode ter mais de 1000 palavras:λ

insira a descrição da imagem aqui

Qual é a vantagem dessa abordagem? Talvez faça sentido olhar para um ponto de vista econômico. Se queremos provar algo interessante sobre uma classe de programa de objetos, temos duas opções.

  • Prove diretamente no nível do objeto.

  • Prove que a tradução para o meta-nível (e vice-versa) 'preserva' a propriedade e, em seguida, prove para o meta-nível e, em seguida, empurre o resultado de volta ao nível do objeto.

O custo combinado do último é provavelmente mais alto que o custo do primeiro, mas o custo de provar a tradução pode ser amortizado em todos os usos futuros, enquanto o custo de provar a propriedade para o meta-nível é muito menor que o da prova no nível do objeto.

Até agora, a abordagem original da teoria da ordem à semântica denotacional cumpriu essa promessa, porque recursos complicados de linguagem, como orientação a objetos, concorrência e computação distribuída, ainda não receberam uma semântica precisa da teoria da ordem. Por "preciso", quero dizer semântica que corresponde à semântica operacional natural de tais linguagens.


Vale a pena aprender semântica denotacional? Se você quer dizer abordagens teóricas da ordem para semântica denotacional, provavelmente não, a menos que queira trabalhar na teoria das linguagens de programação e precisar entender artigos mais antigos. Outro motivo para aprender abordagens teóricas da ordem à semântica denotacional é a beleza dessa abordagem.

Martin Berger
fonte
4

Escreverei para o único para que (e se não existir) e para o semântica denotacional de . Observe que, se você definir as duas semânticas corretamente, provavelmente terá . Escreverei para significar ou .O(p,σ)σp,σσD(p)pO(p,σ)=D(p)(σ)S(p)σO(p,σ)D(p)

Agora pegue um compilador . Dizer que é um compilador significa que ele preserva a semântica, ou seja, . Se você tentasse provar isso usando a semântica operacional, teria que provar que, para qualquer e para qualquer , . Para provar isso usando semântica denotacional, você só precisa provar que, para qualquer , . Não ter que quantificar on geralmente economiza muito trabalho.C:XXS(C(p))=S(p)pσO(C(p),σ)=O(p,σ)pD(C(p))=D(p)σ

Exemplo bobo:

C(p)= substitui tudo por .(q;q)(skEup;q;skEup;q;skEup)

Na semântica denotacional, você fará uma prova por indução em e obterá facilmente que é um compilador. Na semântica operacional, você terá que levar suas derivações e plugar pedaços de derivações em todos os lugares para dar conta das falhas e será um pesadelo.pC

xavierm02
fonte