Le langage C pour la programmation système

C a connu le succès grâce à la liberté nouvelle qu'il offrait aux programmeurs. Son inconvénient est la difficulté à déboguer les programmes. Il produit des programmes rapides et une large collection d'APIs est disponible. Il reste le meilleur outil pour la programmation proche du hardware.

Language C, Dennis Ritchie
Le premier manuel à contribué à la popularité de C

Le langage C été conçu de 1969 à 1972 par Dennis Ritchie pour programmer le système d'exploitation Unix. Il avait pour objectif d'être portable. Voir Le développement du langage C pour un historique.
Le tutoriel du langage par Dennis Ritchie et Brian Kernighan est considéré comme un des meilleurs jamais écrit.

C parait plutôt rustique par rapport aux langages modernes, mais dans les années 70, comme alternative à Basic, il était extrêmement évolué. Appeler une fonction par son numéro de ligne, ou avoir des noms de variable limités à deux caractères dans le basic AppleSoft de Microsoft, rendait la programmation très laborieuse. Même Pascal avec sa lourdeur et ses contraintes semblait moins intéressant que C.

Il a inspiré de nombreux autres langages dont C++, Java, C# de Microsoft et plus récemment Go et Dart de Google.

C est peut être toujours une meilleure solution que C++ pour la programmation système, c'est en tout cas l'opinion de Linux Torvald qui a choisi d'utiliser ce langage pour le logiciel Git, très largement répandu.
Mais ce jugement (en 2007) peut dater car depuis C++ a connu plusieurs évolutions et améliorations, notamment avec la version 11 (et malgré l'évolution de C aussi en 2011). Il demeure néanmoins que pour des applications système critiques, C++ reste trop complexe et indéterminé.
Et pour pallier à l'insécurité du langage, Microsoft a créé Checked C, une extension qui teste les problèmes de mémoire dans un programme.

Un langage ou tout est une expression

Un programme C est composé d'un ensemble de fonctions qui retournent ou non une valeur, et de variables globales. Toute chose peut être évaluée comme une expression, et ce n'est pas forcément un avantage pour la sécurité.
Fonctions et variables ont un prototype dans un fichier en-tête pour une utilisation partagée du fichier source.
Le programmeur doit gérer lui-même la mémoire, utilisant des pointeurs et des fonctions pour allouer ou libérer des blocs de mémoire.
Il est portable avec quelque restrictions: par exemple, les types de variables additionnels dépendent du compilateur.

Le standard ISO C11 de 2011 ajoute de nouvelles fonctions au langage C: le multi-thread, Unicode, les fonctions lambda, structures et unions imbriquées anonymes.

Les structures de données:

Scalaires: int, long, char, char *.
struct permet de créer un type d'objet formé de plusieurs variables et était le précurseur des objets.
union permet de donner plusieurs identifieur à une variable et s'utilise surtout avec les structs.
typedef pour définir de nouveaux types de données.

Les structures de contrôle:

Les symboles:

// and /* */ commentaires.
& | && || opérateurs logiques.
# directive pour le pré-processeur.

Les symboles composés effectuent deux opérations sur une même variable. Par exemple, a += b ajoute b à a puis assigne le résultat à a.

La boucle while:

while(x < y)
{
   ... instructions ...
}

La définition d'une fonction:

int nom(char *x, int y)
{
   ... instructions ...

   return(z);
}

Exemple de code

Afficher les caractères d'une chaîne en C.

char *s = "demo";
int l = strlen(s);
for(int i = 0; i < l; i++)
{
   char c = s[i];
   printf("%c\n", c);
} 

Sites et outils pour C