Le langage C¤
C is quirky, flawed, and an enormous success.
Le langage C est l'un des premiers langages de programmation. Il se situe très près de l'assembleur, ce langage de bas niveau utilisé par les processeurs. Le C permet ainsi de concevoir des applications extrêmement performantes, et il est exploité dans une multitude de domaines informatiques, que ce soit pour une montre connectée, un stimulateur cardiaque (pacemaker) ou encore une machine à café.
Bien qu'il soit ancien (il date de 1972), le langage C reste largement employé et enseigné, grâce à son efficacité et sa capacité à inculquer les bases fondamentales de la programmation.
En vérité, en 2024, il n'existe guère d'alternative aussi mûre et éprouvée que le C pour développer des applications embarquées à haute performance ou pour le noyau des systèmes d'exploitation. Des langages plus récents tels que Rust ou Zig commencent certes à émerger, mais ils peinent encore à s'imposer dans l'industrie.
Historique¤
En 1964 naît, d'une collaboration entre les laboratoires Bell (Bell Telephone Laboratories), General Electric et le MIT, le projet Multics (Multiplexed Information and Computing Service), qui vise à développer un nouveau système d'exploitation.
Cependant, la fin de la décennie est marquée par des remous. Les laboratoires Bell, désillusionnés par les promesses de Multics, décident de se retirer du projet pour élaborer leur propre système d'exploitation. Un groupe informel, dirigé notamment par Ken Thompson et Dennis Ritchie, entreprend de revoir certains concepts de Multics qui leur déplaisaient, notamment le langage de programmation PL/I (Programming Language number 1), alors prédominant pour l’écriture de systèmes d’exploitation. Thompson développe un langage baptisé B, inspiré du BCPL, dans lequel il ne conserve que les éléments qu'il juge essentiels pour fonctionner sur de petites machines. À ce stade, B ne comporte qu’un seul type de donnée, le « mot » (word).
BCPL, conçu par Martin Richards au MIT dans les années 1960, est l'ancêtre de B, et par extension, l'arrière-grand-père du C. Dennis Ritchie, alors collègue de Thompson, retravaille le langage B pour y ajouter la gestion des types de données.
Le système d'exploitation que Thompson et Ritchie développent aux laboratoires Bell s’appelle d'abord UNICS, par opposition à Multics, où Multiplexed est remplacé par Uniplexed. Le nom évolue ensuite pour devenir UNIX, un pilier dans l'histoire de l'informatique.
Plus tard, Brian Kernighan contribue à la popularisation de ce nouveau langage. Il est l'auteur principal du livre The C Programming Language, tandis que Dennis Ritchie s’est concentré sur les annexes.
Les évolutions du C continuent, notamment avec Bjarne Stroustrup qui, dans les années 1980, étend le langage en y apportant la programmation orientée objet (OOP). Ce concept sera étudié dans un autre cours. La figure suivante présente le trio fondateur du langage C.
Il faut attendre 1989 pour que le langage C soit normalisé par l’ANSI (American National Standards Institute). L’année suivante, l’ISO (International Organization for Standardization) ratifie le standard ISO/IEC 9899:1990, communément appelé C90. Dès lors, le C devient un standard international et s’impose comme le langage dominant dans le domaine de l’informatique.
Les langages de programmation se nourrissent souvent les uns des autres, et le C ne fait pas exception. La figure suivante illustre quelques-unes des influences entre langages :
Cinquante ans plus tard, le C reste l'un des langages les plus utilisés par les ingénieurs. Alliant une vision de haut niveau avec la possibilité de manipulations de bas niveau, il s’avère être un choix privilégié pour les applications embarquées sur microcontrôleurs, ou pour l’optimisation de code afin d’obtenir des performances maximales, comme dans les noyaux de systèmes d'exploitation tels que le noyau Linux (Kernel) ou Windows.
Retenons simplement que C est un langage à la fois simple et puissant. Votre machine à café, votre voiture, vos écouteurs Bluetooth ont probablement été, au moins partiellement, programmés en C.
Standardisation¤
Comme nous l'avons vu, le langage C a un long historique. Il a fallu attendre près de vingt ans après sa création pour qu’il fasse l’objet d’une normalisation internationale.
Le standard le plus couramment utilisé en 2024 reste sans doute C99. C11 commence à le remplacer dans l'industrie, mais l'évolution se poursuit avec C17, C18 et C23. La figure suivante résume les différents standards internationaux du C :
Notation courte | Standard international | Date |
---|---|---|
C | n/a | 1972 |
K&R C | n/a | 1978 |
C89 (ANSI C) | ANSI X3.159-1989 | 1989 |
C90 | ISO/IEC 9899:1990 | 1990 |
C99 | ISO/IEC 9899:1999 | 1999 |
C11 | ISO/IEC 9899:2011 | 2011 |
C17/C18 | ISO/IEC 9899:2018 | 2018 |
C23 | ISO/IEC 9899:2023 | 2023 |
En substance, C18 n'apporte pas de nouvelles fonctionnalités majeures au langage, mais se concentre sur la clarification des ambiguïtés laissées par C11, qui, lui-même, n’introduisait que peu de changements fondamentaux pour le développement sur microcontrôleurs.
Info
Vous entendrez ou lirez souvent des références à ANSI C ou K&R. Privilégiez toutefois une compatibilité avec C99 au minimum.
Le standard C est, il faut bien l’admettre, dense et ardu à lire. Avec ses quelque 552 pages pour C99, il est peu probable que vous y trouviez un grand plaisir. Et pourtant, il est parfois nécessaire de s’y plonger pour démêler certaines subtilités du langage, rarement explicitées dans les manuels. Vous vous retrouverez un jour ou l’autre confronté à des problèmes non documentés, et c’est souvent dans le standard que se trouve la solution.
Comme mentionné plus haut, bien que C99 soit le standard le plus utilisé en 2024, il a déjà plus de 25 ans. Vous vous demandez peut-être pourquoi l'industrie semble si en retard face aux dernières versions. Contrairement au domaine des logiciels grand public, où chaque mise à jour est adoptée avec enthousiasme, le secteur industriel est régi par des processus de validation stricts. Migrer vers un nouveau standard est une opération coûteuse, tant en termes de tests que de conformité, et les entreprises préfèrent souvent s’en tenir à des versions éprouvées plutôt que de risquer de coûteuses erreurs, notamment dans des domaines critiques comme l’aéronautique ou la médecine.
Le C et les autres...¤
Si ce cours se concentre principalement sur le langage C, il est loin d'être le seul langage de programmation, et ce n'est certainement pas le seul que vous apprendrez au cours de votre carrière. La table suivante présente une liste non exhaustive de langages de programmation ainsi que leur année de création. Cette liste permet de mieux comprendre l'évolution des langages de programmation et leurs usages typiques :
Langage de programmation | Année | Utilisation |
---|---|---|
Fortran | 1957 | Calcul scientifique |
Lisp | 1958 | Intelligence artificielle |
Cobol | 1959 | Finance, banque |
Basic | 1964 | Enseignement |
Pascal | 1970 | Enseignement |
C | 1972 | Systèmes embarqués |
C++ | 1985 | Applications lourdes |
Perl | 1987 | Scripts |
Python | 1991 | Ingénierie, sciences |
Ruby | 1995 | Scripts, Web |
Java | 1995 | Applications lourdes |
PHP | 1995 | Web |
C# | 2000 | Applications graphiques |
Go | 2009 | Systèmes distribués |
Rust | 2010 | Systèmes embarqués |
Swift | 2014 | Applications mobiles |
Zig | 2016 | Systèmes embarqués |
L'index TIOBE constitue un excellent indicateur de la popularité des langages de programmation. Il est mis à jour mensuellement et permet de suivre l'évolution de la popularité des différents langages. En 2024, le classement des 10 langages de programmation les plus populaires est présenté dans la table suivante :
Top 10 | Langage de programmation |
---|---|
1 | Python |
2 | C++ |
3 | C |
4 | Java |
5 | C# |
6 | JavaScript |
7 | Go |
8 | SQL |
9 | Visual Basic |
10 | Fortran |
Sur le podium, Python est un langage de très haut niveau simple à apprendre, mais éloigné du matériel. C++ est un langage de programmation orientée objet, très puissant, mais complexe à dompter. Avec la médaille d'argent, C est un excellent compromis entre les deux, il est simple, mais permet de comprendre les bases de la programmation et de la manipulation du matériel. C'est pour cela que ce cours est basé sur le langage C. Ai-je réussi à vous convaincre ?
Programmation texte structurée¤
Le C comme la plupart des langages de programmation utilise du texte structuré, c'est-à-dire que le langage peut être défini par un vocabulaire, une grammaire et se compose d'un alphabet. À l'inverse des langages naturels comme le Français, un langage de programmation est un langage formel et se veut exact dans sa grammaire et son vocabulaire, il n'y a pas de cas particuliers ni d'ambiguïtés possibles dans l'écriture. Les compilateurs sont ainsi construits autour d'une grammaire du langage qui est réduite au minimum par souci d'économie de mémoire, pour taire les ambiguïtés et accroître la productivité du développeur.
Pour mieux comprendre, voici un exemple sous forme de pseudo-code utilisant une grammaire simple :
POUR CHAQUE œuf DANS le panier :
jaune, blanc ← CASSER(œuf)
omelette ← MELANGER(jaune, blanc)
omelette_cuite ← CUIRE(omelette)
SERVIR(omelette_cuite)
La structure de la phrase permettant de traiter tous les éléments d'un ensemble d'éléments (les œufs d'un panier) peut alors s'écrire de façon générique comme suit :
où les 〜
sont des marques substitutives (placeholder) qui seront remplacées par le développeur par ce qui convient.
Les grammaires des langages de programmation sont souvent formalisées à l'aide d'un métalangage, c'est-à-dire un langage qui permet de décrire un langage. On l'appelle la grammaire du langage C. C'est un peu le Bescherelle du C. On observe dans ce formalisme une syntaxe rigoureuse, l'utilisation de termes en majuscules, la séparation de mots par des virgules, la présence de parenthèses et de flèches (←
). Cette syntaxe diffère d'un langage à l'autre, mais selon le paradigme du langage de grandes similarités peuvent exister.
Les paradigmes de programmation¤
Chaque langage de programmation que ce soit C, C++, Python, ADA, COBOL et Lisp sont d'une manière générale assez proche les uns des autres. Nous citions par exemple le langage B, précurseur du C (c. f. [thompson]{c-history}). Ces deux langages, et bien que leurs syntaxes soient différentes, ils demeurent assez proches, comme l'espagnol et l'italien qui partagent des racines latines. En programmation on dit que ces langages partagent le même paradigme de programmation.
Certains paradigmes sont plus adaptés que d'autres à la résolution de certains problèmes et de nombreux langages de programmation sont dit multi-paradigmes, c'est-à-dire qu'ils supportent différents paradigmes.
Nous citions plus haut le C++ qui permet la programmation orientée objet, laquelle est un paradigme de programmation qui n'existe pas en C. Ce qu'il est essentiel de retenir c'est qu'un langage de programmation peut aisément être substitué par un autre pour autant qu'ils s'appuient sur les mêmes paradigmes.
Le langage C répond aux paradigmes suivants :
- Impératif
-
Programmation en séquences de commandes, qui se lisent dans un ordre donné (de haut en bas).
- Structuré
-
Programmation impérative possédant des structures de décision imbriquées comme les boucles et les conditions.
- Procédural
-
Programmation impérative possédant des appels de procédures isolées qui regroupent une séquence d'instructions.
D'autres langages comme le C++ apportent les paradigmes supplémentaires à C :
- Fonctionnel
-
Programmation basée sur l'appel de fonction. Utilisé dans les langages Lisp, Haskell, Erlang.
- Orienté objet
-
Programmation basée sur la définition de classes et d'objets. Utilisé dans les langages C++, Java, Python. Une classe associe des données à des actions qui manipulent ces données.
Des langages de plus haut niveau comme Python ou C# apportent davantage de paradigmes comme la programmation réflective ou la programmation événementielle.
Ce que nous devons retenir c'est que le langage C est impératif et procédural, c'est-à-dire qu'il est basé sur des séquences d'instructions séparées les unes des autres qui s'exécutent dans un ordre donné et lesquelles peuvent être regroupées en procédures. En reprenant notre exemple d'omelette, si nous souhaitons cette fois-ci réaliser une bonne pâte à crêpes, nous pourrions écrire :
POUR REALISER un œuf:
CHERCHER poule
œuf ← PONDRE(poule)
POUR REALISER du lait:
CHERCHER vache
lait ← TRAITRE(vache)
POUR REALISER de la farine:
PLANTER blé
ATTENDRE 6 mois
moisson ← MOISSONNER(blé)
farine ← MOUDRE(moisson)
POUR REALISER une pâte à crèpes:
œuf ← REALISER(œuf)
jaune, blanc ← CASSER(œuf)
œuf-liquide ← MELANGER(jaune, blanc)
farine ← REALISER(farine)
lait ← REALISER(lait)
pâte ← MELANGER(œuf-liquide, farine, lait)
Dans cet exemple, les séquences d'instructions ont été regroupées en procédures, c'est de la programmation procédurale. Les procédures permettent de découper un programme en morceaux plus petits, plus faciles à comprendre et à maintenir.
Cycle de développement¤
Savoir écrire un programme en C n'est qu'une facette de la programmation. Il est important de comprendre que la programmation est un processus itératif qui nécessite de suivre un cycle de développement logiciel. Ce cycle de développement comprend des étapes menant de l'étude à l'analyse d'un problème jusqu'à la réalisation d'un programme informatique exécutable. Dans l'industrie, il existe de nombreux modèles comme le Cycle en V ou le modèle en cascade que nous verrons plus en détail plus tard (Modèles de développement). Quel que soit le modèle utilisé, il comprendra les étapes suivantes :
- Étude et analyse du problème
- Écriture d'un cahier des charges (spécifications)
- Écriture de tests à réaliser pour tester le fonctionnement du programme
- Conception d'un algorithme
- Transcription de cet algorithme en utilisant le langage C
- Compilation du code et génération d'un exécutable
- Test de fonctionnement
- Vérification que le cahier des charges est respecté
- Livraison du programme
Mis à part la dernière étape où il n'y a pas de retour en arrière possible, les autres étapes sont itératives. Il est très rare d'écrire un programme juste du premier coup. Durant tout le cycle de développement logiciel, des itérations successives sont faites pour permettre d'optimiser le programme, de résoudre des bogues, d'affiner les spécifications, d'écrire davantage de tests pour renforcer l'assurance d'un bon fonctionnement du programme et d’éviter une coulée de lave.
Cycle de compilation¤
Le langage C à une particularité que d'autres langages n'ont pas, il comporte une double grammaire. Le processus de compilation s'effectue donc en deux étapes.
- Le préprocesseur qui enlève les commentaires du développeur et regroupe en un fichier les différentes parties du programme.
- La compilation à proprement parler du code source en un fichier binaire.
Vient ensuite la phase d'édition des liens ou linkage lors de laquelle le programme exécutable est créé à partir des fichiers binaires générés lors de la compilation. La figure suivante illustre le cycle de compilation d'un programme C.
Préprocesseur (pre-processing)¤
La phase de preprocessing permet de générer un fichier intermédiaire en langage C dans lequel toutes les instructions nécessaires à la phase suivante sont présentes. Le preprocessing réalise le remplacement des directives du préprocesseur de définitions par leurs valeurs résultantes. Ce préprocesseur permet d'inclure des fichiers externes, de définir des valeurs constantes ou de conditionner l'exécution de certaines parties du code par exemple avec des options de configuration. Avec le compilateur gcc
il est possible de demander uniquement cette étape avec l'option -E
. Cette étape est illustrée dans la figure suivante.
Lorsque vous écrivez votre programme, vous le faites en utilisant des fichiers sources avec l'extension .c
. Néanmoins, dans votre programme, vous vous basez sur de nombreuses bibliothèques logicielles qui donnent accès à des fonctions prédéfinies. Ces bibliothèques sont incluses dans votre programme à l'aide de la directive #include
. Lors de la compilation, le préprocesseur va remplacer ces directives par le contenu des fichiers d'en-tête correspondants. Par exemple, la directive #include <stdio.h>
sera remplacée par le contenu du fichier stdio.h
qui contient les déclarations des fonctions de la bibliothèque standard d'entrées sorties. Cette procédure prend donc en entrée un fichier source et un ou plusieurs fichiers d'en-tête et le transforme en un fichier source unique.
Compilation (build)¤
La phase de compilation consiste en une analyse syntaxique du fichier à compiler selon la grammaire du langage puis en sa traduction en langage assembleur pour le processeur cible. Le fichier généré est un fichier binaire (extension .o
ou .obj
) qui sera utilisé pour la phase suivante. Lors de la compilation, des erreurs peuvent survenir et empêcher le déroulement complet de la génération de l'exécutable final. Là encore, la correction des erreurs passe toujours par un examen minutieux des messages d'erreur.
À l'instar de l'option -E
vue plus haut, il est aussi possible de ne demander que l'assemblage d'un code avec l'option -S
. À partir d'un fichier pré-processé, le compilateur génère un fichier assembleur qui est un fichier texte lisible par un humain (qui connaît l'assembleur) et qui contient les instructions du processeur cible. Cette étape est illustrée dans la figure suivante.
Une fois généré le fichier assembleur, il doit encore est transformé en langage machine, c'est-à-dire en un fichier binaire. Cette étape est réalisée par un programme appelé as qui prend en entrée le fichier assembleur et génère un fichier binaire comme le montre la figure suivante.
Édition de liens (link)¤
L'édition de liens permet d'assembler ensemble les différents fichiers binaires (.o
) issus de la compilation et d'autres fichiers binaires nécessaires au programme pour former un exécutable complet. Ces autres fichiers binaires sont appelés des bibliothèques ou plus communément librairies. Elles peuvent appartenir au système d'exploitation, ou avoir été installées manuellement avec l'environnement de développement. L'édition de liens a pour rôle de résoudre les références entre les différents fichiers binaires et de générer un exécutable complet.
Imaginez un livre dont vous êtes le héros. Plusieurs auteurs différents peuvent prendre en charge des chapitres différents et lors des choix laissez des marques substitutives pour le numéro de page où le lecteur doit se rendre :
Face à cette horde de créatures, vous avez le choix entre : attaquer le Golème qui semble être le chef, rendez-vous à la page XXX, ou fuir par la porte dérobée, rendez-vous à la page XXX.
Naturellement vous ne connaîtrez le numéro de page exact qu'une fois que tous les chapitres seront réunis. L'édition de liens est un peu comme l'assemblage de tous les chapitres pour former un livre complet, elle s'occupe de remplacer les marques substitutives par les bons numéros de pages. Cette étape est illustrée dans la figure suivante.
Hello World !¤
Il est traditionnellement coutume depuis la publication en 1978 du livre The C Programming Language de reprendre l'exemple de Brian Kernighan comme premier programme.
Ce programme est composé de deux parties. L'inclusion de la bibliothèque standard d'entrées sorties (STandarD Inputs Outputs) à l'aide d'une directive préprocesseur qui définit l'existence de la fonction printf
qui vous permet d'écrire sur le terminal. Le programme principal est nommé main
et tout ce qui se situe à l'intérieur des accolades { }
appartient à ce dernier. L'ensemble que définit main
et ses accolades est appelé une fonction, et la tâche de cette fonction est ici d'appeler une autre fonction printf
. On prend soin de terminer chaque instruction par un point-virgule ;
.
L'appel d'une fonction comme printf
peut prendre des paramètres comme ici le texte Hello world!\n
dont le \n
représente un retour à la ligne.
Une fois ce code écrit, il faut le compiler. Pour bien comprendre ce que l'on fait, utilisons la ligne de commande ; plus tard vous utiliserez votre éditeur de texte favori pour écrire vos programmes.
Pour obtenir un invité de commande, vous devez ouvrir un terminal. Comme nous avons choisi de travailler sur un système compatible POSIX, sur n'importe quel système d'exploitation vous lancez un terminal et sous Windows vous devez installer WSL2. Une fois lancée la console ressemble à ceci :
C'est intimidant si l'on n’en a pas l'habitude, mais vraiment puissant, croyez-moi ! La première étape est de s'assurer que le fichier test.c
contient bien notre programme. Pour ce faire on utilise un autre programme cat qui ne fait rien d'autre que lire le fichier passé en argument et de l'afficher sur la console :
Évidemment, vous devez avoir écrit le programme hello.c
au préalable. Alternativement vous pouvez utiliser la commande suivante pour créer le fichier hello.c
:
À présent on peut utiliser notre compilateur par défaut : cc
pour C Compiler. Ce compilateur prend en argument un fichier C et sans autre option, il génèrera un fichier a.out pour assembler output. C'est un fichier exécutable que l'on peut donc exécuter.
Utilisez donc la commande suivante pour compiler votre programme :
Rien ne s'est affiché ? C'est une excellente nouvelle ! La philosophie POSIX veut qu'un programme soit aussi discret que possible : si tout s'est bien déroulé, il n'est pas nécessaire d'en informer l'utilisateur. Toutefois, cela ne signifie pas que la commande n'a eu aucun effet. En réalité, vous devriez maintenant trouver dans le répertoire courant votre fichier source ainsi que le résultat de la compilation, à savoir le fichier a.out
. Pour vérifier cela, nous allons utiliser le programme ls, qui liste les fichiers présents dans un répertoire :
Parfait, nous avons bien les deux fichiers. Maintenant, exécutons le programme en prenant soin de préfixer le nom par ./
, car les programmes générés localement, comme a.out
, ne peuvent pas être lancés directement par leur nom pour des raisons de sécurité. En effet, imaginez qu'un pirate malintentionné crée un programme nommé ls
dans ce répertoire, qui effacerait toutes vos données. Si vous exécutez la commande ls
pour voir le contenu du répertoire, vous lanceriez involontairement ce programme malveillant avec des conséquences désastreuses. Pour éviter ce type de problème, tout programme local doit être explicitement préfixé par ./
pour pouvoir être exécuté. À vous de jouer :
Félicitations, le programme s'est exécuté correctement ! Mais à présent, nous pouvons en apprendre davantage sur ce fichier. Par exemple, nous pourrions examiner la date de création du programme ainsi que l'espace qu'il occupe sur votre disque. Encore une fois, ls
nous sera utile, cette fois-ci avec l'option l
:
Voyons ensemble le détail de ce charabia lu de gauche à droite :
- Il s'agit d'un fichier
rwx Lisible (r), Éditable (w) et Exécutable (x) par le propriétaire
r-x Lisible (r) et Exécutable (x) par le groupe
r-- Lisible (r) par les autres utilisateurs
1 Nombre de liens matériels pour ce fichier
ycr Nom du propriétaire
iai Nom du groupe
8.2K Taille du fichier, soit 8200 bytes soit 65'600 bits
Jul 24 09:50 Date de création du fichier
a.out Nom du fichier
hello, world
Les puristes peuvent se demander s'il est préférable d'écrire hello, world
, hello, world!
ou Hello, world!\n
. Dans son livre, Brian Kernighan a opté pour hello, world\n
, et c'est cette version que nous avons reprise ici.
Au-delà de ce souci du détail, il est important de souligner que la casse des caractères a une grande importance en informatique. Hello
n'est pas équivalent à hello
, car le stockage en mémoire diffère, et par conséquent, le résultat de l'exécution d'un programme peut varier.
Il est donc primordial de prêter attention à ces subtilités. Vous le constaterez au fil du temps : vous développerez une aisance naturelle pour repérer les ;
manquants, les {}
mal placées ou encore les ==
qui auraient dû être =
.
Cependant, ce qui prime avant tout, c'est la cohérence de l'ensemble. Si vous choisissez d'écrire Hello, World!
, veillez à le faire de manière uniforme, que ce soit dans vos exemples, vos commentaires ou l'ensemble de votre documentation.
Conclusion¤
Le langage C, inventé dans les années 70 par des pionniers de l'informatique, reste aujourd'hui un pilier fondamental dans le monde de la programmation, notamment pour le développement d'applications embarquées et de systèmes d'exploitation. Son efficacité, sa proximité avec le matériel, et sa capacité à offrir un contrôle précis des ressources en font un langage toujours pertinent, malgré l'émergence de concurrents modernes comme Rust ou Zig.
Son histoire, riche et marquée par des figures emblématiques telles que Dennis Ritchie et Ken Thompson, ainsi que son influence sur de nombreux autres langages, témoigne de sa longévité et de son importance. Apprendre le C, c'est non seulement saisir les bases de la programmation, mais aussi acquérir des compétences indispensables pour tout développeur désireux de maîtriser les rouages du matériel et des systèmes informatiques.
Le développement en C suit un cycle rigoureux, comportant plusieurs étapes que chaque développeur doit comprendre. Maintenant que vous avez réussi à compiler votre premier programme, vous êtes prêt pour la suite...
Exercices de Révision¤
Exercice 1 : Exercice
Ouvrez le standard C99 et cherchez la valeur maximale possible de la constante ULLONG_MAX
. Que vaut-elle ?
Solution
Au paragraphe §5.2.4.2.1-1 on peut lire que ULLONG_MAX
est encodé sur 64-bits et donc que sa valeur est \(2^{64}-1\) donc 18'446'744'073'709'551'615
.
Exercice 2 : Hello World
Pouvez-vous écrire, puis compiler votre premier programme en C ? Rédiger le programme hello.c
qui affiche Hello, World!
à l'écran.
Exécutez le programme et vérifiez que le message s'affiche bien.
Exercice 3 : Auteurs
Qui a inventé le C ?
Exercice 4 : Standard International
Quel est le standard C à utiliser dans l'industrie en 2024 et pourquoi ?
Solution
Le standard industriel, malgré que nous soyons en 2024 est toujours ISO/IEC 9899:2017, car peu de changements majeurs ont été apportés au langage depuis et les entreprises préfèrent migrer sur C++ plutôt que d'adopter un standard plus récent qui n'apporte que peu de changements.
Exercice 5 : Paradigmes
Quels est le paradigme de programmation supportés par C ?
Solution
C supporte les paradigmes impératifs, structurés et procédural.
Exercice 6 : Langage impératif
Pourriez-vous définir ce qu'est la programmation impérative ?
Solution
La programmation impérative consiste en des séquences de commandes ordonnées. C'est-à-dire que les séquences sont exécutées dans un ordre définis les unes à la suite d’autres.
Exercice 7 : Coulée de lave
Qu'est-ce qu'une coulée de lave en informatique ?
Solution
Lorsqu'un code immature est mis en production, l'industriel qui le publie risque un retour de flamme dû aux bogues et mécontentement des clients. Afin d'éviter une coulée de lave il est important qu'un programme soit testé et soumis à une équipe de beta-testing qui s'assure qu'outre le respect des spécifications initiales, le programme soit utilisable facilement par le public cible. Il s'agit aussi d'étudier l'ergonomie du programme.
Un programme peut respecter le cahier des charges, être convenablement testé, fonctionner parfaitement, mais être difficile à l'utilisation, car certaines fonctionnalités sont peu ou pas documentées. La surcharge du service de support par des clients perdus peut également être assimilée à une coulée de lave.
Exercice 8 : Cat
Qu'est-ce que cat
?
Solution
cat
est un programme normalisé POSIX prenant en entrée un fichier et l'affichant à l'écran. Il est utilisé notamment dans cet ouvrage pour montrer que le contenu du fichier hello.c
est bel et bien celui attendu.