C pour le système
TBD comme https://www.youtube.com/watch?v=76acHVJfziw&t=23s, utiliser radar2 pour voir comment ça marche en mémoire. Pile et tas.
Le C a été créé pour créer Unix. Son but est de créer des systèmes d'exploitation. Il :
- est très proche de la machine
- fait confiance au développeur et n'effectue aucune vérification
Le but est de ne pas avoir d'overhead dans l'exécution du code. C'est donc un formidable langage pour comprendre le fonctionnement d'un ordinateur.
Il existe plusieurs compilateurs permettant de produire du code machine à partir d'un programme en C. On peut en citer deux : gcc et llvm. Nous utiliserons ce dernier dans ce cours.
C n'a cessé d'évoluer au cours du temps. La norme actuelle date de 2023 (dite c23
), c'est elle que nous utiliserons et qui remplace la dernière spécification datant de 2017 (la c17
).
Installation llvm
Il existe plusieurs compilateurs de C
. Nous allons utiliser llvm pour ce cours.
Premier programme
Fichier hello.c
:
#include
#include
int main() {
printf("Hello World!\n");
return EXIT_SUCCESS;
}
Détails du code
ligne à ligne
En comparant par rapport à un code python :
- les imports sont notées
#include
- les fonctions sont définies avec les types :
- de leur sortie, ici
int
, un entier signé - le type de la chaîne de caractère doit être spécifié, ici de l'UTF-8
- de leurs paramètres, ici comme en python
()
signifie qu'il n'y en a pas
- de leur sortie, ici
- les blocs ne sont gérées par des
{}
et non par l'indentation. - la fin d'une commande doit être signalée par un
;
Venant du python, il peut sembler grisant de pouvoir écrire plusieurs instructions sur une ligne, par exemple :
int main(void){printf("Hello World!\n");return EXIT_SUCCESS;}
Est tout à fait valable.
Mais ne le faite pas. Du code non clairement indenté vous sautera tôt ou tard à la figure.
Vous verrez aussi parfois écrire main(void)
qui utilise le mot clé void
qui signifie le vide à la place de main()
. Ce n'est plus nécessaire depuis la révision 2023 du C.
Si vous ne spécifiez pas le type de la chaîne de caractère son type est indéfini, il dépend de la locale du système. Il n'est défini que pour les caractère ASCII sur 7bits.
Exécution
On utilise le compilateur clang, fait pour compiler de nombreux langages, dont le C.
clang hello.c
La compilation a crée un fichier exécutable a.out
dans le dossier courant :
Sous unix :
./a.out
Sous Windows :
.\a.exe
Si vous tapez uniquement a.out
(ou a.exe
sous windows), cela ne marchera pas. Il faut préciser le chemin relatif car les fichiers exécutables sans chemin ne sont exécutable que s'ils sont dans le PATH.
Notez que si vous voulez exécuter le résultat de la compilation uniquement si la compilation a réussie, vous pouvez utiliser la commande :
clang hello.c && ./a.out
On peut toujours préciser le fichier de sortie avec l'option -o
. Par exemple :
clang hello.c -o hello
Produire l'exécutable hello
En ajoutant l'option -v
, verbose, clang détaille ses opérations. N'hésitez pas à le faire à chaque commande pour voir ce qu'il fait effectivement.
Compilation
Avant de pouvoir exécuter un fichier .c
, il faut procéder à plusieurs étapes pour le transformer en exécutable (le fichier a.out
)
Éléments de langage
Gestion des sources
Gestion des erreurs
Bibliothèques
Exercices
Il existe de nombreux sites compilant des exercices (plus ou moins corrigés) en C
, nous vous en avons concocté 3 séries ci-après qui mobilisent tout ce qu'on a vu.
Autres exercices (liste non exhaustive) :
C art
TBD
TBD liste de sujets non traité. Peut-être à ajouter plus tard.
- python et C
- Créer une lib en static avec ar
- diff entre clone, fork, vfork
- fork/clone : avec strace : https://www.youtube.com/watch?v=uRYyj8tcDTE&list=PLhy9gU5W1fvUND_5mdpbNVHC1WCIaABbP&index=17
- complet : C et segments mémoires utilisées
- timer