ch2 env
This commit is contained in:
262
ch002-env.md
Normal file
262
ch002-env.md
Normal file
@@ -0,0 +1,262 @@
|
|||||||
|
# Chapitre 2 — Environnements et portabilité
|
||||||
|
|
||||||
|
## 2.1 C hébergé vs C freestanding
|
||||||
|
|
||||||
|
Il existe deux modes d’exécution du C.
|
||||||
|
|
||||||
|
Un environnement hébergé fournit :
|
||||||
|
- un OS
|
||||||
|
- une libc complète
|
||||||
|
- un point d’entrée `main`
|
||||||
|
|
||||||
|
```c
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
printf("Hello\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Un environnement freestanding est minimal.
|
||||||
|
|
||||||
|
```c
|
||||||
|
void start(void)
|
||||||
|
{
|
||||||
|
// code bas niveau
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2.2 Plateformes
|
||||||
|
|
||||||
|
Linux, Windows, macOS ont des APIs différentes.
|
||||||
|
Un programme C peut s’exécuter sur plusieurs systèmes.
|
||||||
|
Mais tous les systèmes sont différents.
|
||||||
|
---
|
||||||
|
- Linux
|
||||||
|
- API POSIX
|
||||||
|
- forte portabilité
|
||||||
|
- outils standards
|
||||||
|
---
|
||||||
|
- macOS
|
||||||
|
- basé sur UNIX
|
||||||
|
- proche de POSIX
|
||||||
|
- spécificités Apple
|
||||||
|
---
|
||||||
|
- Windows
|
||||||
|
- API spécifique (WinAPI)
|
||||||
|
- comportement différent sur certains points
|
||||||
|
- pas POSIX natif
|
||||||
|
---
|
||||||
|
- Android
|
||||||
|
- basé sur Linux
|
||||||
|
- libc spécifique (Bionic)
|
||||||
|
- contraintes mobiles
|
||||||
|
---
|
||||||
|
- Embarqué
|
||||||
|
- pas d’OS ou OS minimal
|
||||||
|
- ressources limitées
|
||||||
|
- accès direct au matériel
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2.3 Architecture vs système
|
||||||
|
|
||||||
|
Un programme dépend de plusieurs couches.
|
||||||
|
|
||||||
|
Il faut distinguer :
|
||||||
|
|
||||||
|
- architecture (CPU)
|
||||||
|
- système (OS)
|
||||||
|
- compilateur
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
🔹 Architecture
|
||||||
|
|
||||||
|
Exemples :
|
||||||
|
|
||||||
|
- x86
|
||||||
|
- x86_64
|
||||||
|
- ARM
|
||||||
|
- RISC-V
|
||||||
|
|
||||||
|
Chaque architecture :
|
||||||
|
|
||||||
|
- a ses registres
|
||||||
|
- son alignement
|
||||||
|
- son endianness
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
🔹 Système
|
||||||
|
|
||||||
|
Le système fournit :
|
||||||
|
|
||||||
|
- fichiers
|
||||||
|
- processus
|
||||||
|
- mémoire
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
🔹 Compilateur
|
||||||
|
|
||||||
|
Il traduit le code C en binaire.
|
||||||
|
|
||||||
|
Exemples :
|
||||||
|
|
||||||
|
- gcc
|
||||||
|
- clang
|
||||||
|
- compilateurs embarqués
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2.4 Endianness
|
||||||
|
|
||||||
|
L’endianness définit l’ordre des octets en mémoire.
|
||||||
|
|
||||||
|
🔹 Little endian
|
||||||
|
|
||||||
|
Octet faible en premier.
|
||||||
|
|
||||||
|
🔹 Big endian
|
||||||
|
|
||||||
|
Octet fort en premier.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Exemple :
|
||||||
|
|
||||||
|
```c
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
int x = 0x12345678;
|
||||||
|
unsigned char *p = (unsigned char*)&x;
|
||||||
|
|
||||||
|
printf("%02x %02x %02x %02x\n", p[0], p[1], p[2], p[3]);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Le résultat dépend de l’architecture.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2.5 Taille des types
|
||||||
|
|
||||||
|
La taille des types n’est pas fixe.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Exemple :
|
||||||
|
|
||||||
|
```c
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
printf("%zu\n", sizeof(int));
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2.6 Ce qui est portable
|
||||||
|
|
||||||
|
Code portable :
|
||||||
|
|
||||||
|
- respecte la norme
|
||||||
|
- évite les extensions
|
||||||
|
- évite les hypothèses
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Exemple — non portable
|
||||||
|
|
||||||
|
```c
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
int x = 2147483647 + 1; // overflow
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Le comportement n’est pas défini.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Exemple — portable
|
||||||
|
|
||||||
|
```c
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
int32_t x = 2147483647;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2.7 Dépendances système
|
||||||
|
|
||||||
|
Certains appels dépendent du système.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Exemple :
|
||||||
|
|
||||||
|
```c
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
system("ls"); // Linux uniquement
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2.8 Abstraction
|
||||||
|
|
||||||
|
|
||||||
|
Pour être portable, il faut abstraire.
|
||||||
|
|
||||||
|
Cela signifie :
|
||||||
|
|
||||||
|
- isoler le code dépendant
|
||||||
|
- utiliser des interfaces
|
||||||
|
|
||||||
|
--
|
||||||
|
|
||||||
|
Exemple :
|
||||||
|
|
||||||
|
```c
|
||||||
|
void afficher_message(void)
|
||||||
|
{
|
||||||
|
#ifdef _WIN32
|
||||||
|
// Code Windows
|
||||||
|
#else
|
||||||
|
// Code Linux ?
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2.9 Bonnes pratiques
|
||||||
|
|
||||||
|
- utiliser <stdint.h>
|
||||||
|
- éviter les tailles implicites
|
||||||
|
- éviter UB
|
||||||
|
- tester sur plusieurs plateformes
|
||||||
|
- isoler le code système
|
||||||
Reference in New Issue
Block a user