|
Brian Kernighan et Dennis Ritchie
(Laboratoires Bell, Etats-Unis) ont proposé le langage C
en 1978. Initialement le langage C a été conçu pour
le développement du système Unix; il. est le successeur
du langage B, dû à Ken Thompson, l'un des inventeurs de Unix.
Pour cette raison, C est muni d'opérateurs et de constructions
permettant de travailler au niveau du codage machine des instructions
et des données; en ce sens, il s'apparente à un langage
d'assembleur.
Cependant C appartient aussi à la famille des langages de programmation
structurée et modulaire, héritant du langage Algol et
s'apparentant à Pascal, Ada, ... C est également un langage
de haut niveau.
Initialement écrit en assembleur, puis en langage B, le système
Unix est écrit à 90 % en C (le reste est encore en assembleur).
Par conséquent, toute programmation orientée système
sous Unix s'effectue de manière particulièrement aisée
en C (accès facile aux fonctions du noyau).
Le langage C est également disponible sur un grand nombre de
machines et de systèmes: DOS, CP/M, VMS, MVS,...
Haut de la page
Les concepts du
langage C
Domaines d'utilisation :
Programmation
système (noyau Unix, driver, ...)
Logiciel
de base (LEX, YACC, compilateurs, ...)
Traitement
de textes (nroff, troff, ...)
Bases
de données relationnelles (PROLOG, LISP, ...)
Intelligence
artificielle Avantages :
 
Compacité du code généré
 
Optimisation du code
 
Modularité
 
Interface minimale avec le système:
 -
Pas d'instructions dE/S
 -
Pas d'instructions de programmation parallèle
 
Pas de spécialisation
 
Réentrance des codes générés sous Unix
Haut de la page
Normalisation du
langage
1989
: parution de la norme ANSI (American National Standards Institute)
du langage C, donne les spécifications de la bibliothèque
standard du langage C.
1990 : API-POSIX,
description d'une interface de programmation reproduisant un ensemble
portable de fonctionnalisés du. système Unix : création
de nouveaux processus, gestion de l'arborescence du système de
fichiers, communications, ...
1993 : POSIX-2:
pour l'interpéteur de commandes, bibliothèque de développement
d'applications.
Haut de la page
Caractéristiques
du langage C
 Il
est simple à employer : ensemble d'instructions réduit,
syntaxe facile à maîtriser.
 C
est un langage proche du système, il permet d'accéder
très facilement à un grand nombre de mécanismes et
de fonctions spécifiques à chaque système, par l'intermédiaire
d'une bibliothèque standard. Toutes les opérations d'entrée
/ sortie par exemple sont définies de cette manière.
 C
est un langage universel, convenant aussi bien à la programmation
système (sa vocation initiale) qu'au codage d'algorithmes complexes,
au développement d'interfaces ou au calcul numérique.
 Les
programmes écrits en C sont assez fortement portables d'une
machine à une autre, y compris sur des systèmes différents...
attention toutefois à respecter certaines règles de "bonne
conduite". Voir la section 'Programmer en C' plus
loin dans ce document.
 C
possède un jeu très riche dopérateurs, ce
qui permet l'accès à la quasi - totalité. des ressources
de la machine. On peut par exemple faire de I'adressage indirect ou utiliser
des opérateurs d'incrémentation on de décalage. On
peut aussi préciser qu'on souhaite implanter une variable dans
un registre. En conséquence, on peut écrire des programmes
presque aussi efficaces qu'en assembleur, tout en programmant de manière
structurée.
 De
façon analogue à ALGOL68, la plupart des constructions C
(fonctions ou expressions) renvoient une valeur; ceci permet de s'exprimer
de façon souvent plus concise que dans d'autres langages.
 Le
langage est faiblement typé. Cette permissivité relativement
grande permet l'utilisation judicieuse des ressources matérielles,
mais peut aussi évidemment conduire à de mauvaises habitudes
de programmation. C'est pourquoi un outil supplémentaire, lint,
existe en tant qu'utilitaire propre, permettant un contrôle plus
rigoureux de la sémantique et des correspondances de types, en
indiquant des incohérences non détectées par le compilateur.
Notons toutefois que le programmeur peut très bien décider
de garder ces incohérences, ou même de jouer sur elles à
des fins d'efficacité par exemple.
 Le
