99 bouteilles de bière : la chanson qui rend fous 10 langages de programmation
Il existe un rite de passage que tout développeur subit un jour, souvent sans le savoir. On vous demande « fais un petit programme qui compte des bouteilles de bière », et soudain votre terminal se met à débiter une comptine infantile en boucle. Bienvenue dans la légende du 99 Bottles of Beer, l’exercice de programmation le plus absurde et le plus universel de l’histoire de l’informatique. Aujourd’hui, on prend le sujet à la légère : on va faire passer cette chansonnette dans 10 langages différents, juste pour rigoler (et pour voir lequel pleure en premier).
Pourquoi cette chanson hante les développeurs ?
La comptine est bête comme chou : il y a 99 bouteilles de bière sur le mur, vous en prenez une, vous la passez, il en reste 98, et on recommence jusqu’à la gueule de bois (ou jusqu’à zéro). C’est un exercice parfait pour tester une chose essentielle : la boucle. Une boucle, c’est le moment où un programme répète la même action sans que vous tapiez 99 fois la même ligne. C’est aussi le moment où chaque langage révèle sa façon bien à lui de compter jusqu’à zéro.
Bref, attachez votre ceinture, on dégaine les claviers.
Les classiques rassurants
On commence doux, avec les langages que votre grand-mère reconnaîtrait (si votre grand-mère code, respect).
Python, le langage qui lit presque comme de l’anglais :
for b in range(99, 0, -1):
print(f"{b} bottles of beer on the wall, {b} bottles of beer.")
print(f"Take one down, pass it around, {b-1} bottles of beer on the wall.")
Propre, élégant, presque trop facile. Si vous voulez en savoir plus sur ce langage tout doux, c’est par ici.
Bash, le langage du terminal qui vous regarde avec mépris si vous oubliez un espace :
for ((b=99; b>0; b--)); do
echo "$b bottles of beer on the wall, $b bottles of beer."
echo "Take one down, pass it around, $((b-1)) bottles of the wall."
done
Le Bash est ce genre d’ami qui vous aide à déplacer des fichiers à 3 heures du matin, mais qui vous punit pour une faute de frappe avec un silence glacial.
JavaScript, le langage qui a conquis le web et votre frigo connecté :
for (let b = 99; b > 0; b--) {
console.log(`${b} bottles of beer on the wall, ${b} bottles of beer.`);
console.log(`Take one down, pass it around, ${b - 1} bottles of beer on the wall.`);
}
Le JavaScript fait la même chose que Python, mais en exigeant qu’on écrive let et des accolades partout, par pur principe.
C, le grand ancien, celui qui vous fait gérer la mémoire vous-même comme un adulte responsable (spoiler : on ne l’est pas) :
#include <stdio.h>
int main() {
for (int b = 99; b > 0; b--)
printf("%d bottles of beer on the wall...\n", b);
return 0;
}
Le C est le langage des machines qui démarrent votre voiture et votre micro-ondes. Il compte les bouteilles, mais il vous rappellera froidement que c’est vous qui avez oublié de libérer la mémoire.
La team web (et ses blagues)
Le HTML n’est pas un langage de programmation, c’est une structure de page. Donc pour faire une boucle, la blague consiste à… écrire 99 balises à la main. C’est le sprint du développeur désespéré :
<div>99 bottles of beer on the wall</div>
<div>98 bottles of beer on the wall</div>
<!-- ... on recommence 97 fois, allez, courage ... -->
Quant au SQL, le langage des bases de données, il préfère demander poliment à une table de lui donner les chiffres :
SELECT CONCAT(n, ' bottles of beer on the wall')
FROM numbers
WHERE n BETWEEN 1 AND 99
ORDER BY n DESC;
Avec SQL, vos bouteilles vivent dans une base, rangées, propres, avec un index. Une jointure maladroite et vos onion rings atterrissent parmi les bières.
Les langages qui font mal
COBOL, le langage des banques et des mainframes, écrit comme une lettre administrative :
IDENTIFICATION DIVISION.
PROGRAM-ID. BEER.
PROCEDURE DIVISION.
DISPLAY "99 BOTTLES OF BEER ON THE WALL".
STOP RUN.
Le COBOL a besoin de quatre divisions pour vous dire bonjour. C’est le langage qui facture votre carte de crédit depuis 1960 et qui n’a toujours pas bu la première bouteille.
Rust, le langage moderne qui vous empêche de faire des bêtises… en vous hurlant dessus à la compilation :
fn main() {
for b in (1..=99).rev() {
println!("{} bottles of beer on the wall", b);
}
}
Le Rust garantit que vos bouteilles ne fuient jamais la mémoire. Par contre, il vous oblige à lire le message d’erreur pendant 20 minutes avant de compter jusqu’à 98.
Le côté obscur de la force
On termine avec les langages faits exprès pour que vous questionniez vos choix de vie.
Brainfuck, qui tient son nom d’une promesse :
++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.
Le Brainfuck utilise huit caractères et aucune pitié. Personne ne sait combien de bouteilles il affiche réellement, mais on applaudit le courage.
LOLCODE, le langage des chats d’Internet, parce que pourquoi pas :
IM IN YR LOOP UPPIN YR B TIL B SAEM 99
VISIBLE B " BOTTLES OF BEER ON TEH WALL"
IM OUTTA YR LOOP
Le LOLCODE transforme chaque ligne en cri de chat. « VISIBLE » affiche, « IM IN YR LOOP » démarre la boucle. C’est mignon, c’est inutile, c’est parfait pour ce qu’on fait ici.
Conclusion (et une image pour la route)
On pourrait continuer jusqu’à l’épuisement du clavier : GitHub regorge de versions absurdes, du langage des emoji à celui qui ne parle qu’en morse. La leçon sérieuse (oui, il y en a une) : peu importe le langage, une boucle reste une boucle. Seule change la façon dont le langage vous oblige à la demander.
Petit clin d’œil visuel : j’aurais adorablement inséré ici une image générée par IA représentant 99 chats en toge COBOL tenant des bouteilles de bière sur le mur d’un terminal vert phosphore — mais comme je n’ai pas d’URL réelle sous la main, je vous laisse imaginer la scène (ou la générer vous-même pour rigoler). Promis, aucune bière n’a été endommagée pendant la rédaction de cet article, seulement quelques egos de langages.
Et vous, dans quel langage comptez-vous vos bouteilles ? Le 99 Bottles of Beer attend votre version. Santé, et que vos boucles se terminent toujours.

