Je suis content de la réponse d'Adrej, mais j'aimerais approfondir davantage.
Pour commencer, la sémantique dénotationnelle veut dire quelque chose comme "le sens de cette notation est que". Un vrai sémanticiste voudrait imaginer que les significations sont ce qui existe dans notre esprit et que les notations ne sont qu'un moyen d’exprimer ces significations. Il en découle l'exigence selon laquelle la sémantique dénotationnelle doit être compositionnelle. Si les significations sont primaires et les notations secondaires, nous n'avons pas d'autre choix que de définir les significations des plus grandes notations en tant que fonctions des significations de leurs constituants.
Si nous acceptons ce point de vue, une bonne sémantique dénotationnelle doit capturer les significations que nous supposons avoir dans notre esprit. Toute sémantique de composition ne conviendrait pas nécessairement. Si je propose une définition sémantique compositionnelle et que personne ne s'accorde pour dire que cela indique le sens qu'ils ont en tête, alors cela ne sert à rien. La sémantique des jeux est actuellement dans cette situation. C'est une définition de la composition et techniquement assez forte, mais très peu de gens s'accordent pour dire que cela a quelque chose à voir avec les significations qu'ils ont à l'esprit.
Cela dit, toute définition de la composition présente divers avantages techniques. Nous pouvons l'utiliser pour vérifier des équivalences ou d'autres propriétés par induction sur la syntaxe des termes. Nous pouvons l'utiliser pour vérifier la validité des systèmes de preuve, encore une fois par induction sur la syntaxe des termes. Nous pouvons vérifier l'exactitude des compilateurs ou des techniques d'analyse de programme (qui, de par leur nature, sont définies par induction sur la syntaxe). Une définition sémantique totalement abstraite présente des avantages encore plus techniques. Vous pouvez l'utiliser pour montrer que deux programmes ne sont pas équivalents, ce que vous ne pouvez pas faire avec une sémantique de composition arbitraire. Une définition sémantique entièrement définissable est encore meilleure. Ici, les domaines sémantiques ont exactement ce que vous pouvez exprimer dans le langage de programmation (avec quelques réserves). Vous pouvez donc énumérer les valeurs dans les domaines pour voir quelles sont les valeurs, ce qui serait difficile à faire avec les notations syntaxiques. Sur tous ces terrains, la sémantique des jeux marque des points.
Cependant, les définitions sémantiques compositionnelles ont perdu leur avantage au fil des ans. Robin Milner et Andy Pitts ont mis au point un certain nombre de techniques de " raisonnement opérationnel ", qui fonctionnent uniquement sur la syntaxe, mais utilisent la sémantique opérationnelle chaque fois que cela est nécessaire pour parler du comportement. Ces techniques de raisonnement opérationnel sont peu techniques. Pas de mathématiques sophistiquées. Pas d'objets infinis. Nous pouvons leur apprendre aux étudiants de premier cycle et n'importe qui peut les utiliser. Ainsi, beaucoup de gens se demandent pourquoi nous avons besoin de la sémantique dénotationnelle. (Martin Berger est probablement dans ce camp.)
Personnellement, je n'ai aucun problème à avoir beaucoup d'outils dans ma boîte à outils. Les techniques de dénotation peuvent donner de meilleurs résultats pour certains problèmes et les techniques opérationnelles pour d'autres. Les chercheurs qui développent la théorie pourraient être mieux adaptés à l'une ou l'autre approche. Assez souvent, nous pouvons développer les connaissances dans une approche et transférer ces informations dans une autre approche. (Une grande partie du travail d’Andy Pitts est de ce type. La paramétrie relationnelle s’est développée dans un contexte dénotationnel, mais il est capable de trouver un moyen de le reformuler en tant que raisonnement opérationnel. Quand je le regarde, je dis pensait que cela serait possible. "La logique de séparation va également dans ce sens. Steve Brookes a donné une preuve de fiabilité de 60 pages pour la logique de séparation simultanée en utilisant une sémantique dénotationnelle.
Les approches opérationnelles se démarquent également lorsque les langages de programmation deviennent très sophistiqués, avec toutes sortes de types à ordre élevé en boucle. Nous ne savons peut-être pas comment modéliser de telles choses mathématiquement. Ou bien, les modèles mathématiques standard pourraient s’avérer incohérents sous l’effet du rebondissement. (Par exemple, voir "Le polymorphisme n’est pas une théorie des ensembles" de Reynolds.) Des approches opérationnelles qui fonctionnent uniquement sur la syntaxe peuvent parfaitement contourner tous ces problèmes mathématiques.
Une autre approche intermédiaire entre les approches opérationnelles et dénotatives est la réalisabilité . Au lieu de travailler avec des termes syntaxiques comme dans les approches opérationnelles, nous allons en partie dénotationnel en utilisant une autre forme de représentants mathématiques. Ces représentants ne sont peut-être pas qualifiés de "significations" dénotatives réelles, mais ils seraient au moins un peu plus abstraits que les termes syntaxiques. Par exemple, pour le calcul lambda polymorphe, nous pouvons d’abord donner une signification aux termes non typés (dans un modèle du calcul lambda non typé), puis les utiliser comme représentants ("réalisateurs") pour effectuer une forme de "raisonnement opérationnel" légèrement niveau plus abstrait.
Alors, faisons en sorte que la concurrence entre les approches dénotationnelle, opérationnelle et de réalisabilité soit saine. Il n'y a pas de mal.
D'autre part, il pourrait également y avoir une concurrence "malsaine" entre les différentes approches. Les personnes qui utilisent une approche peuvent être si intimement liées qu’elles ne voient peut-être pas l’intérêt des autres approches. Idéalement, nous devrions tous être conscients des forces et des faiblesses des différentes approches et développer une attitude scientifique à leur égard, même si elles ne sont pas nos préférées.