Historique

Situer le contexte historique du langage C

Tags: Base

Dans les années 60 et 70 l’informatique et la microinformatique sont en pleine croissance. De nombreux fabricants d’ordinateurs livrent leur propre système d’exploitation, généralement écrit en assembleur. L’augmentation de la puissance de ces ordinateurs permet d’envisager la réalisation d’un système multitâches1. De nombreux travaux de recherche académique vont dans ce sens avec notamment le Système d’exploitation Minix proposé par les laboratoires de Bell. Celui-ci, trop complèxe, est abandonné, au profit de Unix.

Le langage BCPL a été l’un des premiers langages créés dans le but spécifique d’écrire du code de haut niveau traduit directement en code machine dans le but de réduire le code assembleur à écrire spécifique à chaque architecture.

Le BCPL a donc été conçu pour être facile à traduire et convertir en code machine, contrairement au Fortran ou au COBOL concus pour aider au calcul scientifique ou financier.

Le langage BCPL est donc à la mode à l’époque de la création du C et de nombreux systèmes d’exploitation commençaient à abandonner leur code assembleur au profit du BCPL. Ce langage apparaissait comme un candidat idéal pour écrire le système d’exploitation UNIX.

C’est en écrivant un interprêteur BCPL pour une machine PDP 7 de DEC, et en manquant de temps pour prendre en charge l’entièreté du BCPL que Ken Thompson crée le langage B. Toutefois, ce langage s’avère limité pour prendre en charge l’architecture plus complexe du PDP-11. Dennis Ritchie apporte au B une plus grande flexibilité pour le type des variables. Cette version améliorée du langage B est le langage C que nous connaissons aujourd’hui.

La première version de 1973 du langage C n’a pas été normalisée, ce qui a conduit à l’émergence de nombreux dialectes incompatibles. De nos jours, cette première version du C est connue sous le nom de “C de K&R,” en référence au livre “The C Programming Language” écrit par Brian Kernighan et le créateur du langage, Dennis Ritchie.

La grande popularité du C couplée à la prolifération de dialectes incompatibles ont conduit à une démarche de normalisation. En 1989, l’ANSI (American National Standards Institute) puis l’ISO (International Organization for Standardization) en 1990 ont publié la première norme du C. Ce C standart, nommé « ANSI C » ou C90, est compatible avec une grande variété de machines et d’architectures, qu’il s’agisse de machines des annees 90 ans ou qui viennent de paraître.

La syntaxe du C90 est en grande partie compatible avec le C++. Il est courant de voir des programmes écrits dans ce dialecte qui compilent, avec quelques aménagements, à la fois en C et C++. On les qualifie parfois de programmes « C/C++ ».

En 1999, le C connait une évolution importante, qui le rend incompatible avec le C++. Ce C, couramment appellé C99 est difficilement compilable avec certains compilateurs populaires comme celui de Microsoft - qui encore aujourd’hui rejètent certains éléments de sa syntaxe. La popularité de cette version du langage tend à augmenter et il est prévu que le C++23 soit totalement compatible avec le C99.

En 2011, l’arrivée du C11 a introduit la gestion du multithreading ainsi qu’une librairie d’entrée/sortie sécurisée - qui sont largement passés inapercus hormis sur quelques compilateurs de niche. La meilleure gestion de l’unicode a su trouver son public, sa gestion de la généricité est très lacunaire il faut à priori attendre le C23 pour réelement pouvoir écrire du code permettant du branchement générique en C.

Une nouvelle version du C est en travail, les comités de normalisation du C et C++ travaillent de concert pour que le C soit de nouveau compatible avec le C++. Ce C intègrera de nombreux aspects du C++ : on l’appelle pour l’instant C2X. Il contiendra des construction booleenes natives et un vrai pointeur nul qui permettront effectivement d’écrire du code générique.

Le C23 sera une version majeure qui transformera en profondeur l’aspect du langage. Ce sera la première version du langage non rétrocompatible avec les anciennes versions : plus de type int implicite, plus de de trigraphes notamment. De nombreux codes sources en C anciens ne pourront plus compiler avec cette version du langage.