Programmation : C

Langage C
HISTORIQUE DU C
Résumé
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,...





Retour




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






Retour





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.





Retour





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.




Retour




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");
}

Retour




Les éléments du langage:

un commentaire débute par /* et se termine par */:        /* exemple*/
Les commentaires ne peuvent ê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 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 on 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.
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.
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.
un bloc d'instructions est matérialisé par { et }.
printf()est une fonction de la bibliothèque; elle écrit sur la sortie standard du programme (slide 28).
une chaîne de caractères est toujours entre " "
                 \n permet de passer A la ligne suivante (newline).
toutes les instructions se terminent par un point-virgule ;



Retour



Langage C Partie I: Introduction