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 :

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 <stdlib.h> 
#include <stdio.h>

int main() { 
    printf("Hello World!\n");

    return EXIT_SUCCESS; 
}

Détails du code

ligne à ligne

En comparant par rapport à un code python :

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.

C art

TBD

TBD liste de sujets non traité. Peut-être à ajouter plus tard.

Bibliographie