close

D (langage de programmation)

Aller à la navigation Aller à la recherche
Image logo
Sémantique multi- paradigme : impératif , orienté objet , fonctionnel , contractuel [1] , programmation générique
Cours de langue langage de programmation orienté objet , langage de programmation procédural , langage de programmation fonctionnel ,de programmation générique , langage de programmation parallèle [d] , langage de programmation multi-paradigme , langage de programmation impératif ,de programmation compilé et langage de programmation
Type d'exécution compilé
Apparaît dans 2001
Auteur Walter Bright , Andreï Alexandrescu
Développeur Bright, Walter et la Fondation du langage D [d]
Extension de fichier .d, .dd, .diou.def
Sortie 2.100.2 [2]  ( 10 septembre 2022 )
Système de types strict, statique, avec inférence de type
Implémentations majeures Numérique Mars D (implémentation de référence) , LDC , GDC
A été influencé C , C++ , Python , Ruby , C# , Java , Eiffel
influencé MiniD , DScript , Vala , Qore , Swift , Génie
Site Internet dlang.org
 Fichiers multimédias sur Wikimedia Commons

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 vides
  • bool - 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
  • 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 - pointeur
  • array - déployer
  • associative array - tableau associatif
  • function - fonction
  • delegate - délégué
  • string, wstring, dstring sont des alias pratiques pour les tableaux immuables de types (caractères) signés immutable(char)[], immutable(wchar)[]et immutable(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 - pseudonyme
  • enum - énumération
  • struct - structure
  • union - une association
  • class - 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

  1. Description de l'implémentation du paradigme de programmation contractuelle en langage Dee . Archivé de l'original le 3 janvier 2014.
  2. Journal des modifications : 2.100.2 .
  3. 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.
  4. DMD 1.00 - ça y est ! (digitalmars.D.announce) Archivé le 5 mars 2007 à la Wayback Machine 
  5. ↑ Journal des modifications D 2.0 (liaison descendante) . Récupéré le 11 janvier 2009. Archivé de l'original le 1er juin 2012.    (Anglais)
  6. Fonctions - Langage de programmation D . Récupéré le 17 juin 2015. Archivé de l'original le 17 juin 2015.
  7. Langage de programmation Types-D . Récupéré le 7 juin 2015. Archivé de l'original le 17 mai 2015.
  8. Voldemort tape en D | Celle du Dr Dobb . Récupéré le 8 juin 2015. Archivé de l'original le 19 juin 2015.
  9. Archive CodePlex . Archives CodePlex. Récupéré le 16 février 2018. Archivé de l'original le 26 janvier 2018.
  10. 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.
  11. Wiki Editors-D . Date d'accès : 16 juin 2015. Archivé de l'original le 3 juillet 2015.
  12. Dpaste (liaison descendante) . Récupéré le 16 juin 2015. Archivé de l'original le 6 juillet 2015. 
  13. run.dlang.io . Récupéré le 23 septembre 2019. Archivé de l'original le 24 décembre 2019.
  14. 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

Liens


,