[Remarque: ce paragraphe est désormais obsolète.] Le titre de votre question contient une hypothèse injustifiée, à savoir que les langages de programmation sont "basés sur les fondements des mathématiques". Ce n'est généralement pas le cas, bien que les deux domaines aient des relations importantes. Un énoncé plus précis serait que (certains) langages de programmation ont été conçus en utilisant des techniques fondamentales. Une meilleure question à poser serait "comment les langages de programmation et les fondements des mathématiques sont-ils liés?"
Le lien le plus général est incarné dans les slogans preuves en tant que programmes , qui peuvent fonctionner de plusieurs manières. La correspondance Curry-Howard est la plus évidente. Avec elle, nous relions à la fois la théorie des types, la logique et la programmation. Mais il convient de souligner que la correspondance Curry-Howard ne fonctionne pas très bien en présence d'une récursivité générale (car chaque type devient habité), que prend en charge chaque langage de programmation à usage général.
Une manière plus subtile de faire fonctionner le slogan des preuves en tant que programmes est d'utiliser la réalisabilité . Ici aussi, nous relions les preuves et les programmes, mais maintenant la direction va des preuves aux programmes: chaque preuve donne un programme, mais pas chaque programme est nécessairement une preuve.
Le principal exemple d'un langage de programmation basé sur une fondation est Agda , qui est simplement une implémentation de la théorie des types dépendants. Cependant, Agda n'est pas un langage de programmation à usage général car il ne prend pas en charge la récursivité générale. Chaque fonction dans Agda est totale et il existe des fonctions calculables qui ne peuvent pas être implémentées dans Agda. Dans la pratique, les programmeurs ne le remarqueront pas, mais ils remarqueront qu'Agda n'autorise pas les valeurs indéfinies, par exemple les boucles infinies.
Coq n'est pas un langage de programmation mais plutôt un assistant de preuve. Cependant, il a également des capacités d'extraction qui donnent des programmes à partir de preuves. Les assistants de vérification et les langages de programmation ne doivent pas être confondus.
N'oublions pas que le prologue et d'autres langages de programmation logique s'inspirent de l'idée que le calcul est une recherche de preuve . Bien sûr, cela les relie étroitement à la logique.
Haskell est un langage de programmation à usage général basé sur la théorie des domaines . C'est-à-dire que sa sémantique est une théorie du domaine car elle doit tenir compte des fonctions partielles et de la récursivité. La communauté Haskell a développé un certain nombre de techniques inspirées de la théorie des catégories, dont les monades sont les plus connues mais ne doivent pas être confondues avec les monades . Plus généralement, les fonctionnalités de programmation avancées sont généralement traitées avec une combinaison de la théorie des domaines et de la théorie des catégories, mais ce n'est pas quelque chose que le programmeur Haskell dans la rue est compétent. La soi-disant «catégorie syntaxique» des types de Haskell est la vision d'un profane de la façon dont Haskell et la théorie des catégories se correspondent.
La théorie des ensembles (classique ou constructive) semble inspirer dans une moindre mesure les idées en langage de programmation. Bien sûr, la théorie des ensembles constructive a son lien avec la programmation par la logique constructive. Une application importante de la théorie des ensembles intuitionniste aux langages de programmation a été donnée par Alex Simpson qui l'a utilisée pour faire fonctionner la théorie du domaine synthétique. Mais ce sont des choses assez avancées, peut-être voir ces diapositives . Jean-Louis Krivine a développé une marque de réalisabilité très intéressante pour la théorie des ensembles classique. Cela semble un bon moyen de relier la théorie des ensembles classique et la programmation.
En résumé, la théorie des langages de programmation utilise des techniques fondamentales. Cela n'est pas surprenant, car nous considérons le calcul comme un concept fondamental. Mais il est trop naïf de dire que les langages de programmation sont "basés" sur certaines bases. En fait, la trichotomie des fondations "théorie des ensembles - théorie des types - théorie des catégories" n'est encore qu'une observation utile de haut niveau qui peut être mathématiquement précise de diverses manières, mais elle n'est pas nécessaire. C'est un accident historique.