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.
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 crée des programmes. Tout ce que vous possédez sur votre ordinateur est un programme : votre navigateur (Edge, Firefox, Chrome, etc.), votre lecteur MP3, votre logiciel de discussion instantanée, vos jeux vidéos et même votre système d’exploitation (Windows, GNU/Linux, Mac OS X, etc.), bien qu’il s’agisse plutôt d’un ensemble de programmes.
Qu’est-ce qu’un programme ?
Un programme est une séquence d’instructions, d’ordres, donnés à notre ordinateur afin qu’il exécute des actions. Ces instructions sont assez basiques. On trouve ainsi des instructions d’addition, de soustraction, de multiplication, ou d’autres opérations mathématiques de base, qui font que notre ordinateur est techniquement une vraie machine à calculer. D’autres instructions existent, comme des opérations permettant de comparer des valeurs ou de se rendre à un point précis du programme. Créer un programme, c’est tout simplement utiliser ces instructions basiques afin de réaliser ce que l’on veut.
Ces instructions sont exécutées par un composant précis de l’ordinateur : le processeur.
Notez qu’il n’est pas possible de créer des instructions. Ces dernières sont imprimées dans les circuits du processeur ce qui fait qu’il ne peut en gérer qu’un nombre précis et prédéfini.
Le langage machine
D’accord, mais comment fait-on pour demander au processeur d’exécuter une instruction ? Par exemple de calculer 5 + 6 ?
Vous vous en doutez, ce n’est pas aussi simple que de lui demander en français.
Le processeur ne connaît qu’un seul langage : le langage machine. De manière simplifiée, dans ce dernier chaque instruction est représentée par un code (basiquement un nombre) éventuellement suivi d’un ou plusieurs autres nombres (par exemple les opérandes d’une opération mathématique). Ainsi, dans un langage machine fictif où l’addition aurait pour code 57, additionner 5 et 6 pourrait s’écrire comme suit : « 57 5 6 ».
Le système binaire
Cependant, s’agissant d’un composant électronique, le processeur manipule et ne sait manipuler que des données binaires, c’est-à-dire composées d’un ou plusieurs chiffres binaires (appelés bits en anglais) ayant chacun deux valeurs possibles : 0 ou 1.
Dans les faits, il serait possible de construire des circuits différents, mais il est plus facile et plus fiable de se contenter de deux valeurs possibles car elles représentent la présence ou l’absence de tension électrique.
En binaire, notre exemple précédent d’instruction fictive pourrait s’écrire comme suit : « 00111001 00000101 00000110 » (nous reviendrons plus tard sur la représentation binaire, gardez juste en mémoire que c’est cette représentation qui est utilisée).
Un peu d’histoire
Originellement, la programmation se faisait directement en langage machine, au début à l’aide de cartes ou bandes perforées1, puis à l’aide de consoles.
Inutile de vous dire que la programmation à l’époque était quelque peu… fastidieuse.
L’avènement des langages de programmation
Avec l’amélioration progressive et rapide des ordinateurs, vers la fin des années 1950, il devient possible d’envisager des solutions plus efficaces. Un des problèmes était celui du stockage : il n’était pas possible de stocker un programme et de l’exécuter, il devait être fourni à la machine via un support externe, typiquement des bandes perforées.
Une fois cette contrainte disparue, d’autres approches deviennent envisageables, notamment de programmer dans un autre langage qui, lui, sera traduit en langage machine. Plus précisément, un premier programme de « traduction » est écrit en langage machine et est ensuite utilisé pour traduire un autre langage vers le langage machine. Un de ces premiers langages est l’Assembleur.
Ce dernier est très proche du langage machine, mais utilise de courts symboles pour représenter les instructions au lieu de leur code et ne nécessite pas de travailler en binaire (ce qui est déjà beaucoup !). Ainsi, notre exemple d’instruction fictive précédent pourrait s’écrire comme suit en Assembleur : « add 5, 6 ».
Toutefois, même s’il est plus simple à utiliser que le langage machine, écrire un programme en Assembleur reste (très) fastidieux. Aussi, au fur et à mesure des progrès techniques, d’autres langages ont vu le jour en vue de simplifier la programmation. Et, vous vous en doutez, l’un d’eux est le C.
- Ces bandes ou cartes étaient organisées en une suite de colonne et de ligne représentant une donnée en binaire (par exemple une instruction). Sur l’image de l’IBM Mark I, on peut voir que chaque colonne est composée de 24 lignes (24 trous potentiels si vous préférez) soit de 24 bits. La présence d’une perforation (donc d’un trou) représente un 1 et l’absence de perforation un 0. Les instructions étaient donc encodées en langage machine colonne après colonne.↩
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.
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.
Pourquoi apprendre le C ?
C’est une très bonne question.
Ne nous mentons pas d’entrée de jeu : le C est un vieux langage (il a soufflé ses 50 bougies) et il est justifié de se demander pourquoi il devrait être encore étudié ou même utilisé de nos jours. À cette question, nous voyons principalement deux réponses. Nous pourrions en citer d’autres, comme les performances du langage, mais elles ne sont pas nécessairement propres au C.
-
La première est la base de code existante. Le C a été massivement utilisé par le passé ce qui fait que de très nombreux programmes ou bibliothèques que nous utilisons et desquelles nous dépendons ont été écrites et sont toujours écrites en C. Si vous souhaitez contribuer ou étudier ces programmes ou bibliothèques, l’apprentissage du C est indispensable.
-
La seconde est le caractère « proche du langage machine » du C. Bien qu’imprécise et manquant de nuances, cette affirmation traduit le fait qu’il est globalement facile d’entrevoir à quoi ressemblera une portion de code C une fois traduit en langage machine. Cette « proximité » permet de disposer d’un important contrôle sur le comportement du programme, ce qui est crucial dans certains domaines, comme le développement de système d’exploitation ou la programmation sur des systèmes embarqués qui ont longtemps été deux chasses gardées du C.
Ces deux éléments sont à notre goût suffisant pour justifier l’apprentissage de ce langage.
La norme
Comme précisé plus haut, le C est un langage qui a été normalisé à trois reprises. Ces normes sont avant tout destinées aux développeurs de compilateurs (il s’agit du nom donné au programme chargé de traduire un code C en langage machine) et sont un peu l’équivalent de nos règles d’orthographe, de grammaire et de conjugaison. Elles fixent un cadre et des règles de sorte que tous les compilateurs utilisent la même syntaxe et qu’un même code compilé avec différents compilateurs ait le même comportement.
Toutefois, ces normes servent également de référence à tous les programmeurs et peuvent les aider chaque fois qu’ils ont un doute ou une question en rapport avec le langage. Elles ne sont pas parfaites et ne répondent pas à toutes les questions, mais elles restent la référence pour tout programmeur.
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, 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.