Programmation C
Introduction
Caractéristiques Histoire Normes Premiers programmes Écosystème

Caractéristiques

  • Langage de programmation à vocation "généraliste"
    • Informatique scientifique
    • Programmation système
    • Informatique embarquée
    • Très utilisé mais moins "à la mode" que d'autres langages : Python, Javascript, Java, Ruby...
    • Peu utilisé en programmation pour les bases de données
    • Peu utilisé en programmation web
  • Programmation impérative (pas orientée objet)
  • Langage de bas niveau (pas de type chaine de caractères, pas de liste, pas de pile, gestion explicite de la mémoire, pas de contrôle sur les valeurs des indices dans les tableaux...)
  • Programmation très bas niveau possible (manipulation de la mémoire, langage machine inline...)
  • Langage compilé
    • Transformation du code source en langage machine spécifique au processeur et au système d'exploitation ciblés
    • Obtention d'un exécutable
    • Exécution possible de cet exécutable uniquement sur le processeur et sur le système d'exploitation ciblés
  • Langage faiblement typé à typage statique
    • Existence de types de données : caractère, entiers, réels
    • Existence explicite de la notion de pointeur (nécessaire pour la gestion fine de la mémoire)
    • Contournement assez facile des types de données (manipulation d'adresses mémoires, écriture directe en mémoire)
    • Pas de vérification "à l'exécution" du fait que ce qui se trouve dans une variable est bien du type de la variable
    • Pas de typage dynamique qui permettrait de définir le type d'une variable à partir de ce qui est affecté à cette variable
  • Langage proche du matériel
    • Contrôle fin et optimisation possible de l'utilisation des ressources
      • Processus
      • Mémoire
      • ...

Histoire

  • Créé au début des années 70 par Dennis Ritchie et Brian Kernighan aux Bell Labs
  • Co-développé en parallèle au développement du système d'exploitation Unix qui est écrit en partie en langage C
  • Syntaxe mère de beaucoup de langages qui lui ont succédé : C++, C#, Java, Javascript...

Normes

  • Existence de normes successives apportant des caractéristiques supplémentaires :
    • Norme initiale : ANSI C ou C89
    • C99
    • C11
    • C17 ou C18
    • Prochaine norme : C23
  • Pas de révolution copernicienne depuis C89

Premiers programmes

#include <stdio.h>

void main(void) {
  printf("Hello\n");
}

Hello.c - Hello.exe
  • Le #include est utilisé pour indiquer l'utilisation d'une ou plusieurs définitions "externes" (fonction, variable, constante...) déclarées dans le fichier stdio.h qui correspond à l'API standard stdio. En l'espèce, il s'agit de la fonction printf utilisée dans la fonction main.
  • Le programme ne contient qu'une seule fonction : la fonction main.
    • Cette fonction ne retourne aucune valeur (premier void) et ne possède aucun paramètre (void entre parenthèses).
  • La fonction nommée main, quel que soit son prototype (sa signature, son entête), est la fonction qui est exécutée au lancement du programme.
  • La fonction main ne contient qu'une seule instruction : un appel à la fonction externe printf qui est la fonction générique d'affichage texte dans la console d'exécution.
    • Cette instruction, comme toute instruction, est délimitée à sa fin par un point-virgule.
Hello

  

#include <stdio.h>

int main(int argc,char **argv) {
  printf("Hello version 2\n");
  printf("%d\n", argc);
  for (int i = 0; i < argc; ++i) {
    printf("%s\n", argv[i]);
  }
  return 0;
}

Hello2.c - Hello2.exe
  • Utilisation de la signature standard de la fonction main
    • Retour d'un entier indiquant le code de retour de l'exécution :
      • 0 -> pas d'erreur
      • Autre chose que 0 -> code d'erreur indiquant la nature de l'erreur
    • Deux paramètres :
      • Un entier qui indique la TAILLE du tableau de chaînes de caractères passé en second paramètre
      • Un tableau de chaînes de caractères qui décrit la ligne de commande correspondant à l'exécution du programme :
        • Première chaîne : nom de l'exécutable
        • Chaînes suivantes : paramètres d'appel de l'exécutable
  • Affichage dans la console des paramètres d'appel
  • Retour du code 0 pour pas d'erreur
Hello version 2
1
Hello2.exe

Écosystème de développement

  • Ensemble des outils utilisés en phase de développement
  • Amélioration de la qualité des développements
  • Amélioration de la productivité du développeur
  • Environnement "matériel" minimum
    • Un terminal en ligne de commande
    • Un éditeur texte
    • Un compilateur en ligne de commande
      • gcc : compilateur "de" Linux
      • cl.exe : compilateur de Microsoft (Visual C)
      • clang : Unix
      • ...
  • Environnement "matériel" plus confortable
    • Un environnement de développement intégré (Integrated Development Environment, IDE)
      • Apport de l'ensemble des outils
        • Visual Studio
        • ...
      • Intégrateur d'outils
        • Eclipse
        • NetBeans
        • Visual Studio Code
        • Code::Blocks
        • CLion
        • ...
    • Un éditeur amélioré
      • Saisie semi-automatique
      • Coloration syntaxique
      • Vérification syntaxique temps réel
      • ...
    • Un gestionnaire de projet
      • Construction simplifiée d'un programme décomposé en un ensemble (en beaucoup) de fichiers
      • Possibilité de ne recompiler que ce qui a été modifié et ce qui dépend de ce qui a été modifié
      • ...
    • Une interface avec un gestionnaire de code source (SVN, Git...)
      • Travail en équipe de développeurs
      • Gestion de la cohérence de développements réalisés en parallèle
      • Conservation de versions intermédiaires
      • ...
    • Un debugger
      • Simplification et accélération du déverminage
      • Lors d'une exécution de test
        • Interception d'un plantage et bascule dans le debugger
        • Suivi de la pile d'appels des fonctions
        • Suivi des valeurs des variables
        • Possibilité de définir des points d'arrêt
        • ...
    • Un analyzer
      • Analyse du code pour vérifier la conformité à un ensemble de règles et de bonnes pratiques de développement
    • Un profiler
      • Analyse de l'exécution d'un programme pour en améliorer le temps d'exécution
    • Des programmes utilitaires
      • Assistant de génération automatique de code source (wizards...)
      • Générateur de documentation
      • ...
  • Environnement logiciel du langage C
    • Une Application Programming Interface (API) standard
      • stdlib.h : allocation dynamique de mémoire, recherche, tri...
      • stdio.h : entrées/sorties clavier et écran
      • stddef.h : types et macro dont NULL
      • stdarg.h : création de fonctions avec un nombre variable de paramètres
      • string.h : chaînes de caractères
      • assert.h : macro assert de vérification de conditions pour aider le débogage
      • errno.h : codes d'erreur renvoyés par les fonctions standards au travers de la variable errno
      • limits.h : valeurs limites de différents types
      • time.h : définitions et fonctions liées à la manipulation d'horaires
      • stdbool.h : type booléen (à partir de C99)
      • ...
    • Des API standards mais sujettes à variantes
      • math.h : fonctions mathématiques
      • ...
    • Des API non standards
      • io.h : entrées/sorties fichier
      • ...
    • Des API propriétaires spécialisées métier