Le C est un langage de programmation compilé et généraliste créé par Dennis Ritchie aux Bell Labs en 1972 pour écrire le système d'exploitation Unix. Il a survécu à presque tout ce qui date de son époque, et la raison est simple : le C se situe une fine couche au-dessus de la machine. Il vous donne un accès direct à la mémoire et aux vraies capacités du processeur, tout en se lisant comme quelque chose qu'une personne a écrit.
Un demi-siècle plus tard, il reste le langage dans lequel les autres langages sont construits.
Un programme C complet
Voici la forme de tout le langage en six lignes. Appuyez sur Exécuter.
#include <stdio.h> apporte les déclarations d'entrée/sortie standard pour que printf soit connue. main est là où tout programme C démarre. printf écrit du texte, \n est un saut de ligne, et return 0 dit au système d'exploitation que le programme s'est terminé avec succès. C'est un programme complet et compilable - il n'y a aucune classe où l'envelopper ni aucun framework en dessous.
Ce qui rend le C différent
La plupart des langages modernes vous cachent la machine. Le C, délibérément, non.
- Il est compilé en code natif. Un programme C devient des instructions machine pour un processeur et s'exécute directement, sans interpréteur ni machine virtuelle intermédiaire.
- Vous gérez la mémoire vous-même. Il n'y a pas de ramasse-miettes. Vous demandez de la mémoire et vous la rendez. C'est plus de travail, et c'est aussi pourquoi les programmes C utilisent si peu de mémoire et ont une temporisation si prévisible.
- Il est petit. Le C a environ 32 mots-clés. Vous pouvez tenir tout le langage dans votre tête, ce qui n'est vrai ni du C++, ni de Java, ni de Python.
- Il n'a presque pas d'environnement d'exécution. Un programme C peut tourner sur un microcontrôleur avec quelques kilooctets de RAM et aucun système d'exploitation.
Le compromis est l'honnêteté plutôt que la sûreté. Le C vous laissera lire au-delà de la fin d'un tableau ou utiliser de la mémoire déjà libérée, et il ne vous arrêtera pas. Ces erreurs ont des noms - erreurs de segmentation, fuites de mémoire, comportement indéfini - et apprendre le C revient en grande partie à apprendre à les éviter.
Où le C s'exécute réellement
Le C n'est pas une curiosité historique. Il tourne sur l'appareil où vous lisez ceci, plusieurs fois.
- Les systèmes d'exploitation. Le noyau Linux fait environ 30 millions de lignes de C. De larges parties de Windows et du noyau d'Apple sont aussi en C.
- Les systèmes embarqués. Les microcontrôleurs des voitures, des thermostats, des dispositifs médicaux, des routeurs et des machines à laver sont massivement programmés en C. Quand toute la puce a 32 Ko de mémoire, le C est souvent la seule option réaliste.
- Les bases de données. SQLite, PostgreSQL, MySQL et Redis sont des programmes C.
- Les environnements d'exécution de langages. CPython, l'interpréteur Python de référence, est écrit en C. MRI pour Ruby, le moteur Zend de PHP et le cœur de Lua aussi. Quand Python est « trop lent », la solution est généralement une extension C.
- Les outils et bibliothèques. Git, curl, FFmpeg, OpenSSL, zlib, SQLite encore - la couche d'infrastructure de l'informatique est en C.
C'est aussi pourquoi l'interface binaire d'application du C compte : presque tous les langages peuvent appeler une fonction C. Python, Rust, Go, Java et JavaScript ont tous un moyen d'atteindre des bibliothèques C. Le C est la langue commune entre langages.
Pourquoi apprendre le C
Il y a deux réponses honnêtes, et elles visent des personnes différentes.
Si vous voulez travailler sur les systèmes - noyaux, pilotes, micrologiciel embarqué, bases de données, moteurs de jeu - le C est la langue de travail de ce domaine, et la plupart des offres d'emploi dans ces secteurs le mentionnent explicitement (souvent aux côtés du C++ ou de Rust). Il est difficile de contribuer à Linux, à PostgreSQL ou à une base de code pour microcontrôleur sans lire le C avec aisance.
Si vous voulez être meilleur dans le langage que vous utilisez déjà, le C vous enseigne ce qu'il y a dessous. Après le C, vous savez pourquoi un indice de tableau commence à zéro, ce qu'est vraiment une chaîne, pourquoi passer un gros objet par valeur coûte cher, ce que sont la pile et le tas, et ce qu'un pointeur nul pointe réellement. Ces concepts apparaissent dans tous les langages ; le C est l'endroit où ils sont visibles au lieu d'être cachés.
Ce programme fait trois lignes de C et constitue aussi une démonstration complète de ce qu'est une variable : une boîte nommée à une adresse. Dans la plupart des langages, vous ne pouvez même pas poser la question.
Le C et le C++
Le C++ a débuté en 1979 comme « C avec des classes » et est devenu l'un des plus grands langages existants : classes, templates, exceptions, surcharge d'opérateurs, la STL, les pointeurs intelligents, et une bibliothèque standard qui éclipse toute la spécification du C.
La relation en pratique :
- Le C++ a gardé la syntaxe du C, donc
if,for,while, les opérateurs, les pointeurs et les tableaux se ressemblent dans les deux. - La plupart du C bien écrit compile comme du C++, à quelques exceptions près (le C++ exige de convertir le résultat de
malloc, par exemple). - Le code C++ n'est presque jamais du C valide.
Si vous comptez apprendre les deux, commencer par le C est un vrai avantage : le C++ s'appuie directement sur le modèle mémoire du C, et les parties du C++ qui déroutent le plus - pointeurs, références, sémantique de copie, destructeurs - sont toutes des réponses à des problèmes que le C vous montre sans détour.
Le C n'est cependant pas un sous-ensemble du C++ au sens officiel. Ce sont des normes distinctes qui évoluent séparément, et le C moderne a des fonctionnalités que le C++ n'a pas (les initialiseurs désignés arrivés en C99, les pointeurs restrict, et les tableaux de taille variable).
Quel C : les versions de la norme
Le C est normalisé, et la version compte quand vous lisez du code ancien.
| Norme | Année | Bonne à connaître pour |
|---|---|---|
| C89 / C90 | 1989 | La base ancienne. Variables déclarées en tête de bloc seulement. |
| C99 | 1999 | Commentaires //, déclarations n'importe où, bool via stdbool.h, long long |
| C11 | 2011 | Fils d'exécution, atomiques, fonctions de bibliothèque plus sûres |
| C17 | 2018 | Une version correctrice de C11 - le choix par défaut courant aujourd'hui |
| C23 | 2024 | true/false/bool comme mots-clés, nullptr, littéraux binaires |
Ces docs visent C17 et signalent les fonctionnalités C99 et suivantes là où elles comptent. Les compilateurs choisissent par défaut quelque chose de moderne, mais vous pouvez être explicite :
gcc -std=c17 -Wall -Wextra hello.c -o hello
Ce que le C n'a pas
Une partie de la compréhension du C consiste à savoir ce qui manque, car presque toute question « comment fait-on... » a ici une réponse différente de celle d'un langage moderne.
- Pas de chaînes. Une chaîne C est un tableau de
charterminé par un octet nul. En concaténer deux signifie appeler une fonction et se soucier de la taille suffisante de la destination. - Pas de collections. Ni listes, ni tables associatives, ni ensembles. Vous avez des tableaux fixes et des pointeurs ; une table de hachage est quelque chose que vous écrivez ou une bibliothèque que vous liez.
- Pas d'exceptions. Les fonctions signalent l'échec en renvoyant une valeur particulière -
-1,NULLou un code d'état - et l'appelant est censé vérifier. - Pas de généricité ni de surcharge. Un nom de fonction signifie une fonction. C'est pourquoi la bibliothèque standard a
abs,labsetfabspour trois types différents. - Pas d'espaces de noms ni de modules. Toute fonction non
staticpartage un espace de noms global unique, c'est pourquoi les bibliothèques C préfixent tout (sqlite3_open,png_read_info). - Pas de ramasse-miettes. Chaque
malloca besoin d'unfreecorrespondant, et l'oublier est une fuite de mémoire.
Rien de tout cela n'est un oubli. Certains sont des mécanismes d'exécution que le C refuse de porter (un ramasse-miettes, le déroulement des exceptions, des chaînes extensibles), ce qui explique en grande partie pourquoi il tient sur une puce dotée de 2 Ko de RAM ; d'autres, comme les espaces de noms et la généricité, sont des fonctionnalités de langage simplement postérieures à la conception du C, écartées pour garder le langage petit.
Le tampon fait 32 octets parce que vous avez décidé que cela suffisait. Le C ne vérifiera pas, et cette décision résume tout le caractère du langage en une ligne.
Le C est-il difficile ?
Le C est petit mais impitoyable. Il n'y a pas beaucoup de syntaxe à mémoriser - vous pouvez lire tout le langage en une semaine. Ce qui prend du temps, c'est la discipline : suivre qui possède quel morceau de mémoire, se rappeler qu'une chaîne n'est que des octets terminés par un zéro, vérifier qu'un pointeur n'est pas nul avant de le suivre.
L'essentiel de la difficulté du C n'est pas dans ses concepts mais dans son absence de garde-fous : le compilateur ne vous sauvera pas d'une écriture hors limites ni d'un pointeur pendant, vous apprenez donc à être précis. (Les pointeurs eux-mêmes demandent un vrai effort la première fois - c'est normal, et le chapitre sur les pointeurs les aborde lentement.) Cette précision est une compétence qui se transfère à tous les langages que vous utiliserez ensuite.
Questions fréquentes
Qu'est-ce que le langage de programmation C ?
Le C est un langage de programmation compilé et généraliste créé par Dennis Ritchie aux Bell Labs en 1972. Il vous donne un contrôle direct sur la mémoire et se projette étroitement sur ce que le processeur fait réellement, c'est pourquoi les systèmes d'exploitation, les pilotes de périphériques et les bases de données y sont encore écrits.
À quoi sert le C aujourd'hui ?
Aux noyaux de systèmes d'exploitation (Linux, des parties de Windows et de macOS), au micrologiciel embarqué des voitures, des appareils électroménagers et des microcontrôleurs, aux bases de données comme SQLite et PostgreSQL, aux environnements d'exécution de langages comme CPython et Redis, et aux bibliothèques critiques en performance que d'autres langages appellent.
Le C vaut-il encore la peine d'être appris en 2026 ?
Oui, pour deux raisons. Il reste le langage des systèmes et de l'embarqué, un domaine vaste et bien rémunéré. Et il enseigne comment la mémoire, les pointeurs et la pile fonctionnent réellement - un savoir qui vous rend meilleur dans tous les autres langages, car la plupart sont implémentés en C.
Quelle est la différence entre C et C++ ?
Le C++ a commencé comme « C avec des classes » et a gardé l'essentiel de la syntaxe du C en ajoutant la programmation orientée objet, les templates, la bibliothèque standard et bien plus. Le C est bien plus petit : pas de classes, pas d'exceptions, pas de généricité. La plupart du C valide compile comme du C++, mais pas l'inverse.