Le langage C
Première partie
Par :
Guilhem de Wailly (gdw@erian-concept.com)
Résumé
Dans cette série d'articles, nous présentons le langage C. Il ne
s'agit pas de réécrire les ouvrages de référence donnés en annexe,
mais de donner, au travers du C, une méthode de programmation
basée sur la notion d'interface.
Au fur et à mesure de notre progression, nous décrirons les
éléments indispensables du langage et conduirons le lecteur à
consulter les ouvrages de références. Le but poursuivit est
clairement de parvenir a construire des programmes de manière
segmentée.
Dans cet première partie, nous n'échapperons pas au traditionnel
"hello word" ! Nous décrions aussi la manière d'utiliser les outils
propres au C, comme le compilateur et le lieur.
Cette présentation est basée sur les outils GNU comme gcc, ld et
ar et le débogueur gdb. Elle peut être transposée dans d'autres
environnements comme les plateformes Microsoft, bien que les
outils y soit souvent complètement intégrés, confisquant du même
coup la souplesse, la puissance et la liberté à l'utilisateur.
Introduction
Ce langage fut créé en 1972 dans les laboratoires Bell AT&R par
Dennis Ritchie. C'est un langage algorithmique et impératif
appartenant à la même famille que Pascal, PL/1.
C'est un langage primitif, à la frontière de l'assembleur et des
langages évolués. Il est facile à compiler, facile à porter vers
d'autres machines. En effet, il a été conçut de manière à ce que le
compilateur soit simple et rapide.
Dans les premiers temps, Unix était écrit en assembleur (langage
machine) et en B, un ancêtre du C, non typé. Le portage vers
d'autres ordinateurs posait des problèmes. L'idée fut de réécrire
le plus de code possible de Unix en C. Seules certaines parties
demeurent écrites en assembleur. Unix étant très utilisés dans les
Universités, le langage C devint vite populaire et très utilisé. On
le trouve sur quasiment toutes les architectures, du processeur
spécialisé pour le traitement du signal (DSP), en passant par les
micro-ordinateurs, jusqu'aux super calculateurs.
Un programme C est portable d'une architecture à l'autre.
Cependant, le portage peut poser des problèmes, notamment en
ce qui concerne la taille des mots. Ainsi, sur un 8086, un entier
est codé sur 16 bits, alors que sur un 386, il est codé sur 32 bits.
Le C est utilisé pour programmer des applications aussi diverse
que les systèmes d'exploitation, les gestionnaires de base de
données, les interfaces graphiques.
Le langage C est normalisé par l'American National Standard
Institut (ANSI) depuis 1982. Avant cette normalisation, le
langage C était `` normalisé '' par une annexe du livre de Brian
Kernignan et Dennis Ritchie, connue sous le nom de K&R.
Le langage C a continué d'évoluer en se dotant d'un moteur à
Objet pour donner naissance au langage C++, conçu par Bjarn
Stroustrup. Le langage C++ offre de réelles innovations, mais les
compilateur C++ restent lents, et les puristes préfèrent continuer
à développer en C.
Au cours de ces articles, nous montrerons comme programmer
en C en utilisant une `` approche orientée objets ''.
Hello Word!
Nous supposons que nous travaillons sur une station Unix, de
préférence Linux. Le compilateur C a été correctement installé,
ainsi que les bibliothèques de développement.
Nous recommandons de travailler avec l'éditeur de texte emacs
ou jed, qui possèdent tous les deux un mode C qui reconnaît la
syntaxe C. Emacs va plus loin puisqu'il permet de compiler
automatique les programmes, de les déboguer : il propose un
véritable environnement de programmation C.
Plaçons-nous dans un répertoire de travail. Tapons le fichier
suivant, nommé hello.c :
#include <stdio.h>
void main (void) {
printf ("hello word !\n");
}
Emacs permet d'indenter correctement les programmes. Pour
cela, taper la touche TAB au début sur une ligne (ou au début
d'une ligne). Au lieu de placer une tabulation, emacs indente la
ligne (indenter signifie placer des blancs au début des lignes
pour montrer la hiérarchie des blocs du programme). Seule la
première pression sur TAB à un effet, les autres sont ignorées.
Donc, lorsque l'on tape ENTER pour retourner au début de la
ligne, on tape aussi TAB pour indenter la ligne.
La mise en forme de emacs est conforme à l'usage. Cela ne veut
pas dire que le programme ne sera pas reconnu si l'on opte pour
une autre mise en forme. En fait, seules les lignes commençant
par # doivent être suivies d'un saut à la ligne. Les autres peuvent
être écrites comme l'on souhaite, comme :
#include <stdio.h>
void main(void){printf("hello word !\n");}
Le programme est constitué de mots séparés par des séparateurs.
Le séparateur le plus important est le blanc. En C, un blanc est
un espace, une tabulation, un saut à la ligne, ou toute autre
combinaison de blancs. Les autres séparateurs sont < > ( ) " {
} [ ] ; , et les opérateurs arithmétiques. Le lecteur se référera
aux ouvrages cités en annexe pour lire la grammaire complète du
langage C.
On reconnaît donc les mots #include, stdio.h, void,
main et printf. Comme dans la plupart des autres langages,
les chaînes de caractères constantes sont entourées de guillemets.
Attention, le C fait la différence entre les minuscules et les
majuscules.
La première ligne indique au compilateur d'utiliser la
bibliothèque des entrées / sorties standard. Nous verrons plus
tard ce que cela implique exactement.
La ligne suivante définit une fonction appelée main. Cette
fonction ne retourne rien (premier void) et n'a pas de
paramètres (void entre parenthèses). La fonction main est un
peut particulière : dans tout programme C, quelque soit sa taille,
il n'y a qu'une seule fonction appelée main, et c'est le point
d'entrée du programme.
Ce qui est placé entre les accolades constitue le corps de la
fonction : ce sont des instructions séparées par des points
virgules. Ce corps ne comporte qu'une seule instruction. C'est un
appel à la fonction printf, avec comme argument, la chaîne de
caractères constante Hello word !\n La fonction printf st