Up Next

Introduction

Ces notes sont issues d’un cours de programmation système que Xavier Leroy a enseigné en première année du Magistère de Mathématiques Fondamentales et Appliquées et d’Informatique de l’École Normale Supérieure en 1994. Cette première version utilisait le langage Caml-Light [1]. Didier Rémy en a fait une traduction pour le langage OCaml [2] pour un cours enseigné en Majeure d’Informatique à l’École Polytechnique de 2003 à 2006. À cette occasion, Gilles Roussel, Fabrice Le Fessant et Maxence Guesdon qui ont aidé à ce cours ont également contribué à améliorer ces notes. Cette version comporte des ajouts et quelques mises à jour: en presque une décennie certains ordres de grandeur ont décalé leur virgule d’un chiffre; aussi, la toile était seulement en train d’être tissée et l’exemple, aujourd’hui classique, du relais HTTP aurait presqu’eut un coté précurseur en 1994. Mais surtout le langage OCaml a gagné en maturité depuis et a été utilisé dans de véritables applications système, telles que Unison [16].

La tradition veut que la programmation du système Unix se fasse dans le langage C. Dans le cadre de ce cours, il a semblé plus intéressant d’utiliser un langage de plus haut niveau, Caml en l’occurrence, pour expliquer la programmation du système Unix.

La présentation Caml des appels systèmes est plus abstraite, utilisant toute la puissance de l’algèbre de types de ML pour représenter de manière claire les arguments et les résultats, au lieu de devoir tout coder en termes d’entiers et de champs de bits comme en C. En conséquence, il est plus facile d’expliquer la sémantique des appels systèmes, sans avoir à se perdre dans les détails de l’encodage des arguments et des résultats. (Voir par exemple la présentation de l’appel wait, page ??.)

De plus, OCaml apporte une plus grande sécurité de programmation que C, en particulier grâce au typage statique et à la clarté de ses constructions de base. Ces traits, qui peuvent apparaître au programmeur C chevronné comme de simples éléments de confort, se révèlent cruciaux pour les programmeurs inexpérimentés comme ceux auxquels ce cours s’adresse.

Un deuxième but de cette présentation de la programmation système en OCaml est de montrer le langage OCaml à l’œuvre dans un domaine qui sort nettement de ses applications usuelles, à savoir la démonstration automatique, la compilation, et le calcul symbolique. OCaml se tire plutôt bien de l’expérience, essentiellement grâce à son solide noyau impératif, complété ponctuellement par les autres traits plus novateurs du langage (polymorphisme, fonctions d’ordre supérieur, exceptions). Le fait que OCaml combine programmation applicative et programmation impérative, au lieu de les exclure mutuellement, rend possible l’intégration dans un même programme de calculs symboliques compliqués et d’une bonne interface avec le système.

Ces notes supposent le lecteur familier avec le système OCaml, et avec l’utilisation des commandes Unix, en particulier du shell. On se reportera à la documentation du système OCaml [2] pour toutes les questions relatives au langage, et à la section 1 du manuel Unix ou à un livre d’introduction à Unix [5, 6] pour toutes les questions relatives à l’utilisation d’Unix.

On décrit ici uniquement l’interface “programmatique” du système Unix, et non son implémentation ni son architecture interne. L’architecture interne de BSD 4.3 est décrite dans [8]; celle de System V, dans [9]. Les livres de Tanenbaum [11, 12] donnent une vue d’ensemble des architectures de systèmes et de réseaux.

Le système Objective OCaml dont la bibliothèque d’interface avec Unix présentée ici fait partie intégrante est en accès libre à l’URL http://caml.inria.fr/ocaml/.


Up Next