La programmation est un sujet qui fascine énormément. Si vous lisez ce cours, c’est que vous avez décidé de franchir le pas et de découvrir de quoi il s’agit. Cependant, avant de commencer à apprendre quoi que ce soit sur le C et la programmation, il est d’abord nécessaire de découvrir en quoi la programmation consiste. En effet, pour le moment, vous ne savez pas réellement ce qu’est la programmation, ce que signifie « programmer » ou encore ce qui caractérise le langage C. Ce chapitre va donc consister en une introduction au monde de la programmation, et plus particulièrement au langage C.
La programmation, qu’est-ce que c’est ?
Dans cette section, nous nous contenterons d’une présentation succincte qui est suffisante pour vous permettre de poursuivre la lecture de ce cours. Toutefois, si vous souhaitez un propos plus étayé, nous vous conseillons la lecture du cours d’introduction à la programmation présent sur ce site.
La programmation est une branche de l’informatique qui sert à créer des programmes. Tout ce que vous possédez sur votre ordinateur est un programme : votre navigateur Internet (Internet Explorer, Firefox, Opera, etc.), votre système d’exploitation (Windows, GNU/Linux, Mac OS X, etc.) qui est un regroupement de plusieurs programmes appelés logiciels, votre lecteur MP3, votre logiciel de discussion instantanée, vos jeux vidéos, etc.
Les programmes expliqués en long, en large et en travers
Un programme est une séquence d’instructions, d’ordres, donnés à l’ordinateur afin qu’il exécute des actions. Ces instructions sont généralement assez basiques. On trouve ainsi des instructions d’addition, de multiplication, ou d’autres opérations mathématiques de base, qui font que notre ordinateur est une vraie machine à calculer. D’autres instructions plus complexes peuvent exister, comme des opérations permettant de comparer des valeurs, traiter des caractères, etc.
Créer un programme, c’est tout simplement utiliser une suite d’instructions de base qui permettra de faire ce que l’on veut. Tous les programmes sont créés ainsi : votre lecteur MP3 donne des instructions à l’ordinateur pour écouter de la musique, le chat donne des instructions pour discuter avec d’autres gens sur le réseau, le système d’exploitation donne des instructions pour dire à l’ordinateur comment utiliser le matériel, etc.
Notez qu’il n’est pas possible de créer des instructions. Ces dernières sont imprimées dans les circuits de l’ordinateur ce qui fait qu’il ne peut en gérer qu’un nombre précis et qu’il ne vous est donc pas loisible d’en construire de nouvelles (sauf cas particuliers vraiment tordus).
Notre ordinateur contient un composant électronique particulier, spécialement conçu pour exécuter ces instructions : le processeur. Ce qu’il faut retenir, c’est que notre ordinateur contient un circuit, le processeur, qui permet d’effectuer de petits traitements de base qu’on appelle des instructions et qui sont la base de tout ce qu’on trouve sur un ordinateur.
Les instructions sont stockées dans notre ordinateur sous la forme de chiffres binaires (appelés bits en anglais), autrement dit sous forme de zéros ou de uns. Ainsi, nos instructions ne sont rien d’autre que des suites de zéros et de uns conservées dans notre ordinateur et que notre processeur va interpréter comme étant des ordres à exécuter. Ces suites de zéros et de uns sont difficilement compréhensibles pour nous, humains, et parler à l’ordinateur avec des zéros et des uns est très fastidieux et très long. Autant vous dire que créer des programmes de cette façon revient à se tirer une balle dans le pied.
Pour vous donner un exemple, imaginez que vous deviez communiquer avec un étranger alors que vous ne connaissez pas sa langue. Communiquer avec un ordinateur reviendrait à devoir lui donner une suite de zéros et de uns, ce dernier étant incapable de comprendre autre chose. Ce langage s’appelle le langage machine.
Une question doit certainement vous venir à l’esprit : comment communiquer avec notre processeur sans avoir à apprendre sa langue ?
L’idéal serait de parler à notre processeur en français, en anglais, etc, mais disons-le clairement : notre technologie n’est pas suffisamment évoluée et nous avons dû trouver autre chose. La solution retenue a été de créer des langages de programmation plus évolués que le langage machine, plus faciles à apprendre et de fournir le traducteur qui va avec. Il s’agit de langages assez simplifiés, souvent proches des langages naturels et dans lesquels on peut écrire nos programmes beaucoup plus simplement qu’en utilisant le langage machine. Grâce à eux, il est possible d’écrire nos programmes sous forme de texte, sans avoir à se débrouiller avec des suites de zéros et de uns totalement incompréhensibles. Il existe de nombreux langages de programmation et l’un d’entre eux est le C.
Reste que notre processeur ne comprend pas ces langages évolués et n’en connaît qu’un seul : le sien. Aussi, pour utiliser un langage de programmation, il faut disposer d’un traducteur qui fera le lien entre celui-ci et le langage machine du processeur. Ainsi, il ne vous est plus nécessaire de connaître la langue de votre processeur. En informatique, ce traducteur est appelé un compilateur.
Pour illustrer notre propos, voici un code écrit en C (que nous apprendrons à connaître).
int main(void)
{
return 0;
}
Et le même en langage machine (plus précisément pour un processeur de la famille x86–64).
01010101 01001000 10001001 11100101 01001000 11000111
11000000 00000000 00000000 00000000 00000000 11001001
11000011
Nous y gagnons tout de même au change, non ?
Le langage C
Malgré tous ces langages de programmation disponibles nous allons, dans ce tutoriel, nous concentrer sur un seul d’entre eux : le C. Avant de parler des caractéristiques de ce langage et des choix qui nous amènent à l’étudier dans ce cours, faisons un peu d’histoire.
L’histoire du C
Le langage C est né au début des années 1970 dans les laboratoires de la société AT&T aux États-Unis. Son concepteur, Dennis MacAlistair Ritchie, souhaitait améliorer un langage existant, le B, afin de lui adjoindre des nouveautés. En 1973, le C était pratiquement au point et il commença à être distribué l’année suivante. Son succès fut tel auprès des informaticiens qu’en 1989, l’ANSI, puis en 1990, l’ISO, décidèrent de le normaliser, c’est-à-dire d’établir des règles internationales et officielles pour ce langage. À l’heure actuelle, il existe quatre normes : la norme ANSI C89 ou ISO C90, la norme ISO C99, la norme ISO C11 et la norme ISO C18.
Si vous voulez en savoir plus sur l’histoire du C, lisez donc ce tutoriel.
Pourquoi apprendre le C ?
C’est une très bonne question.
Après tout, étant donné qu’il existe énormément de langages différents, il est légitime de se demander pourquoi choisir le C en particulier ? Il y a plusieurs raisons à cela.
- Sa popularité : le C fait partie des langages de programmation les plus utilisés. Dès lors, une importante communauté s’est construite autour de son usage, ce qui fait que vous trouverez en général toujours une personne pour vous aider ainsi que de nombreux cours, articles et billets à son sujet. Une autre conséquence de cette popularité est que de nombreux programmes et bibliothèques ont été écrits dans ce langage et constituent dès lors une abondante manne de codes dans laquelle vous pouvez puiser.
- Son minimalisme : le C a été construit de sorte d’être un langage simple et minimaliste, notamment dans le but de faciliter le développement de compilateurs (encore aujourd’hui, lors de l’apparition de nouvelles architectures de processeurs, le langage C est souvent le premier langage utilisable après l’Assembleur). Ce minimalisme se traduit par un nombre réduit de concepts et/ou d’abstractions permettant également de faire le tour du langage relativement rapidement.
- Ses performances : le minimalisme du C permet aux compilateurs de produire en général des exécutables performants ayant une faible empreinte mémoire (ce qui est particulièrement appréciable quand la vitesse d’exécution est cruciale et/ou la quantité de mémoire fort limitée).
- Sa portabilité : de manière générale, un programme développé en C peut fonctionner sur un grand nombre de machines différentes sans que le code ne doive être modifié, la seule condition étant de disposer d’un compilateur pour chaque type de machine visé. Or, le développement de compilateurs C étant relativement simple, il en existe un grand nombre pour une large quantité d’architectures, ce qui fait du C un langage portable (d’une machine à l’autre).
Ce ne sont que quelques raisons, mais elles sont à notre goût suffisantes pour justifier l’apprentissage de ce langage. Bien entendu, le C comporte aussi sa part de défauts. On peut citer la tolérance aux comportements dangereux qui fait que le C demande de la rigueur pour ne pas tomber dans certains « pièges », un nombre plus restreint de concepts (c’est parfois un désavantage, car on est alors obligé de recoder certains mécanismes qui existent nativement dans d’autres langages), etc. D’ailleurs, si votre but est de développer rapidement des programmes amusants, sachez que le C n’est pas adapté pour cela et que nous vous conseillons, dans ce cas, de vous tourner vers d’autres langages, comme le Python ou le Ruby.
Le C possède aussi une caractéristique qui est à la fois un avantage et un défaut : il s’agit d’un langage dit de « bas niveau ». Cela signifie qu’il permet de programmer en étant « proche de sa machine », c’est-à-dire sans trop vous cacher son fonctionnement interne. Cette propriété est à double tranchant : d’un côté elle rend l’apprentissage plus difficile et augmente le risque d’erreurs ou de comportements dangereux, mais de l’autre elle vous laisse une grande liberté d’action et vous permet d’en apprendre plus sur le fonctionnement de votre machine. Cette notion de « bas niveau » est d’ailleurs à opposer aux langages dit de « haut niveau » qui permettent de programmer en faisant abstraction d’un certain nombre de choses. Le développement est rendu plus facile et plus rapide, mais en contrepartie, beaucoup de mécanismes internes sont cachés et ne sont pas accessibles au programmeur. Ces notions de haut et de bas niveau sont néanmoins à nuancer, car elles dépendent du langage utilisé et du point de vue du programmeur (par exemple, par rapport au langage machine, le C est un langage de haut niveau).
Une petite note pour terminer : peut-être avez-vous entendu parler du C++ ? Il s’agit d’un langage de programmation qui a été inventé dans les années 1980 par Bjarne Stroustrup, un collègue de Dennis Ritchie, qui souhaitait rajouter des éléments au C. Bien qu’il fût très proche du C lors de sa création, le C++ est aujourd’hui un langage très différent du C et n’a pour ainsi dire plus de rapport avec lui (si ce n’est une certaine proximité au niveau d’une partie de sa syntaxe). Ceci est encore plus vrai en ce qui concerne la manière de programmer et de raisonner qui sont radicalement différentes.
Ne croyez toutefois pas, comme peut le laisser penser leur nom ou leur date de création, qu’il y a un langage meilleur que l’autre, ils sont simplement différents. Si d’ailleurs votre but est d’apprendre le C++, nous vous encourageons à le faire. En effet, contrairement à ce qui est souvent dit ou lu, il n’y a pas besoin de connaitre le C pour apprendre le C++. Si tel est votre souhait, sachez qu’il existe un cours C++ sur ce site.
La norme
Comme précisé plus haut, le C est un langage qui a été normalisé à trois reprises. Ces normes servent de référence à tous les programmeurs et les aident chaque fois qu’ils ont un doute ou une question en rapport avec le langage. Bien entendu, elles ne sont pas parfaites et ne répondent pas à toutes les questions, mais elles restent la référence pour tout programmeur.
Ces normes sont également indispensables pour les compilateurs. En effet, le respect de ces normes par les différents compilateurs permet qu’il n’y ait pas de différences d’interprétation d’un même code. Finalement, ces normes sont l’équivalent de nos règles d’orthographe, de grammaire et de conjugaison. Imaginez si chacun écrivait ou conjuguait à sa guise, ce serait un sacré bazar…
Dans ce cours, nous avons décidé de nous reposer sur la norme C11. Il ne s’agit pas de la dernière en date, toutefois la norme C18 n’apporte dans les faits rien de nouveaux et vise uniquement à corriger ou préciser certains points de la norme C11. Aussi, ce choix n’aura aucun impact sur votre apprentissage du C.
Pour les curieux, voici un lien vers le brouillon de cette norme. Cela signifie qu’il ne s’agit pas de la version définitive et officielle, cependant il est largement suffisant pour notre niveau et, surtout, il est gratuit (la norme officielle coûtant très cher ). Notez que celui-ci est rédigé en anglais.
Notre cible
Avant de commencer à programmer, il nous faut aussi définir ce que nous allons programmer, autrement dit le type de programme que nous allons réaliser. Il existe en effet deux grands types de programmes : les programmes graphiques et les programmes en console.
Les programmes graphiques sont les plus courants et les plus connus puisqu’il n’y a pratiquement qu’eux sous Windows ou Mac OS X par exemple. Vous en connaissez sans doute énormément tel que les lecteurs de musique, les navigateurs Internet, les logiciels de discussions instantanées, les suites bureautiques, les jeux vidéos, etc. Ce sont tous des programmes dit « graphiques » car disposant d’une interface graphique (ou GUI).

