Le langage C est considéré comme la mère de tous les langages de programmation modernes. Presque tous les langages actuels intègrent des fonctionnalités inaugurées par C. Il a été utilisé pour développer des logiciels sur des micro-ordinateurs embarqués aux superordinateurs les plus puissants.
Les applications en C couvrent les logiciels système, bureautiques, d'entreprise, bases de données et bien plus. Maîtriser les bases de C est un excellent point de départ pour une carrière en programmation.
Le développement de C est intimement lié à Unix. Créé vers 1972, avec des ajouts ultérieurs, il a révolutionné le paysage informatique.
Avant C, Unix fut développé sur PDP-7 en assembleur. Un compilateur C fut ensuite bâti en assembleur, facilitant la réécriture complète d'Unix en C pour le PDP-11. Le compilateur lui-même fut réécrit en C, aidé par les outils lex et yacc, achevant le processus d'auto-amorçage.
La portabilité était la clé : les assembleurs variant par architecture, réécrire Unix en C a drastiquement réduit les efforts de portage.
C s'est ensuite étendu aux serveurs de fichiers, bases de données, piles réseau, logiciels bureautiques et serveurs web.

En 1978, Brian Kernighan et Dennis Ritchie publient The C Programming Language, référence informelle jusqu'à la normalisation ANSI en 1989. La dernière version est C11 (2011).
Examinons les traits distinctifs de C.
Face à la complexité croissante des logiciels en C, des concepts orientés objet (encapsulation, polymorphisme) ont émergé, menant à C++ comme sur-ensemble de C.
C++ ajoute des fonctionnalités OO tout en assurant la compatibilité. Conçu pour l'amélioration progressive, il permet de mixer modules C et C++.
Un code C pur compile théoriquement avec un compilateur C++, bien que des vérifications plus strictes nécessitent parfois des ajustements mineurs.
C reste compact malgré sa puissance : seulement 32 mots-clés (contre 82 en C++, 50 en Java, 63 en JavaScript, 357 en COBOL). Cela simplifie l'apprentissage et l'usage.
Contrairement à Java, C++ ou JavaScript, C traite les chaînes comme des tableaux de caractères terminés par '\0'. La longueur est conventionnelle, favorisant des bugs comme les débordements de tampon.
Le ver Morris (1988) exploitait un tel bug dans le démon finger.
Exemple de code vulnérable :
#include <stdio.h>
int main() {
char *buf = "bonjour le monde"; // Chaîne littérale, écriture = UB
buf[15] = 'x'; // Dépassement potentiel
printf("%s\n", buf);
return 0;
}Les langages modernes évitent cela via un type chaîne dédié (ex. std::string en C++).
Les pointeurs référencent des adresses mémoire. La flexibilité de C permet des accès arbitraires, mais au prix de bugs fréquents (déréférencements invalides).
Des vulnérabilités historiques touchent serveurs web, email et FTP. Le bug Heartbleed (2014) en est un exemple célèbre, soulignant l'importance d'une gestion rigoureuse.

Les BSOD Windows sont souvent dus à cela. D'autres langages interdisent les pointeurs manipulables.
En C, tableaux et pointeurs se substituent mutuellement, offrant puissance mais risquant des erreurs.
Les macros substituent du texte à la compilation, supportant #ifdef pour une compilation conditionnelle, idéale pour la portabilité.
Elles permettent d'inclure/exclure du code. Obsolètes en C++ moderne, absentes en Java, Python, etc.
Sans classes, l'encapsulation repose sur les fichiers. static limite la visibilité ; extern l'étend. Contrairement aux OO (C++, Java).
Chaînes, maths, I/O, réseau relègués à des libs externes, contrairement aux langages avec stdlib riche.
Ces traits font de C un langage unique, puissant pour les systèmes, malgré ses pièges.
Avez-vous programmé en C ? Apprécié ou préféré un autre langage ? Partagez en commentaires !