next up previous index
Next: Programmes et algorithmes Up: No Title Previous: No Title

Avant propos



Computers in the future may weigh no more than 1.5 tons.

Popular Mechanics (1949)


I am a HAL 9000 computer, production number 3. I became operational at the HAL plant in Urbana, Illinois, on January 12, 1997.

2001: A Space Odyssey (1968)


640K ought to be enough for anyone.

Bill Gates (1981)





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, analyse numérique, 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.


À une organisation hiérarchisée en chapitres, sections et sous-sections, j'ai préféré une structure linéaire en 98 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, Daniel Hirschkoff, Mathieu Jaume, Renaud Keriven, Bernard Lapeyre et Thierry Salset pour leur relecture de ce texte et leurs nombreuses corrections et suggestions. L'annexe sur Pascal et C a été rédigée par Thierry Salset, et le guide pratique Unix par Daniel Hirschkoff. L'installation des logiciels et de l'environnement de travail a été effectuée par Renaud Keriven. La traduction de ce texte, de LATEX en HTML, et son installation sur le Web ont été réalisées par Jean-Philippe Chancelier.


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


Pour cette deuxième édition, de nombreuses corrections ont été apportées à ce texte, ainsi que quelques additions : des constructions syntaxiques supplémentaires (enum, switch), les opérations bits à bits (§ 90), des indications plus détaillées sur l'allocation dynamique (ré-allocation, libération, clonage : § 73, 82, 81), la structure de liste chaînée (§ 85), la notion d'information (§ 26) et celle de code(§ 24), avec l'exemple des codes de Huffman (§ 76), et la description de la FFT classique (j'avais imaginé que la FFT modulaire était plus simple, idée qui me paraît maintenant saugrenue, § 93).

Figurent maintenant en annexe une description d'une bibliothèque graphique de base ainsi que des tableaux d'aide-mémoire pour C, le shell, Emacs et gdb, dus à Renaud Keriven. Le guide pratique a été revu et mis à jour par Thierry Salset.

<< Noisy-le-Grand >> a été remplacé par << Champs-sur-Marne >>.

Champs-sur-Marne, 11 septembre 1997



Table des matières

next up previous index
Next: Programmes et algorithmes Up: No Title Previous: No Title
R.Lalement (Cermics)