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) ]] = t r a n s ( f) ( [[ M1]] , . . . , [[ Mn]] )
Aqui t r a n s ( 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):
- Costumava ser difícil argumentar sobre semântica operacional.
- 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:λ
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.