D | |
---|---|
Semantik | multiparadigme : imperativ , objektorienteret , funktionel , kontrakt [1] , generisk programmering |
Sprog klasse | objektorienteret programmeringssprog , proceduremæssigt programmeringssprog , funktionelt programmeringssprog , generisk programmeringssprog , parallelt programmeringssprog [d] , multiparadigme programmeringssprog , imperativt programmeringssprog , kompileret programmeringssprog og programmeringssprog |
Udførelsestype | kompileret |
Dukkede op i | 2001 |
Forfatter | Walter Bright , Andrei Alexandrescu |
Udvikler | Bright, Walter og D Language Foundation [d] |
Filtypenavn _ | .d, .dd, .dieller.def |
Frigøre | 2.100.2 [2] ( 10. september 2022 ) |
Type system | streng, statisk, med typeslutning |
Større implementeringer | Digital Mars D (referenceimplementering) , LDC , GDC |
Blev påvirket | C , C++ , Python , Ruby , C# , Java , Eiffel |
påvirket | MiniD , DScript , Vala , Qore , Swift , Genie |
Internet side | dlang.org |
Mediefiler på Wikimedia Commons |
D ( Di ) er et multiparadigme statisk skrevet kompileret programmeringssprog skabt af Walter Bright fra Digital Mars . Siden 2006 har Andrei Alexandrescu også været medforfatter . D er en efterkommer af C++ sproget , men er blevet væsentligt forbedret i forhold til det. Den låner også en række koncepter fra programmeringssprogene Python , Ruby , C# , Java , Eiffel .
D er tilgængelig til Windows, Linux, macOS, FreeBSD operativsystemer. Der arbejdes på at overføre til Android [3] .
I forordet til A. Alexandrescus bog The D Programming Language skriver Walter Bright , at han begyndte at udvikle dette sprog i 1999. Projektet blev tænkt som en omstrukturering af C++-sproget for at slippe af med de væsentligste mangler ved originalsproget og introducere moderne arkitektoniske løsninger i det. Ved oprettelsen af D-sproget blev der gjort et forsøg på at kombinere ydelsen af kompilerede programmeringssprog med sikkerheden og udtryksevnen af dynamiske .
Oprindeligt havde forfatteren til hensigt at kalde sproget "Mars", men på grund af kontinuiteten med hensyn til C ++ blev sproget konstant kaldt "D" i diskussioner, som et resultat blev dette navn tildelt projektet.
Den stabile compiler version 1.0 blev udgivet den 2. januar 2007 [4] . Kort efter udgivelsen af compileren den 17. juni 2007 skiftede forfatteren version 1 til support-tilstand og begyndte at udvikle version 2.0, som oprindeligt ikke garanterede bagudkompatibilitet [5] . Denne version (den sidste D-dur version til dato) udvikles stadig den dag i dag.
D-sproget implementerer mange syntaktiske funktioner og koncepter, der ikke findes i C++: kontraktprogrammering , indbyggede enhedstests , moduler i stedet for header-filer (pre-C++20), understøttelse af affaldsindsamling (samtidig med at tilgængeligheden af manuel hukommelse opretholdes management), indbyggede associative arrays, lukninger , anonyme funktioner , er skabelonmotoren blevet væsentligt omdesignet.
D tilhører familien af C-lignende sprog, generelt set ligner dens syntaks C/C++/C#, Java. Når man udvikler et sprog, overholdes princippet: kode, der er lige gyldig i både C og D, skal opføre sig på samme måde.
Hej verden! " til d:
import std . stdio ; void main () { writeln ( "Hej, verden!" ); }Ligesom i C er en funktion main()et indgangspunkt.
if, for, while, konstruktionerne ser ud og fungerer på do-whilesamme måde som C/C++. Multiple choice-instruktionen switchligner C++, men tillader variabler i grenetiketter caseog kræver, at hver gren caseslutter med breakeller return; for at flytte til næste gren efter at have behandlet den nuværende, skal du bruge den specielle konstruktion goto case. switchBygninger uden gren er også forbudt default.
Af de yderligere kontrolstrukturer kan man bemærke static if - en instruktion til betinget kompilering (betingelsen kontrolleres statisk, og indholdet af grenen, der svarer til den, er inkluderet i koden), den fulde multiple choice-operator final switch - i modsætning til den sædvanlige switch, virker kun med værdier enum, og compileren kontrollerer statisk, at valget tager højde for alle mulige muligheder og giver en fejl ellers. Der er også en opsamlingsløkke foreach.
D har et indbygget system til at opdele et program i moduler (pakker), som giver separat kompilering og kontrolleret import-eksport. Pakkesystemet ligner det for Java eller Go: pakker danner en hierarkisk struktur, der naturligt knytter sig til filsystemtræet. I modsætning til C++ har D ikke et globalt navneområde, hvert navn er defineret i en pakke. Ved hjælp af instruktionen importkan et programmodul importere en pakke og gøre alle definitionerne i den tilgængelige. Importerede navne kan tilgås med kvalifikationen: " имя_пакета.имя_объекта".
Sproget indeholder en række værktøjer, der har til formål at give praktisk arbejde med importerede navne. Det er muligt at omdøbe pakken under import, indstille et alternativt navn (alias) på den importerede pakke, importere specifikke navne. Derudover tillader sproget, uden yderligere instruktioner, brug af importerede navne uden forbehold af pakkenavnet. Der er dog en begrænsning: Hvis der findes mere end én matchende definition af et navn i programmet i omfanget, vil compileren give en fejl og kræve, at navnet er eksplicit kvalificeret. Dette forhindrer den såkaldte "navnekapring", når compileren, når en ny pakke tilføjes til importlisterne, begynder at knytte et bestemt navn i programmet til en anden definition end den definition, den tidligere var tilknyttet.
D implementerer UFCS (Uniform function call syntax) mekanismen, som giver dig mulighed for at kalde funktioner for ethvert objekt, som om de var dets metoder. For eksempel:
import std . stdio ; import std . algoritme ; import std . matrix ; void main () { auto a = [ 2 , 4 , 1 , 3 ]; // alle tre af følgende er korrekte og fungerer på samme måde skriveln ( a ); // "klassisk" C-lignende version af en . skriveln (); // funktionen kaldes, som om den var en metode til objekt "a", selvom den ikke er en . skriveln ; // funktion uden parametre kan kaldes uden parentes // dette giver dig mulighed for at bruge opkaldskæder, der er specifikke for funktionelle sprog int [] e = a . sortere (). omvendt ; // multi-line chaining er også mulig stdin . byLine ( KeepTerminator . ja ) . kort !( a => a . idup ) . array . sortere ; }Funktioner i D kan defineres med yderligere valgfrie attributter, der giver dig mulighed for eksplicit at specificere nogle aspekter af disse funktioners adfærd. For eksempel er en funktion markeret med attributten ren garanteret at være funktionelt ren (med nogle forbehold) [6] . Funktionel renhed kontrolleres på kompileringstidspunktet. Et eksempel på en funktionserklæring med en attribut:
ren int sum ( int først , int anden ) { returnere første + anden ; } int sum ( int first , int second ) pure // attributter kan også angives efter argumentlisten { return first + second ; }Eksempler på funktionsattributter:
Sproget har en indbygget mekanisme til at starte parallelle underprocesser ved hjælp af en indbygget funktion spawn()og dataudveksling mellem parallelt udførte kodefragmenter ved at sende beskeder (funktioner send()og receive()/ receiveTimeout()). Brugen af beskeder anses af forfatterne af D for at være at foretrække frem for dataudveksling via delt hukommelse.
Men i tilfælde, hvor dette er nødvendigt (for eksempel ved overførsel af store mængder data mellem koroutiner), er det muligt at bruge den traditionelle tilgang til imperative sprog med delte hukommelsesområder og få adgang til synkronisering gennem semaforer og mutexes . For at støtte en sådan udveksling:
For alle indbyggede synkroniseringsværktøjer overvåger compileren automatisk og forbyder forsøg på at ændre ikke-delte data i synkroniseret kode, der er tilgængelig for mere end én tråd.
I D er enhedstests en del af sproget og kan bruges uden yderligere biblioteker eller rammer.
import std . stdio ; int first ( int [] arr ) { return arr [ 0 ]; } unittest { int [] arr1 = [ 1 , 2 , 3 ]; int [] arr2 = [ 10 , 15 , 20 ]; hævde ( først ( arr1 ) == 1 ); hævde ( først ( arr2 ) == 10 ); } void main () { // ... }D implementerer fem hovedprogrammeringsparadigmer - imperativ , OOP , metaprogrammering , funktionel programmering og parallel computing ( aktørmodel ).
D bruger en skraldeopsamler til hukommelseshåndtering, dog er manuel styring også mulig ved brug af operatøroverbelastning newog delete, samt brug af malloc og free , svarende til C. Skraldesamleren kan tændes og slukkes manuelt, du kan tilføje og fjerne hukommelse områder fra dets synlighed, tvinge start delvis eller komplet montageproces. Der er en detaljeret manual , der beskriver forskellige hukommelseshåndteringsskemaer i D for tilfælde, hvor standardaffaldsopsamleren ikke er anvendelig.
SafeD er navnet på en delmængde af D-sproget, hvis brug garanterer sikkerheden ved hukommelsesadgang .
Sproget har et rigt sæt af definerede datatyper og faciliteter til at definere nye typer. Typer i D-sproget er opdelt i værdityper og referencetyper.
BasistyperSættet af grundlæggende typer kan opdeles i følgende kategorier [7] :
I modsætning til C++ er alle størrelser af heltaltyper defineret af specifikationen. Det vil sige, at typen int altid vil være 32 bit. Heltalsliteraler kan skrives i decimal, binær (med 0b foran) og hexadecimal (med 0x foran). C-stilnotationen af bogstaver i oktal (dvs. foranstillet med 0) er blevet fjernet, da det er let at forveksle sådan notation med decimal. Hvis du stadig skal bruge det oktale system, kan du bruge std.conv.octal skabelonen .
Afledte typerD har en typeslutningsmekanisme. Det betyder, at typen som udgangspunkt kan beregnes på kompileringstidspunktet og ikke skal angives eksplicit. For eksempel vil udtrykket: auto myVar = 10blive konverteret til int myVar = 10. Brug af typeslutning har flere fordele:
VeryLongTypeName var = VeryLongTypeName(/* ... */);
kan erstattes af
auto var = VeryLongTypeName(/* ... */);
De navnløse typer kaldes uformelt Voldemort-typer efter Voldemort ( "Han-som-ikke-skal-navngives"), hovedantagonisten i Harry Potter-serien [8] . Typeinferens bør ikke forveksles med dynamisk typing , for selvom typen ikke er eksplicit specificeret, beregnes den på kompileringstidspunktet, ikke ved kørselstidspunktet.
Understøttelse af D i forskellige IDE'er , implementeret ved hjælp af plugins:
IDE | plugin | Platforme |
---|---|---|
IntelliJ IDÉ | DSprog | på tværs af platforme |
Formørkelse | DDT | på tværs af platforme |
MonoDevelop/Xamarin | Mono-D | på tværs af platforme |
visuelt studie | Visual-D | Windows |
Visual Studio kode | Kode-D | på tværs af platforme |
xcode | D for Xcode | MacOS X |
Zeus IDE | D for Zeus IDE | Windows |
Native IDE'er til D-sprog:
D understøttes af mange teksteditorer: Vim, Emacs, Kate, Notepad++, Sublime Text, TextMate og andre [11] .
DUB er den officielle pakkehåndtering for D. DUB fungerer som et pakkelager og bruges til afhængighedsstyring og også som et byggesystem. Sættet af afhængigheder, metadata om projektet og compilerflag gemmes i JSON- eller SDL-format. Eksempel på en simpel projektfil (JSON):
{ "name" : "myproject" , "description" : "Min lille webtjeneste." , "authors" : [ "Peter Parker" ], "homepage" : "http://myproject.example.com" , "license" : "GPL-2.0" , "afhængigheder" : { "vibe-d" : " ~>0.7.23" } }rdmd er et værktøj, der følger med DMD-kompileren, der lader dig kompilere og køre D-kildefiler på farten. Dette gør det muligt at bruge D til små programmer på samme måde som bash, perl og python:
// myprog.d # !/ usr / bin / env rdmd import std . stdio ; void main () { writeln ( "Hej, verden med automatiseret script kørende!" ); }Kaldning af kommandoen ./myprog.di konsollen vil automatisk kompilere og udføre programmet.
DPaste [12] er en onlinetjeneste til at køre D-programmer i en browser, svarende til JSBin- og CodePen-tjenester .
run.dlang.io [13] er en online compiler og disassembler.
Distribution af D-sproget er begrænset, men det bruges til ægte industriel softwareudvikling. Den officielle hjemmeside [14] giver en liste over 26 virksomheder, der med succes bruger D i udviklingen af softwaresystemer, der opererer på en række områder, herunder systemprogrammering, webprojekter, spil og spilmotorer, software til videnskabelige beregninger, hjælpeprogrammer til forskellige formål , og så videre. D-sproget fremmes især af D Language Foundation, en offentlig organisation, der promoverer selve D-sproget og open source-software , der er skabt ved hjælp af det.
Ifølge TIOBE-indekset blev den maksimale interesse for D manifesteret i 2007-2009, i marts 2009 nåede D-sprogindekset 1,8 (12. plads), hvilket er dets absolutte maksimum. Efter et fald i første halvdel af 2010'erne kom det i 2016 til en relativt stabil tilstand - den numeriske værdi af indekset svinger i intervallet 1,0-1,4, i rangeringen er sproget i tredje ti. I popularitetsvurderingen , der er udarbejdet baseret på resultaterne af aggregering af data om ledige udviklere, er D-sproget ikke inkluderet i hverken hoved- (top-20) eller generelle (top-43) liste, hvilket indikerer en lav efterspørgsel blandt arbejdsgivere.
Hej verden! »
import std . stdio ; void main () { writeln ( "Hej, verden!" ); }Et program, der udskriver de kommandolinjeargumenter, det blev kaldt med
import std . stdio : skrivefln ; void main ( string [] args ) { foreach ( i , arg ; args ) writefln ( "args[%d] = '%s'" , i , arg ); }Et program, der læser en liste over ord fra en fil linje for linje og udsender alle ord, der er anagrammer af andre ord
import std . stdio , std . algoritme , std . rækkevidde , std . streng _ void main () { dstring [][ dstring ] signs2words ; foreach ( dchar [] w ; lines ( File ( "words.txt" ))) { w = w . chomp (). toSænke (); uforanderlig nøgle = w . dup . sortere (). frigive (). idup ; tegn2ord [ nøgle ] ~= w . idup ; } foreach ( ord ; tegn2ord ) { if ( ord . længde > 1 ) { skrivefln ( ord . join ( " " )); } } }
Programmeringssprog | |
---|---|
|
C programmeringssprog | |
---|---|
Kompilere |
|
Biblioteker | |
Ejendommeligheder | |
Nogle efterkommere | |
C og andre sprog |
|
Kategori:C programmeringssprog |
,