# D (langage)

Le D est un langage de programmation impératif orienté objet et multi-paradigmes conçu pour la programmation système.
Il s’inspire de nombreux langages, dont C++, Java (avec lequel il a en commun l'utilisation d'un ramasse-miettes et l'existence d'un héritage simple), et Eiffel (pour le paradigme de programmation par contrat).
D est en version 2.x, abrégé « D2 » (depuis le 17 juin 2007), et subit ponctuellement de légères modifications de spécification. Ces transformations sont réalisées par Walter Bright et Andrei Alexandrescu, qui tiennent compte des remarques et requêtes de la communauté. La version 1.x du langage est obsolète et a été abandonnée le 31 décembre 2012.

## Historique

Le langage D a été créé par Walter Bright en décembre 1999 avec sa société Digital Mars (il devait d'ailleurs être appelé Mars initialement), et il est présenté comme le successeur du C, d'où son nom (le langage C lui-même succédait au langage B, qui quant à lui ne dérive pas d'un quelconque langage A, mais du BCPL).

### Origine

Walter Bright a imaginé ce langage en s’appuyant sur l'expérience qu'il a acquise lors du développement de compilateurs pour les langages C et C++. Le design du langage D a pour ambition de conserver le niveau de performance de ces langages tout en palliant les problèmes liés à la syntaxe et à la sémantique.
En particulier :
* la création et la maintenance de compilateur est ardue ;
* la syntaxe globalement mal comprise introduit des bugs par simple méconnaissance ou inattention.
Pour cela, le langage D s'affranchit du préprocesseur, utilise des modules, et a une syntaxe non ambiguë, ce qui a pour effet d'accélérer grandement la vitesse de compilation et de faciliter la création d'outils d'analyse de code. Ainsi, couplé avec des notions modernes incluses dans le langage, la productivité est améliorée.
   « Si un langage peut récupérer 90 % de la puissance du C++ mais seulement 10 % de sa complexité, cela vaut largement le coup. »
— Walter Bright

### Compilateurs

Le compilateur officiel, DMD, est développé parallèlement à la spécification du langage. Il cible le langage machine. La totalité de son code est ouvert, ce qui permet de corriger rapidement les problèmes rencontrés, ou encore de réaliser son propre compilateur en utilisant une autre base (backend). Il existe actuellement pour les plates-formes Linux, FreeBSD, Mac OS X et Windows.
Un compilateur GNU, GDC, mêlant le frontend de DMD et le backend de gcc est en développement.
Un compilateur sous licence BSD, LDC, mêlant le frontend de DMD et le backend LLVM est encore en cours de développement. Il peut compiler en 64 bits, supporte l'essentiel du langage D dans ses versions 1 et 2 et permet de créer des bibliothèques dynamiques quelle que soit la plate-forme Linux, Mac OS X ou Windows contrairement à son homologue DMD ne pouvant réaliser cette tâche que sur Mac OS X.

## Spécificités du langage
### Paradigmes

D dans sa version 2 est un langage multi paradigmes qui inclut la plupart des notions essentielles de programmation orientée objet, générique et fonctionnelle, tout en laissant la possibilité d'inclure du code assembleur ou encore de linker du code C.
Paradigmes supportés :
* Orientée objet ;
* Fonctionnelle ;
* Concurrentielle ;
* Impérative ;
* Contrat ;
* Métaprogrammation.

### Autres

Il introduit dans ses spécifications les éléments de la programmation par contrat, de test unitaire, et de vrais modules qui améliorent la qualité et facilitent la maintenance du code. Les tableaux associatifs et les tableaux avec "slices", directement inclus dans le langage, les pointeurs (bien que leur usage soit largement réduit par rapport à C ou C++), le « ramasse-miettes » débrayable et l'inférence de types permettent de faire de D un langage à la fois puissant et expressif. Le langage permet en outre d'inclure directement dans le source du code écrit en C ou code assembleur.
La programmation objet en D supporte l’encapsulation, le polymorphisme, de l’héritage simple étendu par des interfaces et de vraies « propriétés ». L’instanciation se fait uniquement par référence et laisse le contrôle sur l’initialisation des attributs statiques. Les exceptions et le mécanisme des "scope guards" permettent de simplifier la gestion des erreurs.
Les possibilités fonctionnelles du langage s'expriment de plusieurs manières: les fonctions anonymes ou lambda, les fonctions pures dont la pureté est vérifiée par le compilateur, l'évaluation paresseuse des arguments. L'évolution du langage prend en compte le multithreading en permettant la vérification par le compilateur de l'immutabilité d'objets en mémoire.
Enfin D inclut un très puissant système de « templates », qui permet d'utiliser l'essentiel du langage dans le cadre de la métaprogrammation. Il inclut notamment la notion de contrainte sur les paramètres de templates, les mixins et l'évaluation du code à la compilation (Compile Time Function Evaluation). Le compilateur a accès au typage des données à la compilation et permet la compilation conditionnelle ce qui permet d'optimiser la génération de code.

## Exemples

Voici un exemple du fameux « Hello World » en langage D :
Autre exemple, qui affiche la liste des arguments associés au programme lors de son exécution en ligne de commande:
La version 2.0 accepte également le type string comme un alias à immutable(char), et inclut par ailleurs writeln en plus de writefln, permettant ainsi d'invoquer des variables plus simplement (cf. Stackoverflow).

## Anecdote

Le langage BCPL fut inventé en 1966, et son successeur fut le langage B (1969) qui fut à son tour remplacé par le langage C (1970). Le successeur du C pouvait alors être nommé D ou P selon l'ordre alphabétique ou l'ordre des lettres BCPL. Finalement, ce fut le C++ (1983). C'est ainsi que la lettre D fut choisie (1999) en référence au nouveau successeur.