Академический Документы
Профессиональный Документы
Культура Документы
Cet article est un bref historique du langage C ; de ses origines (CPL, BCPL, B) ses volutions (K&R, ANSI, C++, ...) Votre avis et vos suggestions nous intressent ! De mme que des informations complmentaires (citations, URL, images, codes, ...) ou des corrections. Alors aprs votre lecture, n'hsitez pas :
I - Origines................................................................................................................................................................... 3 I-A - Le CPL........................................................................................................................................................... 3 I-B - Le BCPL.........................................................................................................................................................3 I-C - Le B................................................................................................................................................................3 I-D - Le C............................................................................................................................................................... 4 II - volutions............................................................................................................................................................... 6 II-A - 1978 - K&R C............................................................................................................................................... 6 II-B - 1983 - C++....................................................................................................................................................6 II-C - 1983 - Objective-C........................................................................................................................................6 II-D - 1989 - ANSI C.............................................................................................................................................. 7 II-E - 1998 - Standard C++.................................................................................................................................... 7 II-F - 1999 - C99.................................................................................................................................................... 7 III - Hritage historique................................................................................................................................................ 8 III-A - Pointeurs et tableaux................................................................................................................................... 8 III-A-1 - Dclaration avec []...............................................................................................................................8 III-A-2 - Pointeur et premier lment de tableau..............................................................................................8 III-A-3 - Oprateur []......................................................................................................................................... 9 III-B - Conversions de type.................................................................................................................................... 9 III-C - int implicite................................................................................................................................................... 9 III-D - Conversions arithmtiques.........................................................................................................................10 III-E - Paramtres de fonction..............................................................................................................................10 III-E-1 - Dclaration implicite de fonction....................................................................................................... 10 III-E-2 - Dclaration de fonction......................................................................................................................10 III-E-3 - Style K&R C de dfinition de fonction...............................................................................................11 III-E-4 - Promotion des paramtres................................................................................................................ 11 III-E-5 - Prototypes, void, procdure.............................................................................................................. 11 III-F - Chanes littrales de caractres................................................................................................................ 12 IV - Remerciements................................................................................................................................................... 13
-2 Marc Mongenet Ce cours est disponible selon les termes de la Creative Commons Attribution 2.5 License.
I - Origines
Le langage C possde trois anctres : le CPL, le BCPL et le B.
I-A - Le CPL
Le langage CPL (pour Combined Programming Language) a t conu au dbut des annes 1960 par les universits de Cambridge et de Londres. C'tait un grand projet acadmique consistant crer un langage englobant beaucoup de concepts. Le CPL devait notamment tre fortement typ, avec de nombreux types comme des nombres entiers, rels, boolens, caractres, tableaux, listes... Le CPL tait trop complexe pour l'poque et il semble que personne n'ait russi terminer l'criture d'un compilateur. Ce langage a disparu sans laisser de trace quelque part dans les annes 1970. Rf. : LinuxGuruz, Wikipdia
I-B - Le BCPL
Le langage BCPL (pour Basic CPL) a t conu Cambridge en 1966 par Martin Richards. L'anne suivante, il alla au MIT et crivit un premier compilateur. Le BCPL est une version fortement simplifie du langage CPL avec notamment un seul type de donne, le mot machine, c'est--dire le nombre typique de bits que le processeur d'un ordinateur traite en une instruction-machine (addition, soustraction, multiplication, copie...). La notion est devenue un peu floue avec les processeurs actuels qui peuvent traiter des donnes de toutes sortes de tailles. Cependant, on peut raisonnablement classer les Pentium et PowerPC parmi les processeurs 32 bits, contre 64 bits pour les Alpha, Itanium ou Opteron. Du temps du BCPL, on trouvait des architectures mots de 40 bits, 36 bits, 18 bits, 16 bits... Le BCPL opre sur les mots de la machine. Il est donc la fois portable et proche du matriel, donc efficace pour la programmation systme. Le langage BCPL a servi crire divers systmes d'exploitation de l'poque, dont un (TripOS) qui s'est retrouv partiellement port sur l'Amiga pour devenir la partie AmigaDOS du systme. Mais aujourd'hui, le BCPL ne semble plus tre utilis que par son inventeur. C'est sans doute d au fait que le langage C a repris et tendu la plupart des qualits de BCPL. Rfrence : manuel BCPL Exemple de code BCPL (tir de Clive Feather on CPL and BCPL) :
MANIFEST ${ TOPFACT = 10 $} // Equivalent of "const int TOPFACT = 10" LET infact (n) = VALOF $( LET f, j = 1., 0. FOR i = 0 TO n $( f #*:= j; fact!i := f; j #+:= 1. $) RESULTIS f // Declares i for the next block only // := is assign, = is compare // assignment doesn't return a value
// As in B, allocates 0 to TOPFACT
I-C - Le B
Le langage B a t cr par Ken Thompson vers 1970 dans les laboratoires Bell d'AT&T. L'anne prcdente, il avait crit en assembleur la premire version d'UNIX sur un PDP-7 contenant 8 kilo mots de 18 bits. Lorsqu'il voulut
-3 Marc Mongenet Ce cours est disponible selon les termes de la Creative Commons Attribution 2.5 License.
proposer un langage sur ce nouveau systme d'exploitation, il semble qu'il ait d'abord pens porter Fortran, mais que trs vite (en une semaine) il conut son propre langage : B. Le B est une simplification de BCPL, un peu force par les limitations du PDP-7. Mais la syntaxe trs sobre du B (et des commandes UNIX) toute en lettres minuscules correspond surtout aux gots de Thompson. Le langage C a repris la syntaxe du B avec un minimum de changements. Le langage B a t port et utilis sur quelques autres systmes. Mais cette mme anne 1970, le succs du projet UNIX justifia l'achat d'un PDP-11. Celui-ci avait des mots machine de 16 bits, mais il tait aussi capable de traiter des octets (24 ko de mmoire vive en tout) dans chacun desquels pouvait tre stock un caractre. Le B ne traitait que des mots machine, donc le passage de 18 16 bits n'tait pas problmatique, mais il tait impossible de traiter efficacement les caractres de 8 bits. Pour bien exploiter les capacits de la machine, le B a donc commenc tre tendu en ajoutant un type pour les caractres... Rfrence : Thompson's BManual Exemple de code B identique au code BCPL ci-dessus (tir de Clive Feather on CPL and BCPL) :
infact (n) { auto f, i, j; extrn fact;
/* no initialization for auto variables */ /* "What would I do differently if designing * UNIX today? I'd spell creat() with an e." * -- Ken Thompson, approx. wording */
f = 1.; /* floating point constant */ j = 0.; for (i = 0; i <= n; ++i) { fact[i] = f =#* j; /* note spelling =#* not #*= */ j =#+ 1.; /* #+ for floating add */ } } return (f); /* at least, I think the () were required */ /* equivalent of #define, allows numeric values only */
I-D - Le C
Le langage C a t dvelopp par un collgue de Ken Thompson, Dennis Ritchie qui pensait d'abord faire uniquement un New B ou NB. Mais en plus des caractres, Ritchie ajouta les tableaux, les pointeurs, les nombres virgule flottante, les structures... 1972 fut l'anne de dveloppement la plus productive et sans doute l'anne de baptme de C. En 1973, le langage C fut suffisamment au point pour que 90 % d'UNIX puisse tre rcrit avec. En 1974, les laboratoires Bell ont accord des licences UNIX aux universits et c'est ainsi que le langage C a commenc tre distribu. Rfrences : The Development of the C Language, Very early C compilers and language Exemple de code C identique aux codes BCPL et B ci-dessus (tir de Clive Feather on CPL and BCPL) :
float infact (n) int n; { float f = 1; int i; extern float fact[]; for (i = 0; i <= n; ++i) fact[i] = f *= i; return d; -4 Marc Mongenet Ce cours est disponible selon les termes de la Creative Commons Attribution 2.5 License.
Historique du langage C par Marc Mongenet (Site personnel) } #define TOPFACT 10 float fact[TOPFACT+1];
Voir Ken Thompson (assis) et Dennis Ritchie devant un PDP-11 fonctionnant avec UNIX vers 1972.
-5 Marc Mongenet Ce cours est disponible selon les termes de la Creative Commons Attribution 2.5 License.
II - volutions
Une fois rendu public, le langage C a peu chang. Pratiquement toutes les extensions se sont faites dans C++, qui est une gigantesque extension du C. Une autre volution du C est Objective-C, qui se concentre sur l'orientation objet. De nombreux autres langages comme Java, JavaScript ou C# ont largement repris la syntaxe du C, mais sans tre compatibles.
La plus ancienne version du langage C encore en usage a t formalise en 1978 lorsque Brian Kernighan et Dennis Ritchie ont publi la premire dition du livre Le langage C. Ce livre dcrit ce qu'on appelle actuellement le K&R C, le C traditionnel, voire le vieux C. Peu aprs sa publication, de trs nombreux compilateurs C ont commenc apparatre. Les programmes portables crits dans les annes 1980 sont donc en K&R C. De fait, quelques programmes trs portables sont encore en K&R C (par exemple GNU Make). En effet, de nombreux systmes commerciaux ne proposent qu'un compilateur K&R C en standard, le compilateur ANSI C devant tre achet sparment. Heureusement, la disponibilit presque universelle de GCC rsout pratiquement ce problme.
partir de 1980, Bjarne Stroustrup a tendu le langage C avec le concept de classe. Ce langage tendu a d'abord t appel C with Classes, puis le C++ en 1983. Le langage C++ a normment volu (surcharge d'oprateurs, hritage, rfrences, types gnriques, exceptions...), mais en restant le plus compatible possible avec C. Il est souvent possible de compiler un programme en C avec un compilateur C++.
Le langage Objective-C a t cr par Brad Cox. C'est un strict sur ensemble de C. Il lui apporte un support de la programmation oriente objet inspir de Smalltalk. Ce langage est la base de NeXTSTEP. Avec le rachat de NeXT par Apple, l'Objective-C s'est retrouv la base de l'interface graphique Cocoa de Mac OS X.
-6 Marc Mongenet Ce cours est disponible selon les termes de la Creative Commons Attribution 2.5 License.
Un comit de standardisation a t cr en 1983 pour viter que les quelques ambiguts et insuffisances du K&R C ne conduisent des divergences importantes entre les compilateurs. Il a publi en 1989 le standard appel ANSI C. Il a repris quelques bonnes ides du C++ comme les prototypes de fonction, tout en restant trs compatible avec K&R C. Le degr de compatibilit atteint est suffisant pour que Kernighan et Ritchie n'aient eu qu' adapter lgrement la seconde dition du livre Le langage C pour qu'il dcrive ANSI C. En plus, selon Stroustrup, tous les exemples de cette seconde dition sont aussi des programmes C++. Le standard ANSI C est devenu l'volution la plus utilise du C.
Le C++ a volu trs longtemps. Ce n'est qu'en 1998, 8 ans aprs la cration d'un comit, que le standard ISO C++ a t officiellement publi. Ce standard est tellement complexe (et lgrement incohrent), qu'en 2003, le compilateur GCC ne le met pas compltement en uvre, et ce n'est pas le seul. Les syntaxes obsoltes et problmatiques de K&R C ont t abandonnes ; pour le reste, la compatibilit avec le C reste excellente.
Le dernier-n de l'histoire est le C99 (standard ISO de 1999) qui est une petite volution de l'ANSI C de 1989. Les volutions ne sont pas compatibles avec le C++ et n'ont pas attir beaucoup d'intrt. GCC supporte le C99 et le noyau Linux en tire profit. Ct compatibilit, le support des syntaxes obsoltes de K&R C a t abandonn.
-7 Marc Mongenet Ce cours est disponible selon les termes de la Creative Commons Attribution 2.5 License.
Les premires versions du C n'avaient donc en fait que des pointeurs. La trace la plus visible de cet hritage se retrouve dans la dclaration classique de la fonction main :
int main(int argc, char* argv[]);
Encore aujourd'hui, l'oprateur [] dans un paramtre formel de fonction dclare un pointeur. Cet usage trompeur est inusit, sauf pour main. La dclaration prcdente est donc tout fait quivalente :
int main(int argc, char** argv);
Il est impossible de dclarer un paramtre formel de type tableau. En revanche, il est possible de dclarer un pointeur sur un tableau. Les dclarations suivantes sont quivalentes, car f reoit en fait un pointeur de tableau de 13 int :
void f(int tab[2][13]); void f(int tab[][13]); void f(int (*tab)[13]); /* Le 2 est ignor ! */ /* Usage le plus clair */
-8 Marc Mongenet Ce cours est disponible selon les termes de la Creative Commons Attribution 2.5 License.
III-A-3 - Oprateur []
Alors que les tableaux n'existaient pas encore, l'oprateur d'indexation [] existait dj. Ses oprandes sont donc un pointeur et un entier : l'expression E1[E2] est quivalente *((E1)+(E2)) et une des deux expressions doit tre de type pointeur et l'autre de type entier. Si une des deux expressions est un nom de tableau, elle sera alors automatiquement convertie en un pointeur sur le premier lment. Le rsultat de l'addition est un pointeur sur l'lment voulu, drfrenc par *. noter que E1[E2] est quivalent *((E1)+(E2)) qui est quivalent *((E2)+(E1)) qui est quivalent E2[E1]. Les deux expressions suivantes sont donc quivalentes :
t[3] = 6; 3[t] = 6; /* *(t+3) = 6; */ /* *(3+t) = 6; */
Cela vient du fait que les types n'ont pas t ajouts au langage C pour permettre au compilateur de faire des vrifications smantiques. l'origine, les types ont t ajouts simplement pour traiter des variables de diffrentes tailles, notamment des caractres de 8 bits lorsque les mots machine mesurent 16 bits. Les conversions automatiques de type taient alors une puissante fonctionnalit. mesure que le C a t utilis pour de grands projets, le besoin de vrifications de type s'est plus fait sentir. Les compilateurs ont commenc signaler les conversions entre pointeur et entier ou entre pointeurs incompatibles. Les conversions automatiques impliquant des pointeurs ont finalement t retires de C++. En effet, la vrification statique des types est un des points forts de C++.
-9 Marc Mongenet Ce cours est disponible selon les termes de la Creative Commons Attribution 2.5 License.
Une particularit est qu'aucune opration ne s'effectue avec une prcision infrieure int. Autrement dit, si l'on additionne deux short, ils seront chacun convertis en int avant que l'opration ait lieu. C'est encore un hritage de l'importance du mot machine :
short f(short a, short b) { /* Valeurs de a et b converties en int avant l'addition. Le rsultat int de l'addition est converti en short pour tre retourn, d'o possibilit d'avertissement du compilateur ! */ return a + b; }
/* Dclaration de la fonction printf, ne prcise pas les paramtres de printf. */ /* Appel non compatible, causera une erreur, mais seulement l'excution ! */
- 10 Marc Mongenet Ce cours est disponible selon les termes de la Creative Commons Attribution 2.5 License.
Malgr l'introduction des prototypes, on trouve encore une trace de cela avec les fonctions nombre variable de paramtres, comme int printf(const char*,...);. Pour afficher un short, on utilise le formatage %d comme pour un int. En effet, le short est promu en int avant d'tre pass printf :
#include <stdio.h> int main() { int i = 1; short s = 2; printf("%d %d\n", i, s); return 0; }
/* affiche 1 2 */
/* erreurs
/* dfinition */
- 11 Marc Mongenet Ce cours est disponible selon les termes de la Creative Commons Attribution 2.5 License.
La dernire ligne est une erreur en C deux titres. D'abord, la redfinition de fonction est interdite (et la surcharge n'existe pas). Ensuite, la dfinition n'est pas compatible avec le prototype. En revanche, on remarque que le prototype est compatible avec la dclaration. Pour C++, il y a simplement deux prototypes et deux dfinitions, pour deux fonctions surcharges. L'introduction du type void rend galement possible la cration de procdures en C, c'est--dire des fonctions ne retournant rien.
Or, cet usage aurait caus un avertissement du compilateur cause de la conversion de const char[] en char[]. Dans le standard ANSI C, les chanes littrales gardent donc le type char[], bien qu'elles soient considres comme constantes. Rfrence : explication de Dennis Ritchie. Lors de la standardisation de C++, le type des chanes littrales a tout de mme t chang en tableau de caractres constants . Cela est ncessaire pour choisir la bonne fonction parmi deux fonctions surcharges dont seule la constance du pointeur change. Toutefois la construction char*p="texte"; reste permise, mais dprcie.
- 12 Marc Mongenet Ce cours est disponible selon les termes de la Creative Commons Attribution 2.5 License.
IV - Remerciements
L'quipe C de Developpez.com tient remercier Wachter pour la relecture orthographique de cet article
- 13 Marc Mongenet Ce cours est disponible selon les termes de la Creative Commons Attribution 2.5 License.