D (langage de programmation)
D ( Di ) est un langage de programmation compilé à typage statique multi- paradigmes créé par Walter Bright de Digital Mars . Depuis 2006 , Andrei Alexandrescu est également co-auteur . D est un descendant du langage C++ , mais a été considérablement amélioré par rapport à lui. Il emprunte également un certain nombre de concepts aux langages de programmation Python , Ruby , C# , Java , Eiffel .
D est disponible pour les systèmes d'exploitation Windows, Linux, macOS, FreeBSD. Des travaux sont en cours pour porter sur Android [3] .
Histoire
Dans la préface du livre de A. Alexandrescu, The D Programming Language, Walter Bright écrit qu'il a commencé à développer ce langage en 1999. Le projet a été conçu comme une réingénierie du langage C++ afin de se débarrasser des lacunes les plus importantes du langage d'origine et d'y introduire des solutions architecturales modernes. Lors de la création du langage D, une tentative a été faite pour combiner les performances des langages de programmation compilés avec la sécurité et l'expressivité des dynamiques .
Initialement, l'auteur avait l'intention d'appeler le langage "Mars", mais en raison de la continuité par rapport à C ++, le langage était constamment appelé "D" dans les discussions, en conséquence, ce nom a été attribué au projet.
La version 1.0 du compilateur stable est sortie le 2 janvier 2007 [4] . Peu de temps après la sortie du compilateur le 17 juin 2007, l'auteur a basculé la version 1 en mode support et a commencé à développer la version 2.0, qui initialement ne garantissait pas la rétrocompatibilité [5] . Cette version (la dernière version majeure en D à ce jour) est toujours en cours de développement à ce jour.
Présentation de la langue
Le langage D implémente de nombreuses fonctionnalités et concepts syntaxiques introuvables en C++ : programmation par contrat , tests unitaires intégrés , modules à la place des fichiers d'en-tête (pré-C++20), prise en charge de la récupération de place (tout en maintenant la disponibilité de la mémoire manuelle gestion), tableaux associatifs intégrés, fermetures , fonctions anonymes , le moteur de template a été considérablement repensé.
Syntaxe
D appartient à la famille des langages de type C, de manière générale, sa syntaxe est similaire à C/C++/C#, Java. Lors du développement d'un langage, le principe est respecté : un code qui est également valide en C et en D doit se comporter de la même manière.
Salut le monde ! » à D :
importer std . stdio ;
void main ()
{
writeln ( "Bonjour, monde!" );
}
Comme en C, une fonction main()est un point d'entrée.
Les constructions if, for, while, do-whileressemblent et fonctionnent de la même manière que C/C++. L'instruction à choix multiples switchressemble à C++, mais autorise les variables dans les étiquettes de branche caseet nécessite que chaque branche se casetermine par breakou return; pour passer à la branche suivante après avoir traité celle en cours, vous devez utiliser la construction spéciale goto case. switchLes structures sans succursale sont également interdites default.
Parmi les structures de contrôle supplémentaires, on peut noter static if - une instruction de compilation conditionnelle (la condition est vérifiée statiquement et le contenu de la branche qui lui correspond est inclus dans le code), l'opérateur à choix multiple complet final switch - contrairement à l'habituel switch, il fonctionne uniquement avec des valeurs enum, et le compilateur vérifie statiquement que le choix prend en compte toutes les options possibles et renvoie une erreur dans le cas contraire. Il existe également une boucle de collecte foreach.
Modularité
D dispose d'un système intégré pour diviser un programme en modules (packages), qui fournit une compilation séparée et une importation-exportation contrôlée. Le système de packages ressemble à celui de Java ou de Go : les packages forment une structure hiérarchique qui correspond naturellement à l'arborescence du système de fichiers. Contrairement à C++, D n'a pas d'espace de noms global, chaque nom est défini dans un package. A l'aide de l'instruction import, un module de programme peut importer un package, en mettant à disposition toutes les définitions qu'il contient. Les noms importés sont accessibles avec la qualification : " имя_пакета.имя_объекта".
Le langage fournit un certain nombre d'outils visant à fournir un travail pratique avec des noms importés. Il est possible de renommer le package lors de l'importation, de définir un autre nom (alias) du package importé, d'importer des noms spécifiques. De plus, le langage permet, sans aucune instruction supplémentaire, l'utilisation de noms importés sans qualification par le nom du package. Cependant, il y a une limitation : s'il y a plus d'une définition correspondante d'un nom rencontré dans le programme dans la portée, le compilateur renverra une erreur et exigera que le nom soit explicitement qualifié. Cela empêche le soi-disant " détournement de nom " lorsque, lorsqu'un nouveau paquet est ajouté aux listes d'importation, le compilateur commence à associer un certain nom dans le programme à une définition différente de la définition à laquelle il était précédemment associé.
Syntaxe d'appel de fonction universelle (UFCS)
D implémente le mécanisme UFCS (Uniform function call syntax), qui vous permet d'appeler des fonctions pour n'importe quel objet comme s'il s'agissait de ses méthodes. Par exemple:
importer std . stdio ;
importer std . algorithme ;
importer std . tableau ;
void main ()
{
auto a = [ 2 , 4 , 1 , 3 ];
// les trois éléments suivants sont corrects et fonctionnent de la même manière
writeln ( a ); // Version "classique" de type C d'
un fichier . écrire (); // la fonction est appelée comme si c'était une méthode de l'objet "a" même si ce n'est pas
un . écrire ; // la fonction sans paramètres peut être appelée sans parenthèses
// cela permet d'utiliser des chaines d'appels propres aux langages fonctionnels
int [] e = a . trier (). inverser ;
// le chaînage multiligne est également possible
stdin
. byLine ( KeepTerminator . oui )
. map !( une => une . idup )
. tableau
. trier ;
}
Attributs de fonction
Les fonctions en D peuvent être définies avec des attributs facultatifs supplémentaires qui vous permettent de spécifier explicitement certains aspects du comportement de ces fonctions. Par exemple, une fonction marquée avec l'attribut pure est garantie d'être fonctionnellement pure (avec quelques mises en garde) [6] . La pureté fonctionnelle est vérifiée au moment de la compilation. Un exemple de déclaration de fonction avec un attribut :
pure int sum ( int first , int second )
{
return first + second ;
}
int sum ( int first , int second ) pure // les attributs peuvent également être spécifiés après l'argument list
{
return first + second ;
}
Exemples d'attributs de fonction :
- pur - pureté fonctionnelle
- @safe - une garantie de fonctionnement sécurisé de la mémoire
- nothrow - la fonction est garantie de ne pas lever d' exceptions
- @nogc - garantit que la fonction ne contient pas d'opérations qui allouent de la mémoire sur le ramasse-miettes
- @property est un attribut d'une méthode de classe qui évite l'utilisation de getters-setters "naïfs"
Calcul parallèle
Le langage dispose d'un mécanisme intégré pour lancer des sous-processus parallèles à l'aide d'une fonction intégrée spawn()et d'un échange de données entre des fragments de code exécutés en parallèle en transmettant des messages (fonctions send()et receive()/ receiveTimeout()). L'utilisation de la messagerie est considérée par les auteurs de D comme préférable à l'échange de données via la mémoire partagée.
Cependant, dans les cas où cela est nécessaire (par exemple, lors du transfert de grandes quantités de données entre coroutines), il est possible d'utiliser l'approche traditionnelle pour les langages impératifs avec des zones de mémoire partagées et une synchronisation des accès via des sémaphores et des mutex . Pour soutenir un tel échange :
- en utilisant un modificateur
shared, les données partagées entre les threads peuvent être déclarées, tandis que les tentatives de travailler avec ces données avec des opérations non atomiques sont bloquées au niveau du compilateur ; - la bibliothèque de langage fournit des primitives de synchronisation standard ;
- la bibliothèque de langage fournit des classes de verrouillage spéciales qui sont utilisées pour le verrouillage de contexte : déclarer une instance d'une telle classe dans une méthode synchronise le code de ce point à la fin de la méthode ;
- à l'aide du modificateur synchronized, vous pouvez déclarer une classe entière synchronized : toutes les méthodes de cette classe sont automatiquement synchronisées par le compilateur, de sorte qu'aucune d'entre elles ne puisse être exécutée en parallèle pour la même instance d'une classe déclarée partagée.
Pour tous les outils de synchronisation intégrés, le compilateur surveille et interdit automatiquement les tentatives de modification des données non partagées dans le code synchronisé accessible par plusieurs threads.
Tests unitaires intégrés
En D, les tests unitaires font partie du langage et peuvent être utilisés sans bibliothèques ou frameworks supplémentaires.
importer std . stdio ;
int first ( int [] arr ) {
return arr [ 0 ];
}
testunitaire {
int [] arr1 = [ 1 , 2 , 3 ] ;
entier [] arr2 = [ 10 , 15 , 20 ] ;
assert ( premier ( arr1 ) == 1 );
assert ( premier ( arr2 ) == 10 );
}
void main () {
// ...
}
Paradigmes de programmation
D implémente cinq principaux paradigmes de programmation - impératif , POO , métaprogrammation , programmation fonctionnelle et calcul parallèle ( modèle d'acteur ).
Gestion de la mémoire
D utilise un ramasse-miettes pour la gestion de la mémoire, cependant, le contrôle manuel est également possible en utilisant la surcharge de l'opérateur newet delete, ainsi que l'utilisation de malloc et free , similaire à C. Le ramasse-miettes peut être activé et désactivé manuellement, vous pouvez ajouter et supprimer de la mémoire zones de sa visibilité, forcer le démarrage partiel ou complet du processus d'assemblage. Il existe un manuel détaillé décrivant divers schémas de gestion de la mémoire en D pour les cas où le ramasse-miettes standard n'est pas applicable.
SafeD
SafeD est le nom d'un sous-ensemble du langage D dont l'utilisation garantit la sécurité des accès mémoire .
Types de données
Le langage dispose d'un riche ensemble de types de données définis et de fonctionnalités permettant de définir de nouveaux types. Les types en langage D sont divisés en types valeur et en types référence.
Types de bases
L'ensemble des types de base peut être divisé dans les catégories suivantes [7] :
void- type spécial pour les valeurs videsbool- type booléen- types entiers : signé
byte,short,int,longet leur correspondant non signéubyte,ushort,uint,ulong - types à virgule flottante :
float,double,real. Pour les types à virgule flottante, il existe des variantes correspondantes pour les nombres imaginaires et complexes :- imaginaire :
ifloat,idouble,ireal - complexe :
сfloat,сdouble,сreal
- imaginaire :
- types de signes (caractères) :
char,wchar,dchar, désignant respectivement les unités de code des encodages UTF-8, UTF-16 et UTF-32.
Contrairement à C++, toutes les tailles de types entiers sont définies par la spécification. Autrement dit, le type int sera toujours de 32 bits. Les littéraux entiers peuvent être écrits en décimal, binaire (préfixé par 0b) et hexadécimal (préfixé par 0x). La notation de style C des littéraux en octal (c'est-à-dire préfixés par 0) a été supprimée, car il est facile de confondre une telle notation avec un décimal. Si vous devez toujours utiliser le système octal, vous pouvez utiliser le modèle std.conv.octal .
Types dérivés
pointer- pointeurarray- déployerassociative array- tableau associatiffunction- fonctiondelegate- déléguéstring,wstring,dstringsont des alias pratiques pour les tableaux immuables de types (caractères) signésimmutable(char)[],immutable(wchar)[]etimmutable(dchar)[], désignant les chaînes Unicode immuables ( qualificatif immuable ) dans l'un des codages UTF-8, UTF-16 et UTF-32, respectivement.
Types personnalisés
alias- pseudonymeenum- énumérationstruct- structureunion- une associationclass- Classer
Inférence de type, mots-clés "auto", "typeof" et types sans nom ("Voldemort")
D a un mécanisme d'inférence de type. Cela signifie que le type, en règle générale, peut être calculé au moment de la compilation et n'a pas besoin d'être spécifié explicitement. Par exemple, l'expression :
auto myVar = 10sera convertie en int myVar = 10. L'utilisation de l'inférence de type présente plusieurs avantages :
- Code plus concis et lisible, surtout s'il utilise de longs noms de structure ou de classe. Par exemple, l'expression
VeryLongTypeName var = VeryLongTypeName(/* ... */);
peut être remplacé par
auto var = VeryLongTypeName(/* ... */);
- à l'aide du mot-clé typeof , vous pouvez créer une variable du même type qu'une variable existante, même si son type est inconnu. Exemple:
// fichier1.d
int var1 ;
// fichier2.d
typeof ( var1 ) var2 ; // var2 prend le type int
- utilisation de types anonymes. Exemple:
// La fonction renvoie en fait un résultat de type TheUnnameable, mais comme ce type est défini dans la fonction,
// nous ne pouvons pas le définir explicitement comme type de retour.
// Cependant, nous pouvons définir le type de retour sur "auto", laissant le compilateur le découvrir par lui-même
auto createVoldemortType ( int value )
{
struct TheUnnameable
{
int getValue () { return value ; }
}
return L'Innommable ();
}
Les types sans nom sont officieusement appelés types Voldemort, d'après Voldemort ( "Celui-qui-ne-doit-pas-être-nommé"), le principal antagoniste de la série Harry Potter [8] . L'inférence de type ne doit pas être confondue avec le typage dynamique , car bien que le type ne soit pas explicitement spécifié, il est calculé au moment de la compilation, pas au moment de l'exécution.
Implémentations
- DMD - Digital Mars D ( VIKI ), un compilateur de référence développé par Walter Bright. Ce compilateur implémente le plus complètement la norme de langage, la prise en charge de toutes les innovations y apparaît en premier lieu. Le frontend et le backend ( [1] ) sont distribués sous la licence Boost .
- LDC - DMD ( WIKI ) - frontal pour LLVM ( SITE )
- GDC - DMD ( VIKI ) - frontal pour le compilateur GCC
- LDC pour iOS - Boîte à outils basée sur LDC pour la compilation croisée vers iOS
- D pour Android (lien indisponible) - Toolkit pour la compilation croisée vers Android (x86 utilisant DMD et ARM utilisant LDC) instruction
- SDC (Stupid D Compiler) est un compilateur expérimental (compilateur en tant que bibliothèque) qui utilise LLVM comme back-end et n'est pas basé sur DMD.
- Calypso - Fourche LDC qui fournit une interopérabilité Clang directe, permettant l'utilisation directe des en-têtes C.
- MicroD - Fork DMD qui génère du code source C au lieu de fichiers objets
- DtoJS - Fork DMD qui génère du code source JavaScript au lieu de fichiers objets
- Compilateur D pour .NET - Un back-end pour le compilateur du langage de programmation D 2.0 [9] [10] . Il compile le code en bytecode Common Intermediate Language (CIL) plutôt qu'en code machine. Le CIL peut ensuite être exécuté via une machine virtuelle Common Language Infrastructure (CLR) .
- DIL est une implémentation de compilateur artisanale pour le langage de programmation D écrit en D v2 à l'aide de la bibliothèque standard Tango . Lexer et l'analyseur sont entièrement implémentés. L'analyse sémantique est en cours d'élaboration. Le backend sera très probablement LLVM .
Outils et outils de développement
IDE et éditeurs
Prise en charge de D dans divers IDE , implémentés à l'aide de plugins :
| EDI | brancher | Plateformes |
|---|---|---|
| IDÉE IntelliJ | DLangage | multiplateforme |
| Éclipse | DDT | multiplateforme |
| MonoDevelop/Xamarin | Mono-D | multiplateforme |
| Visual Studio | Visuel-D | les fenêtres |
| Code Visual Studio | Code-D | multiplateforme |
| xcode | D pour Xcode | Mac OS X |
| Zeus IDE | D pour Zeus IDE | les fenêtres |
IDE natifs pour le langage D :
- Coédition (Windows, Linux)
- DLangIDE (Windows, Linux, OS X) - construit sur D lui-même, prend en charge la coloration syntaxique, la complétion de code, DUB, divers compilateurs, le débogage, etc.
D est supporté par de nombreux éditeurs de texte : Vim, Emacs, Kate, Notepad++, Sublime Text, TextMate et autres [11] .
Gestionnaire de paquets
DUB est le gestionnaire de packages officiel pour D. DUB agit comme un référentiel de packages et est utilisé pour la gestion des dépendances ainsi que comme système de construction. L'ensemble des dépendances, des métadonnées sur le projet et des indicateurs de compilateur sont stockés au format JSON ou SDL. Exemple de fichier projet simple (JSON) :
{
"name" : "myproject" ,
"description" : "Un petit service web à moi." ,
"authors" : [ "Peter Parker" ],
"homepage" : "http://myproject.example.com" ,
"license" : "GPL-2.0" ,
"dependencies" : {
"vibe-d" : " ~>0.7.23"
}
}
Utilitaires et outils
rdmd est un utilitaire fourni avec le compilateur DMD qui vous permet de compiler et d'exécuter des fichiers source D à la volée. Cela permet à D d'être utilisé pour de petits programmes de la même manière que bash, perl et python :
// monprog.d
# !/ usr / bin / env rdmd
import std . stdio ;
void main ()
{
writeln ( "Bonjour, monde avec un script automatisé en cours d'exécution!" );
}
L'appel de la commande ./myprog.ddans la console compilera et exécutera automatiquement le programme.
DPaste [12] est un service en ligne permettant d'exécuter des programmes D dans un navigateur, similaire aux services JSBin et CodePen .
run.dlang.io [13] est un compilateur et désassembleur en ligne.
Utilisation, diffusion
La distribution du langage D est limitée, mais il est utilisé pour de vrais développements de logiciels industriels. Le site officiel [14] fournit une liste de 26 entreprises qui utilisent avec succès D dans le développement de systèmes logiciels opérant dans une variété de domaines, y compris la programmation système, les projets Web, les jeux et les moteurs de jeux, les logiciels de calculs scientifiques, les utilitaires à des fins diverses , etc. Le langage D est notamment promu par la D Language Foundation, un organisme public qui promeut le langage D lui-même et les logiciels open source créés à partir de celui-ci.
Selon l'indice TIOBE , l'intérêt maximum pour le D s'est manifesté en 2007-2009, en mars 2009 l'indice du langage D a atteint 1,8 (12e place), ce qui est son maximum absolu. Après une baisse dans la première moitié des années 2010, en 2016, il est arrivé à un état relativement stable - la valeur numérique de l'indice fluctue dans la plage de 1,0 à 1,4, dans le classement la langue est dans le troisième dix. Dans la cote de popularité , compilée sur la base des résultats de l'agrégation des données sur les offres d'emploi de développeurs, le langage D n'est inclus ni dans la liste principale (top-20) ni dans la liste générale (top-43), ce qui indique une faible demande parmi les employeurs.
Exemples de code
Exemple 1
Salut le monde ! »
importer std . stdio ;
void main () {
writeln ( "Bonjour, monde!" );
}
Exemple 2
Un programme qui imprime les arguments de la ligne de commande avec lesquels il a été appelé
importer std . stdio : writefln ;
void main ( string [] args )
{
foreach ( je , arg ; args )
writefln ( "args[%d] = '%s'" , je , arg );
}
Exemple 3
Un programme qui lit une liste de mots d'un fichier ligne par ligne et produit tous les mots qui sont des anagrammes d'autres mots
importer std . stdio , std . algorithme , std . gamme , std . chaîne _
void main ()
{
dstring [][ dstring ] signes2mots ;
foreach ( dchar [] w ; lines ( File ( "words.txt" )))
{
w = w . chomp (). toLower ();
clé immuable = w . duper . trier (). relâcher (). idup ; signes2mots [ clé ] ~= w . idup ; }
foreach ( mots ; signes2mots )
{
if ( mots . longueur > 1 )
{
writefln ( mots . joindre ( " " ));
}
}
}
Voir aussi
- Mars numérique
- Pour une comparaison des fonctionnalités de D avec d'autres langages, voir Comparaison des langages de programmation (syntaxe)
Remarques
- ↑ Description de l'implémentation du paradigme de programmation contractuelle en langage Dee . Archivé de l'original le 3 janvier 2014.
- ↑ Journal des modifications : 2.100.2 .
- ↑ D pour Android - Forum de discussion sur le langage de programmation D . Récupéré le 7 juin 2015. Archivé de l'original le 21 mai 2015.
- ↑ DMD 1.00 - ça y est ! (digitalmars.D.announce) Archivé le 5 mars 2007 à la Wayback Machine
- ↑ Journal des modifications D 2.0 (liaison descendante) . Récupéré le 11 janvier 2009. Archivé de l'original le 1er juin 2012. (Anglais)
- ↑ Fonctions - Langage de programmation D . Récupéré le 17 juin 2015. Archivé de l'original le 17 juin 2015.
- ↑ Langage de programmation Types-D . Récupéré le 7 juin 2015. Archivé de l'original le 17 mai 2015.
- ↑ Voldemort tape en D | Celle du Dr Dobb . Récupéré le 8 juin 2015. Archivé de l'original le 19 juin 2015.
- ↑ Archive CodePlex . Archives CodePlex. Récupéré le 16 février 2018. Archivé de l'original le 26 janvier 2018.
- ↑ La source du compilateur D.NET est maintenant disponible . InfoQ. Récupéré le 16 février 2018. Archivé de l'original le 30 novembre 2018.
- ↑ Wiki Editors-D . Date d'accès : 16 juin 2015. Archivé de l'original le 3 juillet 2015.
- ↑ Dpaste (liaison descendante) . Récupéré le 16 juin 2015. Archivé de l'original le 6 juillet 2015.
- ↑ run.dlang.io . Récupéré le 23 septembre 2019. Archivé de l'original le 24 décembre 2019.
- ↑ Organisations utilisant le langage D . dlang.org. Récupéré le 7 octobre 2019. Archivé de l'original le 6 août 2019.
Littérature
- Alexandrescu A. Langage de programmation D = Le langage de programmation D. - Symbole-plus , 2012. - 544 p. - ISBN 978-5-93286-205-6 .
- Wiki officiel
- Le langage de programmation D - Livre
- Programmation en D - Livre
- Articles intéressants consacrés à D
- Manuel de langue D en russe
- Informations sur la langue D en russe
Liens
- Langage de programmation D (anglais) (lien non disponible) . - site officiel. Récupéré le 10 mai 2012. Archivé de l'original le 18 mai 2012.
- D sur GitHub .
- code.dlang.org (anglais) . - un référentiel de packages pour D et le site du gestionnaire de packages officiel DUB.
- Site de la langue D en Russie (lien inaccessible) (14 mars 2013). Archivé de l'original le 15 mars 2013.
- Développement Open Source pour le langage de programmation D (eng.) (lien non disponible) . — logiciel libre en/pour la langue D. Récupéré le : 8 janvier 2006 . Archivé de l'original le 18 mai 2012.
- GDC - Langage de programmation D pour GCC (anglais) (27 mai 2007). — Le langage de programmation D pour GCC . Récupéré : 17 juillet 2011.
- Langage de programmation LDC - D pour LLVM (anglais) (lien non disponible) . — Le langage de programmation D pour LLVM . Archivé de l'original le 18 mai 2012.
- Alexandrescu, Andrei The Case for D (anglais) (lien non disponible) (15 juin 2009). Récupéré le 7 janvier 2011. Archivé de l'original le 18 mai 2012.
- Traductions de manuels et de la bibliothèque standard de la langue D
- Exemples de code D dans le projet Rosetta Code
,