De zéro à λ en C

De printf("Hello World") à votre propre langage de programmation

🧠 Qu'est-ce que l'informatique ?

« Computer science is no more about computers than astronomy is about telescopes. »

— Edsger W. Dijkstra

L'informatique n'est pas l'art de faire fonctionner un ordinateur. C'est l'art de résoudre des problèmes en concevant des algorithmes — des séquences d'instructions finies et non-ambiguës — et en les exprimant dans un langage que la machine peut exécuter.

Un ordinateur, c'est juste du sable (silicium) dopé au phosphore qui laisse passer le courant ou pas. Ce qui transforme ce caillou en outil de pensée, c'est le programme : une structure de données + un algorithme. Rien de plus, rien de moins.

💡 Le saviez-vous ? Le premier « bug » informatique était un vrai papillon coincé dans un relais du Harvard Mark II en 1947. Grace Hopper l'a collé dans le journal de bord. Depuis, on passe notre temps à chasser des insectes imaginaires. On n'a pas progressé.

Ce cours vous emmène des bases — une variable, une boucle, une fonction — jusqu'à la construction d'un langage de programmation complet avec environnements, fermetures lexicales, objets, et même un transpileur vers Python. Tout ça en C. Tout ça en partant de zéro.

« The programmer, like the poet, works only slightly removed from pure thought-stuff. He builds his castles in the air, from air, creating by exertion of the imagination. »

— Frederick P. Brooks, The Mythical Man-Month

⚡ Pourquoi le C ?

Il existe des dizaines de langages. Pourquoi commencer par le C ? Parce que le C est la langue la plus proche de la machine sans tomber dans l'assembleur. Quand vous écrivez du C, vous savez exactement ce que le processeur va faire :

🧮 Pointeurs

Vous manipulez des adresses mémoire. Pas de garbage collector qui cache la réalité. malloc et free sont vos nouveaux meilleurs amis (et pires ennemis).

📦 Structures

Vous organisez vos données comme vous voulez. Pas de classes, pas d'héritage — juste des struct et de l'imagination.

🎯 Compilation

Pas d'interpréteur, pas de JIT. Un compilateur transforme votre code en binaire. Ce qui arrive au processeur est exactement ce que vous avez écrit.

🌍 Universalité

Le C est partout : noyaux Linux, embedded, microcontrôleurs, interpréteurs Python, serveurs web, votre grille-pain (littéralement).

⚡ Témoignage : « J'ai appris le C en premier. Ensuite, tous les autres langages m'ont semblé être du C avec des fonctionnalités en plus. C'est comme apprendre à conduire sur une voiture manuelle : après, l'automatique, c'est des vacances. » — Étudiant anonyme (probablement vrai).

Connaître le C, c'est comprendre ce qui se passe sous le capot. Quand un langage « haut niveau » fait quelque chose de magique, vous savez que c'est juste un malloc bien placé, un pointeur de fonction, ou une structure astucieuse. La magie n'existe pas en informatique. Il n'y a que des couches d'abstraction.

« C is quirky, flawed, and an enormous success. While accidents of history surely helped, it evidently satisfied a need for a system implementation language efficient enough to displace assembly language. »

— Dennis Ritchie, créateur du C

🗺️ Feuille de route — ce que vous allez construire

Ce cours n'est pas une suite d'exercices déconnectés. C'est une progression continue : chaque programme est une brique qui sert au suivant. Voici ce que vous allez écrire, dans l'ordre :

Cours 1 factorielle.c Variables, boucles, fonctions
Cours 2 vm.c Machine virtuelle à pile
Cours 3 calc.c Parseur S-expression
Cours 4 template.c Templates & tables
Cours 5 let.c Évaluateur LISP complet
Cours 6 let.c + FFI Persistance, natives, prolog.lisp

Le fil rouge : à chaque étape, vous ajoutez une couche d'abstraction.

  1. factorielle.c : Vous écrivez une fonction récursive, vous mesurez le temps d'exécution, vous observez l'assembleur généré. Vous comprenez ce qu'est un programme.
  2. vm.c : Vous construisez une machine virtuelle à pile avec 23 opcodes. Vous réalisez qu'un processeur, c'est juste un gros switch bien organisé.
  3. calc.c : Vous écrivez un parseur d'expressions arithmétiques en notation LISP. Vous découvrez que lire du texte et le transformer en arbre, c'est finalement assez simple.
  4. template.c : Vous créez un mini langage de templates. Vous comprenez le principe de séparation données / code.
  5. let.c : Vous construisez un évaluateur LISP complet avec environnements chaînés, fermetures lexicales, cellules mutables, et objets par passage de messages.
  6. prolog.lisp : Vous écrivez une bibliothèque standard en LISP — map, filter, foldl — qui tourne sur votre propre interpréteur.