laxisme du langage et du compilateur, qui donne une grande liberté
au compilateur, n'est cependant pas sans dangers. II peut en effet aboutir
à des erreurs d'exécution difficiles à déceler,
par exemple un débordement de tableau non testé ou un point-virgule
oublié on mal placé, entraînant un comportement parfois
déroutant. II faut donc programmer de manière précise
et claire, d'autant plus que les programmes C ont une certaine tendance
à être peu lisibles si on ne fait pas un effort particulier
au niveau de la présentation et de la rigueur.
Haut de la page
Mes premiers programmes
C
Mon premier programme
en C A
NE SURTOUT PAS RETENIR CAR ILLISIBLE
#include <stdio.h>
main(t,_,a)
char *a;
{return!0<t?t<3?main(-79,-13,a+main(-87,1-_,
main(-86, 0, a+1 )+a)):1,t<_?main(t+1.,_,
a ):3,main ( -94, -27+t, a )
&&t == 2 ?_<13?main
( 2, _+1, "%s %d %d\n" ):9:16:t<0?t<-72?.main(_, t,
"@n'+.#'/*{}w+/v#cdnr/+,{}r/*de}+./*{*+./v{*/*+,/v#q#n+,/#{1,+,/n{n+,/+#n+,/#;\
#q#n+,/+k#;*+,/'r :1d*13,Xw+Kw'K:'+}e#l;dq#11
q#l+d'K#!/+k#;\
q#lr}eKK#}wlr}eKK{nlll/#;#q#n,){)#}w'){){nlll/+#nl;d}rw1i;#
Knll!/n{n#l; \
r{#vlr nc{nll'/#{1,+IK{rvI
iK{;[{nll'/v#q#\
nlwk nw' iwk{KK{nll!/v{%11##w#'i;
:{nlll/*{q#lld;r'}{nlwb!/*de}lc;;\
{nll-{}rvlll+,}##'*}#nc,',#nvll/+kdl+e}+;\
#Irdq#v! nrl/ 1) }+}{rl#l{n,I)#
}'+}##(!!/")
:t<-50?-==*a ?putchar(a[311):inain(-65,_,a+l):main((
*a == 1/1) + t, ---
a +1 M<t?main ( 2, 2 , "%s"):*a==,/,ilmain(O,main(-61,<
*a, "!ek;dc iCbK'(q)-[w]*'/.n+r3#1,{}:\nuwloca-D;mvpbks,fxntdCeghiry"),a+l);}
Mon deuxième programme C
void mult(double *matrix1,
double *matrix2, double *res_matrix, int 11, Int cl, Int C2)
{

int i, j, k ;
 double
*p1, *p2, *p3 ;
 p3
= res_matrix ;
 for
(i=0 ; i < 11 ; i++)
 
for (j = 0 ; j < c2 ; j++)
   {
   p1
= matrix1 + i*c1 ;
   p2
= matrix2 + j ;
   *p3
= 0. ;
   for
(k = 0 ; k < c1 ; k++)
   
{
     *p3
+= (*(p1++)) * (*p2) ;
     p2
+= c2 ;
    }
 
p3++ ;
  }
}
Mon troisième
programme C
/* troisième
programme C - qui fait peu de choses...
 auteur
: Brigitte Wrobel-Dautcourt
 date
do création: 22 septembre 1998
*/
# include <stdio.h>
void afficher (void);
void main(void)
{
afficher();
}
void afficher (void)
{
printf("Bienvenue au
club des initiés \n");
}
Haut de la page
Les éléments
du langage
 Les
commentaires :
 
Un commentaire débute par /* et se termine par */: /*
ceci est un exemple de commentaire */
 
ATTENTION : Les commentaires
ne peuvent pas être imbriqués : /* ceci est /*
incorrect */ */
 
Les commentaires sont éliminés par le pré processeur
C lors de la phase de pré traitement.
 Le
fichier studio.h
 
Il contient des déclarations de constantes, de types, d'entêtes
de fonctions utiles au programme.
 
Son contenu est inclus par la directive #include(voir page
35 et slide 90).
 De
manière générale
 
Chaque fonction d'un programme doit être
définie ou déclarée avant d'être utilisée.
  =>
Ceci permet au compilateur de connaître toutes les informations
utiles à une gestion correcte des appels et des instructions.
 Void
 
la définition d'une fonction commence ici par le mot void,
qui indique que cette fonction ne retourne aucune valeur.
 
Ce mot est suivi du nom de la fonction (ici affiche) et de la
liste de ses paramètres entre parenthéses;
 
le mot void précise que cette liste de paramètres
est vide.
 Main
 
la fonction principale du programme s'appelle toujours main (programme
principal);
 
elle représente le point d'entrée dans le corps du programme
et elle est appelle automatiquement lors du lancement du programme.
 
Tout programme C doit en posséder une et une seule.
 Bloc
d'instruction
 
Il est matérialisé par { et }.
 printf()
 
C' est une fonction de la bibliothèque.
 
Elle écrit sur la sortie standard du programme (slide
28).
 Chaîne
de caractères
 
Elle doit toujours être entre " "
 
\n permet de passer à la ligne suivante (newline).
Fin
des instructions
 
toujours par un point-virgule ;
Haut de la page
Langage C Partie I: Introduction
|