next up previous index
suivant: Programmes et algorithmes monter: main précédent: main   Index


Table des matières

Avant-propos

Computers in the future may weigh no more than 1.5 tons. Popular Mechanics (1949)


There is no reason anyone would want a computer in their home.
Ken Olson, president, chairman and founder of Digital Equipment Corp. (1977)


We know that the most advanced computer in the world does not have a brain as sophisticated as that of an ant. True, we could say that of many of our relatives, but we only have to put up with them at weddings or special occasions. Woody Allen


Les informaticiens, quand ils se font linguistes, distinguent la syntaxe, la sémantique, et la pragmatique d'un langage de programmation.

La syntaxe regroupe les règles lexicales et grammaticales de formation des programmes, qui permettent de décider si un texte est un << programme syntaxiquement correct >>, ou plus simplement, est un << programme >>, ou bien s'il comporte des << erreurs de syntaxe >>. Tout débutant doit se sentir rebuté par cette forme d'écriture et sa rigidité qui ne pardonne pas la moindre faute de frappe ; la connaissance des règles syntaxiques facilitera surtout le travail du compilateur. L'idéal serait d'appliquer ces règles sans jamais devoir les apprendre, en utilisant un éditeur de texte bien configuré (c'est-à-dire Emacs) en lisant beaucoup de programmes bien écrits et en procédant par imitation.

En matière de syntaxe, un souci de non-exhaustivité a été résolument appliqué. On ne trouvera pas certaines constructions de C qui sont désormais obsolètes ; d'autres constructions, qui ne sont à la portée que de programmeurs avertis, et pour des usages spécifiques, sont hors du propos de ce cours ; enfin, quelques-unes, qui ne présentent pas plus d'intérêt -- sinon de confort -- que de difficulté, ont été écartées pour préserver la légèreté de ce cours. On trouvera cependant en annexe la grammaire complète de C et du préprocesseur, à titre de référence.

La sémantique explicite la signification des programmes : quelle est la valeur d'une expression, quel est l'effet d'une instruction. C'est ici que résident les concepts réellement importants de la programmation, qui s'appliquent également à d'autres langages : évaluation, portée des déclarations, appel de fonction, modes d'allocation, etc. Les objectifs de sûreté et d'efficacité des programmes nécessitent une connaissance précise de la sémantique : celle-ci sera donc traitée dans ce cours, de façon très informelle mais assez complète. S'il arrive que le compilateur détecte de probables << erreurs de sémantique >>, c'est plutôt en recourant à un debugger que l'on constatera un comportement inattendu qui est le symptôme de ce type d'erreurs. On n'oubliera pas que la programmation est une science expérimentale.

Formes (syntaxiques) et concepts (sémantiques) ne suffisent pas pour apprendre à programmer. La pragmatique désigne la mise en pratique de ces formes et concepts : quelle construction utiliser dans tel contexte, comment l'utiliser, etc. La pragmatique est aux langages de programmation ce que la rhétorique fut au langage parlé pendant des siècles : un ensemble de règles de l'art, de recettes, d'exemples et d'usages que reconnaissent les programmeurs. L'ambition de ce cours est de faire partager des éléments, nécessairement disparates, de cette pragmatique de C.

Il faut encore avoir quelque chose à dire, pour écrire des programmes qui ont du sens. Les programmes de ce cours satisfont un unique objectif, qui est de résoudre des problèmes, au moyen d'algorithmes. Ceux-ci sont conçus, parfois par des informaticiens, et souvent par des spécialistes de la discipline dont émane le problème posé, qui maîtrisent des techniques de résolution spécifiques (par exemple en mathématiques appliquées). Ce cours ne serait qu'une carcasse décharnée s'il n'était ponctué de ces algorithmes, qui attestent du rôle de l'informatique dans le champ technique. Le lecteur est renvoyé à d'autres cours (probabilités, calcul scientifique, recherche opérationnelle, etc) pour leur élaboration. À l'exception de quelques résultats élémentaires, les algorithmes ne feront l'objet d'aucune étude (preuve de propriétés, analyse de complexité) : ce cours n'aborde donc pas l'algorithmique.


René Lalement
Noisy-le-Grand, 16 septembre 1996


La deuxième édition avait permis d'inclure des compléments sur la syntaxe de C, l'allocation dynamique et les structures chaînées, et l'introduction de quelques notions de théorie de l'information, avec des applications à la compression.

L'édition de 1998 avait vu l'apparition d'autres applications (la notion d'automate fini, de langage et d'expression rationnelle et d'analyse lexicale (§ 91, 25, 92), les graphes de jeu et les algorithmes minimax et $\alpha \beta $ (§ 76, 77, 78)), des précisions sur la lecture et l'écriture sur fichiers, les différents modes d'accès et les flots d'octets (§ 99, 101, 102), et quelques indications sur la programmation orientée-objet (§ 103). Certaines de ces nouvelles sections provenaient de sujets de projet ou de travaux dirigés.

Cette nouvelle édition a été considérablement modifiée, puisque le langage utilisé n'est plus C, mais << Better C >>, autrement dit le sous-ensemble impératif de C++, débarrassé des vieilleries de C, et complété par l'usage de quelques unes des bibliothèques de C++, normalisées depuis août 1998. Il ne s'agit bien entendu ni d'un cours de C++, ni d'un cours de programmation à objets. L'occasion est de clarifier, simplifier et élaguer un cours de programmation impérative. Pourquoi ne pas faire le saut vers des styles de programmation supportés par des langages plus récents et plus clairs, comme CAML ou Java ? Peut-être bientôt, mais pas tout de suite. Ce cours est en effet destiné à de futurs ingénieurs ; l'apprentissage de la programmation doit s'insérer dans leur formation et non se développer comme un rameau indépendant. La diffusion d'un langage en milieu professionnel reste un critère important qui a conduit, cette année, au choix de C++.


À une organisation hiérarchisée en chapitres, sections et sous-sections, j'ai préféré une structure linéaire en 105 sections, chacune assez courte. Le lecteur aura la liberté de suivre cette ligne du début à la fin, ou bien de parcourir des chemins jalonnés qui s'entrecroisent. Voici les principaux thèmes de cheminement :


Mes remerciements à Laurent Bouaziz, Gilbert Caplain, Jean-Philippe Chancelier, Olivier Carton, Daniel Hirschkoff, Mathieu Jaume, Renaud Keriven, Bernard Lapeyre et Thierry Salset pour leur relecture de ce texte et leurs nombreuses corrections et suggestions. Le guide pratique Unix a été rédigé par Daniel Hirschkoff et Thierry Salset. L'installation des logiciels et de l'environnement de travail a été effectuée par Renaud Keriven, Tu Dien Au, Jean-Louis Boudoulec et Jean Couedic. La traduction de ce texte, de LATEX en HTML, et son installation sur le Web ont été réalisées par Jean-Philippe Chancelier.

Champs-sur-Marne, 11 août 1999


next up previous index
suivant: Programmes et algorithmes monter: main précédent: main   Index
R Lalement