C (langage)
| Image manquante Langage_progr.png image:Langage_progr.png |
| Cet article fait partie de la série Langages de programmation |
| Langages à objets |
| Ada 95 - C++ - C# Common Lisp Delphi - Eiffel - Java Nice - Oz - Python Simula - Smalltalk Visual Basic |
| Langages impératifs |
| APL - ASP - Assembleur BASIC - C - COBOL Forth - FORTRAN - Logo Pascal - Perl - PHP |
| Langages fonctionnels |
| Erlang - Haskell ML/OCaml - Oz Lisp/Common Lisp Scheme |
| Langages déclaratifs |
| Clips - Oz - Prolog |
| Langages concurrents |
| Ada 95 - Erlang Java - Oz |
| Langages balisés |
| HTML - SGML - XML Dialectes XML S-expressions |
| Voir aussi |
| Conception - Codage Tests - Optimisations |
En informatique, C est un langage de programmation impératif. C’est un des langages les plus utilisés pour deux raisons :
- Il est très facile à porter d’une machine à une autre (le compilateur est écrit en C : il y a juste à changer les routines de génération de code et à le faire se compiler lui-même pour une machine cible)
- Il n’est pas très éloigné de la machine.
Ses principaux inconvénients sont que sa complexité est généralement mal connue, et que la plupart des développeurs ne comprennent pas certaines subtilités de ce langage, rendant les bugs faciles. Par ailleurs, un programme écrit en C, mais mal écrit n’est pas portable, vu que certains comportements sont non définis.
| Sommaire |
|
|
Histoire
Le langage C est apparu au cours de l’année 1972 dans les Laboratoires Bell. Il était développé en même temps qu’UNIX par Dennis Ritchie et Ken Thompson. Ken Thompson avait développé un prédécesseur de C, le langage B. Dennis Ritchie a fait évoluer le langage B dans une nouvelle version suffisamment différente pour qu’elle soit appelée C. Par la suite, Brian Kernighan aida à populariser le langage. Il procéda aussi à quelques modifications de dernière minute. En 1978 il fut notamment le principal auteur du livre The C Programming Language décrivant le langage enfin fixé; Ritchie s’était occupé des appendices et des exemples avec UNIX. On parle encore de K&R C (pour Kernighan and Ritchie C) lorsqu’on se réfère au langage tel qu’il existait à cette époque.
En 1983, l’institut national américain de normalisation (ANSI) a formé un comité de normalisation du langage qui a abouti en 1989 à l’approbation de la norme dite ANSI C ou C89 (formellement ANSI X3.159-1989). En 1990, cette norme a également été adoptée par l’ISO (formellement ISO/CEI 9899:1990). ANSI C est une évolution du K&R C qui reste extrêmement compatible. Elle reprend quelques idées de C++.
En 1999, une nouvelle évolution du langage est normalisée par l’ISO : C99. Cette norme n’est plus compatible avec le C++.
Description
Le langage C peut être qualifié de bas niveau ou peu typé dans le sens où le langage manipule les mêmes sortes d’objets que la plupart des ordinateurs : des mots machine (pouvant contenir une donnée interprétée comme un nombre, un caractère ou une adresse). Le langage ne propose aucune opération qui traite directement des objets de plus haut niveau (fichier, chaîne de caractères, liste...) et il faut donc faire appel à des fonctions de la bibliothèque standard pour manipuler ce type d’objet.
Le langage C a été utilisé pour rendre le système d’exploitation UNIX plus portable. Il a conservé de cela une très grande efficacité pour tout ce qui concerne le développement système. Ainsi depuis la majorité des grands systèmes d’exploitation ont été développés en C.
De même, le langage ne propose pas en standard la gestion de la programmation orientée objet, ni de mécanisme d’exception, ou de traitement multitâche. Il existe des fonctions standards pour gérer les entrées-sorties et les chaînes de caractères, mais contrairement à d'autres langages, aucun opérateur spécifique pour améliorer l'ergonomie. Ceci rend aisé le remplacement des fonctions standards par des fonctions spécifiquement conçues pour un programme donné. En autorisant la surcharge des opérateurs, C++ permet de mélanger la souplesse de C à l'ergonomie des opérateurs spécifiques.
Ces caractéristiques en font néanmoins un langage à privilégier quand on cherche à maîtriser les ressources utilisées, le code assembleur généré par les compilateurs étant relativement prévisible et parfois même optimal sur les machines d’architecture RISC à grand nombre de registres.
Ce langage est donc extrêmement utilisé dans des domaines comme : la programmation embarquée sur microcontrôleurs, les calculs intensifs, l’écriture de systèmes d’exploitation et tous les modules où la rapidité de traitement est importante. Il est en effet une bonne alternative aux langages assembleurs dans ces domaines avec les avantages d’une syntaxe plus lisible et de la portabilité du code.
En contrepartie, la mise au point de programmes en C, surtout s’ils utilisent des structures de données complexes, est plus difficile qu’avec des langages de plus haut niveau. En effet, dans un souci de performance le langage C impose à l’utilisateur de programmer certains traitements (libération de la mémoire, vérification de la validité des index sur les tableaux...) qui sont pris en charge automatiquement par les langages de haut niveau.
Le C étant un langage simple, son compilateur est assez simple. Sur un nouveau microprocesseur, un compilateur C peut être écrit en deux mois. C’est pour cela qu’il est souvent choisi comme premier langage sur une nouvelle architecture. Le compilateur GNU GCC est d’ailleurs écrit en C : seule la partie de génération de code est à modifier quand on porte le compilateur sur une autre machine, par compilation croisée.
Beaucoup de limitations du langage C ont été levées dans le langage C++ qui est un C avec la notion d’objet.
Beaucoup d’autres langages de programmation ont adopté une syntaxe (notation) ressemblant à celle du langage C, notamment C++, Java, JavaScript, PHP ou C#.
Exemples
Hello world
Voici l’exemple de programme Hello world donné dans The C Programming Language de Brian W. Kernighan et Dennis M. Ritchie :
#include <stdio.h>
main()
{
printf("hello, world\n");
}
#include <stdio.h>inclu des informations à propos de la bibiothèque standard de C.main()indique le début de la fonction principale du programme.- Les accolades
{et </code>}</code> entourent le corps de la fonction. printfest la fonction standard de sortie de texte.- Le
\ndésigne un caractère de saut de ligne. - Un point-virgule
;termine toute instruction.
Quelques instructions C
Instructions du pré-compilateur
#include,
#define,
#pragma (C89),
#if,
#ifdef,
#ifndef,
#elif (C89),
#else,
#endif,
#undef,
#line,
#error.
Mots clés
auto,
break,
case,
const (C89),
continue,
do,
else,
enum (C89),
extern,
for,
goto,
if,
inline (C99),
register,
restrict (C99),
return,
sizeof,
static,
struct,
switch,
typedef,
union,
void (C89),
volatile (C89),
while,
signed (C89),
unsigned,
char,
short,
int,
long,
float,
double,
_Bool (C99),
_Complex (C99),
_Imaginary (C99)
Types
- Types entiers (mot machine) :
int,unsigned int - Types entiers >= 8 bits :
char,signed char,unsigned char - Types entiers >= 16 bits :
short,unsigned short - Types entiers >= 32 bits :
long,unsigned long - Types entiers >= 64 bits (C-99) :
long long,unsigned long long - Types à virgule flottante :
float,double,long double(C89) - Types énumérés :
enum - Types élaborés :
struct,union
Quelques défauts du C
- Le C étant dépouillé volontairement de toute fonctionnalité non rudimentaire, même les opérations les plus simples (opérations sur chaînes de caractères, ordres d’entrée-sortie) se font par des fonctions qui ne peuvent se livrer à aucune vérification syntaxique approfondie au moment de la compilation (hormis une vérification élémentaire du type des arguments). Un programme nommé lint tentait de remédier à ce défaut du langage; quelques fonctionnalités de lint furent par la suite intégrées au compilateur lui-même, et splint fut créé pour remplacer lint.
- Le langage C est faiblement typé. En conséquence, des entreprises comme EADS/Airbus doivent faire faire le travail de vérification de type par des êtres humains, ce qui coûte relativement cher.
- Chaque programmeur C a au moins une fois écrit par mégarde = au lieu de == dans un if()... avec des résultats hautement inattendus, vu qu’une affectation est exécutée au lieu d’un test !
- Le débordement de tableau peut passer inaperçu et avoir des conséquences dramatiques. Il est en général recommandé de ne pas coder plus de douze heures successives en C, même en cas d’enthousiasme, la fatigue causant des erreurs qui passent parfois inaperçues et sont alors très difficiles à repérer par la suite.
- Les erreurs d’allocation mémoire comme un oubli d’allocation, une double désallocation, ou un accès à une zone non allouée sont très difficiles à éviter. Il faut noter qu'un ramasse-miettes conservateur pour le C existe (le collecteur Böhm-Weiser), sous la forme d'une bibliothèque.
Références
Ressources Internet
- The Development of the C Language par Dennis Ritchie
- CFacile, didacticiel
- Cours de C
- FAQ du groupe fr.comp.lang.c
- Le livre de programmation C sur wikilivres
Bibliographie
- B.W.Kernighan D.M.Ritchie, Le langage C, ISBN 2-225-82070-8
Quelques programmes célèbres écrits en C
- UNIX
- La suite de compilateurs GNU Compiler Collection (GCC)
- Le noyau Linux
- Le noyau de Microsoft Windows
- GNOME
Compilateurs C
- GCC (multiples plateformes)
- LCC (multiples plateformes)
- LCC Win32 (Windows)
- TenDRA
- Ten15, un fork de TenDRA
