# Introduction
Chers étudiants,
Bienvenue dans ce premier chapitre dédié à l'un des langages de programmation les plus fondamentaux et influents de l'histoire de l'informatique : le **langage C**. Si vous avez déjà exploré les bases de l'algorithmique, probablement à travers des langages de plus haut niveau comme Python, vous êtes sur le point de plonger dans un univers où la machine est plus proche, où le contrôle est plus fin, et où la compréhension des mécanismes sous-jacents devient essentielle.
Le C est la pierre angulaire de nombreux systèmes d'exploitation, de logiciels embarqués, de pilotes de périphériques, et même de certains des langages que vous utilisez aujourd'hui. Sa maîtrise est une compétence précieuse pour tout ingénieur, car elle forge une compréhension profonde de l'architecture des ordinateurs et des compromis de performance.
Dans ce chapitre, nous allons :
* Revenir sur l'**histoire** et le contexte de création du langage C.
* Aborder sa **normalisation**.
* Mettre en lumière les **différences clés** entre le C et un langage comme Python.
* <mark style="background: #FFB86CA6;">Décortiquer la **chaîne de compilation**, un processus fondamental pour transformer votre code source en un programme exécutable</mark>.
Préparez-vous à une immersion dans la programmation "à la dure" !
---
# 1. Historique du langage C
Le langage C n'est pas né dans un vide technologique, mais comme une réponse directe à des besoins concrets de développement système. Son histoire est intimement liée à celle d'un système d'exploitation légendaire : UNIX.
## 1.1. Les origines : UNIX et les Laboratoires Bell
Au début des années 1970, les **Laboratoires Bell** (Bell Labs) d'AT&T étaient un foyer d'innovation. Une équipe de chercheurs, dont **Ken Thompson**, travaillait sur le développement d'un nouveau système d'exploitation multitâche et multi-utilisateur, initialement nommé UNICS (Uniplexed Information and Computing Service), qui deviendra plus tard **UNIX**.
UNIX a d'abord été écrit en langage assembleur, ce qui rendait son portage vers d'autres architectures matérielles extrêmement difficile. Ken Thompson a alors créé un langage de programmation appelé **B**, inspiré du BCPL (Basic Combined Programming Language), pour tenter de réécrire UNIX de manière plus portable. Cependant, le langage B avait ses propres limitations, notamment l'absence de typage des données, ce qui pouvait mener à des erreurs subtiles et difficiles à déboguer.
## 1.2. L'émergence du C
C'est là qu'intervient **Dennis Ritchie**. Également chercheur aux Laboratoires Bell, il a repris et amélioré le langage B, en y ajoutant des concepts cruciaux comme le typage des données et la structure des données. Ce nouveau langage, qu'il nomma logiquement **C** (car il venait après B), a été conçu pour être à la fois efficace, proche du matériel (permettant un contrôle de bas niveau) et suffisamment abstrait pour faciliter la portabilité du code.
> [!definition] Dennis Ritchie (1941-2011)
> Informaticien américain, souvent considéré comme le "père du langage C". Il a également joué un rôle clé dans le développement du système d'exploitation UNIX. Son travail a profondément influencé l'informatique moderne.
La majeure partie du noyau d'UNIX a été réécrite en C entre 1972 et 1973. Ce fut une réalisation majeure, démontrant la puissance et la flexibilité du C pour le développement de systèmes d'exploitation. La capacité de réécrire un OS en un langage de haut niveau (par rapport à l'assembleur) était révolutionnaire et a ouvert la voie à une nouvelle ère de développement logiciel portable.
## 1.3. L'héritage du C
Le succès d'UNIX et sa diffusion dans les universités ont propulsé le C au rang de langage de référence. Il est rapidement devenu le langage de choix pour le développement de systèmes, d'applications embarquées, de jeux vidéo et de nombreuses bibliothèques logicielles.
> [!note] L'influence du C
> De nombreux langages modernes, tels que C++, Java, C#, PHP, JavaScript et Go, ont été fortement influencés par la syntaxe et les concepts du C. Apprendre le C, c'est donc aussi comprendre les racines de nombreux autres langages.
Le C est réputé pour :
* **Sa performance** : Il permet d'écrire du code très optimisé, proche des performances de l'assembleur.
* **Son contrôle** : Il offre un accès direct à la mémoire via les pointeurs (nous y reviendrons !), permettant une gestion fine des ressources.
* **Sa portabilité** : Bien que proche du matériel, son code source peut être compilé sur une grande variété de plateformes, à condition de respecter les standards.
---
# 2. Normalisation du langage C
Avec la popularité croissante du C, différents compilateurs et implémentations ont vu le jour, parfois avec des extensions propriétaires ou des interprétations légèrement différentes du langage. Cette divergence menaçait la portabilité du code, l'une des forces initiales du C. Pour remédier à cela, un processus de normalisation a été initié.
### 2.1. Pourquoi une normalisation ?
> [!note] L'importance des normes
> La normalisation d'un langage de programmation vise à garantir que le code source écrit selon la norme se comporte de manière prévisible et identique, quel que soit le compilateur utilisé ou la plateforme cible. Elle assure la **portabilité** et la **maintenabilité** du code.
Sans norme, un programme C écrit pour un compilateur donné pourrait ne pas compiler ou se comporter différemment avec un autre compilateur. Cela rendrait le partage de code et le développement collaboratif extrêmement complexes.
### 2.2. Les principales normes du C
Par la suite, Brian Kernighan aida à populariser le langage C. Il procéda aussi à quelques modifications de dernière minute.
En 1978, **Brian Kernighan** qui avait aussi participé à la création du langage C publia avec Ritchie [The C Programming Language](https://www.cs.sfu.ca/~ashriram/Courses/CS295/assets/books/C_Book_2nd.pdf). Cet ouvrage de référence définit le C traditionnel ou C K&R.
La première normalisation, initiée par l'American National Standards Institute (ANSI) en 1983 aboutit en 1989 sous le nom de ANSI C ou C89, puis est adopté par l'Organisation internationale de normalisation en 1990 sous l'appellation C90.
Suivront plusieurs normes reprenant les deux derniers chiffres de l'année (C99, C11, ..., C23).
---
## 3. Différences fondamentales entre C et Python
Vous avez probablement déjà une expérience avec Python, un langage de haut niveau, interprété et très flexible. Aborder le C après Python est une excellente manière de comprendre les compromis et les philosophies de conception des langages de programmation. Les différences sont profondes et impactent directement la manière de penser et d'écrire le code.
### 3.1. Une question de niveau d'abstraction
> [!definition] Niveau d'abstraction
> Le **niveau d'abstraction** d'un langage de programmation désigne à quel point il est éloigné du matériel informatique et proche du langage humain.
> * Les langages de **bas niveau** (comme l'assembleur ou le C) offrent un contrôle fin sur la machine mais demandent plus de détails.
> * Les langages de **haut niveau** (comme Python) abstraient de nombreux détails matériels, rendant la programmation plus rapide et plus simple, mais avec moins de contrôle direct.
Le C est un langage de plus bas niveau que Python. Cela signifie qu'il vous donne un contrôle beaucoup plus direct sur la mémoire et les ressources du système. Cette puissance s'accompagne d'une plus grande responsabilité.
### 3.2. Tableau comparatif
Voici un tableau synthétisant les différences majeures entre C et Python :
| Caractéristique | Langage C | Langage Python |
| :-------------------------- | :------------------------------------------------- | :------------------------------------------------- |
| **Typage** | Statique et fort | Dynamique et fort |
| **Gestion mémoire** | Manuelle (via `malloc`, `free`, pointeurs) | Automatique (collecteur de garbage) |
| **Niveau d'abstraction** | Bas à intermédiaire | Élevé |
| **Exécution** | Compilé en code machine exécutable | Interprété (code bytecode exécuté par une VM) |
| **Performance** | Généralement très élevée | Généralement plus faible (mais très optimisable) |
| **Paradigme** | Principalement procédural | Multi-paradigme (orienté objet, fonctionnel, procédural) |
| **Syntaxe** | Utilise des accolades `{}` et des points-virgules `;` | Utilise l'indentation pour les blocs de code |
| **Déclaration de variables**| Obligatoire (ex: `int x;`) | Non obligatoire (ex: `x = 10`) |
| **Pointeurs** | Concepts fondamentaux et très utilisés | Abstraits ou inexistants pour l'utilisateur |
| **Applications typiques** | Systèmes d'exploitation, embarqué, pilotes, jeux, calcul haute performance | Web, IA, scripts, analyse de données, prototypage |
### 3.3. Implications pour le développeur
> [!warning] Attention : Responsabilités accrues en C
> Le contrôle accru offert par le C implique une plus grande responsabilité. La gestion manuelle de la mémoire, par exemple, peut entraîner des fuites de mémoire (memory leaks) ou des accès invalides si elle n'est pas effectuée avec rigueur.
* **Performance et contrôle** : Le C vous permet d'écrire du code très proche du matériel, ce qui est essentiel pour des applications où chaque cycle CPU compte (systèmes embarqués, robotique, jeux vidéo, calcul scientifique). Vous avez un contrôle direct sur l'allocation mémoire, l'accès aux registres, etc.
* **Gestion de la mémoire** : C'est la différence la plus marquante. En Python, le collecteur de garbage s'occupe de libérer la mémoire non utilisée. En C, vous êtes responsable d'allouer (avec `malloc`) et de libérer (avec `free`) la mémoire dynamiquement. C'est là que le concept de **pointeurs** devient absolument central (et sera l'objet d'un chapitre dédié !).
* **Typage statique** : En C, chaque variable doit avoir un type défini à la compilation (`int`, `char`, `float`, etc.). Cela permet au compilateur de détecter de nombreuses erreurs avant même l'exécution, mais rend le code plus verbeux. En Python, le type d'une variable est déterminé à l'exécution.
* **Chaîne de compilation** : Le C nécessite une phase de compilation explicite pour transformer le code source en un exécutable. Python est un langage interprété (bien qu'il passe par une étape de bytecode). Nous allons détailler cette chaîne de compilation juste après.
> [!tip] Penser "proche de la machine"
> Lorsque vous programmez en C, essayez toujours de visualiser comment vos instructions se traduisent en opérations machine et comment la mémoire est organisée. Cette gymnastique intellectuelle est cruciale pour maîtriser le C et les systèmes embarqués (robotique).
# Conclusion
Bienvenue dans le monde de la programmation en C !
Bien que relativement "ancien", le langage C reste d'actualité.
Ses performances et sa capacité à interagir directement avec le matériel en font un langage encore répandue dans l'industrie pour le développement de systèmes d'exploitation, de pilotes de périphériques, de systèmes embarqués et, bien sûr, pour la robotique.