🎯 Objectif final : Vous êtes capable d'écrire (map (lambda (x) (* x x)) (iota 10)) et d'obtenir (0 1 4 9 16 25 36 49 64 81) — exécuté par votre propre programme C. Vous avez littéralement construit un langage. Pas mal pour un cours d'introduction.

Pourquoi du LISP dans un cours de C ?

C'est la question que tout le monde pose. La réponse est simple : parce que c'est la syntaxe la plus facile à analyser.

💡 L'idée géniale : En LISP, un programme est une S-expression — et une S-expression, c'est soit un atome (nombre, symbole), soit une liste d'expressions entre parenthèses. C'est tout. Pas de priorité des opérateurs, pas de mots-clés, pas de ambiguïté syntaxique. Un parseur LISP se écrit en une après-midi.

Comparez :

❌ Expression arithmétique « classique »

/* Combien de parenthèses ? */
/* Quelle est la priorité ? */
x = a + b * c << 2 + d && e || f;

Pour analyser ça, il faut une grammaire complexe, une table de précédence, et un soupçon de foi en l'humanité.

✅ S-expression LISP

; Pas d'ambiguïté possible
(+ a (* b c) d)

Chaque parenthèse ouvrante est une liste. Le premier élément est l'opérateur. Point final. Un parseur de 50 lignes suffit.

Le choix du LISP n'est pas un caprice pédagogique. C'est un choix d'ingénierie :

« LISP is worth learning for the profound enlightenment experience you will have when you finally get it. That experience will make you a better programmer for the rest of your days. »

— Eric Raymond, How to Become a Hacker

En d'autres termes : on n'enseigne pas le LISP pour le LISP. On l'utilise comme langage cible parce que sa simplicité syntaxique permet de se concentrer sur les vrais concepts : l'évaluation, l'environnement, la portée lexicale, la récursion.

🍺 La blague qui tue : Le LISP, c'est le langage parfait pour un cours de C. Parce qu'après avoir écrit un interpréteur LISP en C, vous comprenez enfin pourquoi on a inventé les langages haut niveau. Et vous pouvez frimer en disant « Mon compilateur, il est écrit en C, mon interpréteur, il est écrit en C, mon OS, il est écrit en C… ». Le C, c'est le socle. Le LISP, c'est la preuve que vous maîtrisez le socle.

Mais concrètement, qu'est-ce que vous allez comprendre ?

À la fin de ce cours, vous serez capable de répondre à ces questions :

Ce sont les fondations de l'informatique. Une fois que vous les avez, tous les langages et toutes les technologies deviennent plus faciles à apprendre.

🎒 Prérequis

0️⃣ Ce qu'il vous faut : Savoir allumer un ordinateur, taper au clavier, et avoir un niveau de patience supérieur à celui d'un enfant de 3 ans devant un jouet cassé. Le reste s'apprend.

Ce cours est conçu pour des débutants en programmation. Aucune connaissance préalable en C n'est requise. On part de zéro :

🎒 Mais apportez : Un éditeur de texte (VS Code, Vim, Emacs… on ne juge pas vos choix de vie). Un terminal. Une tasse de café, thé, ou boisson de votre choix. Et une certaine tolérance à la frustration — parce que segfault, ça arrive. Et ça arrive souvent.

🚀 Par où commencer ?

Le cours est organisé en 6 chapitres de slides + documentations, accompagnés de 3 séances de travaux dirigés (7 exercices chacune) qui vous guident pas à pas.

📖

Slides

Chaque cours a ses slides (visuels, humour, code) et sa version documentaire (plus détaillée, plus technique).

Voir les slides

🛠️

Travaux dirigés

3 séances de 2h, 7 exercices progressifs chacune. Du Hello World à un évaluateur LISP complet avec objets et transpileur.

TD 1 — Hello World → parseur

🔑 Le secret : Ne sautez pas les exercices. Chaque exercice est une brique du suivant. Si vous séchez, les solutions sont dans les <details>. Mais essayez d'abord. La comprendre > la copier. Et si vous copiez, au moins changez le nom des variables pour faire croire que c'est vous.