Cependant, écrire ce genre de programmes demande beaucoup de connaissances, ce qui nous manque justement pour l’instant. Aussi, nous allons devoir nous rabattre sur le deuxième type de programme : les programmes en console.
Les programmes console sont apparus en même temps que l’écran. Ils étaient très utilisés dans les années 1970/1980 (certains d’entre vous se souviennent peut-être de MS-DOS), mais ont fini par être remplacés par une interface graphique avec la sortie de Mac OS et de Windows. Cependant, ils existent toujours et redeviennent quelque peu populaires chez les personnes utilisant GNU/Linux ou *BSD.
Voici un exemple de programme en console (il s’agit de GNU Chess, un jeu d’échecs performant entièrement en ligne de commande).
White (1) : d4
1. d4
black KQkq d3
r n b q k b n r
p p p p p p p p
. . . . . . . .
. . . . . . . .
. . . P . . . .
. . . . . . . .
P P P . P P P P
R N B Q K B N R
Thinking...
white KQkq
r n b q k b . r
p p p p p p p p
. . . . . n . .
. . . . . . . .
. . . P . . . .
. . . . . . . .
P P P . P P P P
R N B Q K B N R
My move is : Nf6
White (2) :
Ce sera le type de programme que nous allons apprendre à créer. Rassurez-vous, quand vous aurez fini le cours, vous aurez les bases pour apprendre à créer des programmes graphiques.
Comme vous avez pu le constater, la programmation est un monde vaste, très vaste, et assez complexe. Comme il existe une multitude de langages de programmation, il faut bien choisir l’un d’entre eux pour commencer. Dans notre cas, il s’agit du C. Ce langage, et retenez-le bien, est à la fois puissant et complexe. Rappelez-vous bien qu’il vous faudra faire des efforts pour l’apprendre correctement.
Si vous vous sentez prêts, alors rendez-vous dans le chapitre suivant, qui vous montrera les outils utilisés par un programmeur C.