“doc” (Col. : Science Sup 17x24) — 2007/7/19 — 18:18 — page 36 — #46
i
i
i
i
i
i
i
i
36
2
• La programmation déclarative
l’exactitude et la complexité mais assez abstraite pour éviter les détails encombrants
et sans pertinence. Nous donnons d’abord une sémantique informelle pour chaque
nouvelle construction de langage avant de donner la sémantique formelle. Nous raisonnons souvent de manière informelle sur les programmes. Ces raisonnements sont
toujours basés sur la sémantique opérationnelle.
Les abstractions linguistiques
Les langages de programmation et les langages naturels peuvent tous les deux évoluer
pour satisfaire aux besoins. Quand nous utilisons un langage de programmation, nous
pouvons à un moment donné sentir le besoin d’étendre le langage avec une nouvelle
construction linguistique. Par exemple, le modèle déclaratif de ce chapitre n’a pas de
constructions pour faire des boucles. Néanmoins, on peut définir une construction for
pour exprimer certaines formes de boucles qui sont utiles pour les programmes déclaratifs [97, 35]. La nouvelle construction est à la fois une abstraction et une addition à
la syntaxe du langage. Nous l’appelons donc une abstraction linguistique. Chaque
langage de programmation pratique contient beaucoup d’abstractions linguistiques.
Une abstraction linguistique se définit en deux phases. D’abord, la syntaxe de
la nouvelle construction grammaticale. Ensuite, sa traduction en langage noyau. Le
langage noyau ne change pas. Nous donnons beaucoup d’exemples d’abstractions linguistiques utiles, comme les fonctions (fun), les boucles (for), les classes (class),
les composants logiciels (functor) et d’autres.
2 Certaines abstractions font partie du
système Mozart. D’autres peuvent être ajoutées à Mozart avec l’outil gump qui est un
parseur-générateur [52]. Pour l’utilisation de cet outil nous vous invitons à consulter
la documentation de Mozart [69].
Il y a des langages dans lesquels on peut programmer les abstractions linguistiques
directement dans le langage. Un exemple simple mais puissant est le langage Lisp
avec ses macros. Une macro Lisp ressemble à une fonction qui génère du code Lisp
quand elle est exécutée. Les macros ont eu beaucoup de succès dans Lisp et ses
successeurs, en partie à cause de la syntaxe simple de Lisp. Lisp soutient les macros
avec des opérations comme le « quote » (guillemet simple) (convertir une expression
en une structure de données) et « backquote » (guillemet arrière) (inclure une structure
de données dans une expression « quotée »). Pour une présentation détaillée des
macros Lisp et les idées associées, veuillez consulter un des nombreux bons livres sur
Lisp [30, 87].
2. Dans [97] il y a en particulier les fonctions paresseuses (fun lazy), les verrous ré-entrants
(lock), les boîtes à messages (receive), les portes logiques (gate), les compréhensions de
liste et la curryfication (« currying », d’après le logicien Haskell B. Curry) comme dans les langages
fonctionnels modernes tels que Haskell.
i
i
i
i
i
i
i
i
36
2
• La programmation déclarative
l’exactitude et la complexité mais assez abstraite pour éviter les détails encombrants
et sans pertinence. Nous donnons d’abord une sémantique informelle pour chaque
nouvelle construction de langage avant de donner la sémantique formelle. Nous raisonnons souvent de manière informelle sur les programmes. Ces raisonnements sont
toujours basés sur la sémantique opérationnelle.
Les abstractions linguistiques
Les langages de programmation et les langages naturels peuvent tous les deux évoluer
pour satisfaire aux besoins. Quand nous utilisons un langage de programmation, nous
pouvons à un moment donné sentir le besoin d’étendre le langage avec une nouvelle
construction linguistique. Par exemple, le modèle déclaratif de ce chapitre n’a pas de
constructions pour faire des boucles. Néanmoins, on peut définir une construction for
pour exprimer certaines formes de boucles qui sont utiles pour les programmes déclaratifs [97, 35]. La nouvelle construction est à la fois une abstraction et une addition à
la syntaxe du langage. Nous l’appelons donc une abstraction linguistique. Chaque
langage de programmation pratique contient beaucoup d’abstractions linguistiques.
Une abstraction linguistique se définit en deux phases. D’abord, la syntaxe de
la nouvelle construction grammaticale. Ensuite, sa traduction en langage noyau. Le
langage noyau ne change pas. Nous donnons beaucoup d’exemples d’abstractions linguistiques utiles, comme les fonctions (fun), les boucles (for), les classes (class),
les composants logiciels (functor) et d’autres.
2 Certaines abstractions font partie du
système Mozart. D’autres peuvent être ajoutées à Mozart avec l’outil gump qui est un
parseur-générateur [52]. Pour l’utilisation de cet outil nous vous invitons à consulter
la documentation de Mozart [69].
Il y a des langages dans lesquels on peut programmer les abstractions linguistiques
directement dans le langage. Un exemple simple mais puissant est le langage Lisp
avec ses macros. Une macro Lisp ressemble à une fonction qui génère du code Lisp
quand elle est exécutée. Les macros ont eu beaucoup de succès dans Lisp et ses
successeurs, en partie à cause de la syntaxe simple de Lisp. Lisp soutient les macros
avec des opérations comme le « quote » (guillemet simple) (convertir une expression
en une structure de données) et « backquote » (guillemet arrière) (inclure une structure
de données dans une expression « quotée »). Pour une présentation détaillée des
macros Lisp et les idées associées, veuillez consulter un des nombreux bons livres sur
Lisp [30, 87].
2. Dans [97] il y a en particulier les fonctions paresseuses (fun lazy), les verrous ré-entrants
(lock), les boîtes à messages (receive), les portes logiques (gate), les compréhensions de
liste et la curryfication (« currying », d’après le logicien Haskell B. Curry) comme dans les langages
fonctionnels modernes tels que Haskell.
