D (ohjelmointikieli)

Kokeneet kirjoittajat eivät ole vielä tarkistaneet sivun nykyistä versiota, ja se voi poiketa merkittävästi 31. maaliskuuta 2020 tarkistetusta versiosta . tarkastukset vaativat 22 muokkausta .
D
Semantiikka moniparadigma : pakottava , oliokeskeinen , toiminnallinen , sopimus [1] , yleinen ohjelmointi
Kieliluokka olioohjelmointikieli , proseduuriohjelmointikieli , toiminnallinen ohjelmointikieli , yleinen ohjelmointikieli , rinnakkaisohjelmointikieli [d] , moniparadigmaohjelmointikieli , pakollinen ohjelmointikieli , käännetty ohjelmointikieli ja ohjelmointikieli
Toteutustyyppi koottu
Esiintyi 2001
Tekijä Walter Bright , Andrei Alexandrescu
Kehittäjä Bright, Walter ja D Language Foundation [d]
Tiedostotunniste _ .d, .dd, .ditai.def
Vapauta 2.100.2 [2]  ( 10. syyskuuta 2022 )
Tyyppijärjestelmä tiukka, staattinen, tyyppipäätelmän kanssa
Tärkeimmät toteutukset Digital Mars D (referenssitoteutus) , LDC , GDC
Vaikutettu C , C++ , Python , Ruby , C# , Java , Eiffel
vaikutti MiniD , DScript , Vala , Qore , Swift , Genie
Verkkosivusto dlang.org
 Mediatiedostot Wikimedia Commonsissa

D ( Di ) on usean paradigman staattisesti kirjoitettu käännetty ohjelmointikieli , jonka on luonut Walter Bright of Digital Mars . Vuodesta 2006 lähtien Andrei Alexandrescu on myös ollut mukana kirjoittajana . D on C++-kielen jälkeläinen , mutta sitä on parannettu merkittävästi siihen verrattuna. Se lainaa myös useita käsitteitä ohjelmointikielistä Python , Ruby , C# , Java , Eiffel .

D on saatavilla Windows-, Linux-, macOS- ja FreeBSD-käyttöjärjestelmille. Portaaminen Androidiin on käynnissä [3] .

Historia

A. Alexandrescun kirjan The D Programming Language esipuheessa Walter Bright kirjoittaa aloittaneensa tämän kielen kehittämisen vuonna 1999. Projekti suunniteltiin C++-kielen uudistamiseksi, jotta alkuperäisen kielen merkittävimmistä puutteista päästään eroon ja tuodaan siihen nykyaikaisia ​​arkkitehtonisia ratkaisuja. D-kieltä luotaessa pyrittiin yhdistämään koottujen ohjelmointikielten suorituskyky dynaamisten turvallisuuteen ja ilmaisukykyyn .

Aluksi kirjoittaja aikoi kutsua kieltä "Marsiksi", mutta C ++:n jatkuvuuden vuoksi kieltä kutsuttiin jatkuvasti keskusteluissa "D":ksi, minkä seurauksena tämä nimi annettiin projektille.

Vakaan kääntäjän versio 1.0 julkaistiin 2. tammikuuta 2007 [4] . Pian kääntäjän julkaisun jälkeen 17. kesäkuuta 2007 kirjoittaja vaihtoi version 1 tukitilaan ja alkoi kehittää versiota 2.0, joka ei alun perin takaa yhteensopivuutta taaksepäin [5] . Tätä versiota (edellinen D-duuriversio tähän mennessä) kehitetään edelleen tähän päivään asti.

Kielikatsaus

D-kieli toteuttaa monia syntaktisia ominaisuuksia ja käsitteitä, joita ei löydy C++:sta: sopimusohjelmointi , sisäänrakennetut yksikkötestit , moduulit otsikkotiedostojen sijaan (pre-C++20), roskienkeräystuki (säilyttää samalla manuaalisen muistin saatavuus). hallinta), sisäänrakennetut assosiatiiviset taulukot, sulkimet , anonyymit toiminnot , mallinnusmoottoria on suunniteltu merkittävästi uudelleen.

Syntaksi

D kuuluu C:n kaltaisten kielten perheeseen, yleisesti ottaen sen syntaksi on samanlainen kuin C/C++/C#, Java. Kieltä kehitettäessä noudatetaan periaatetta: koodin, joka on yhtä pätevä sekä C:ssä että D:ssä, tulee käyttäytyä samalla tavalla.

Hei maailma! » D:lle:

tuonti std . stdio ; void main () { writeln ( "Hei, maailma!" ); }

Aivan kuten C:ssä, funktio main()on aloituspiste.

Rakenteet if, for, while, do-whilenäyttävät ja toimivat samalla tavalla kuin C/C++. Monivalintakäsky switchnäyttää samanlaiselta kuin C++, mutta sallii muuttujat haaraotsikoissa caseja edellyttää jokaisen haaran casepäättyvän breaktai return; Jos haluat siirtyä seuraavaan haaraan nykyisen haarojen käsittelyn jälkeen, sinun on käytettävä erityistä rakennetta goto case. switchMyös rakenteet ilman haaraa ovat kiellettyjä default.

Lisäohjausrakenteista voidaan huomioida static if - ohje ehdolliseen käännökseen (ehto tarkistetaan staattisesti ja sitä vastaavan haaran sisältö sisällytetään koodiin), täysi monivalintaoperaattori final switch - toisin kuin tavallinen switch, se toimii vain arvojen kanssa enum, ja kääntäjä tarkistaa staattisesti, että valinta ottaa huomioon kaikki mahdolliset vaihtoehdot ja antaa muuten virheen. Siellä on myös keräyslenkki foreach.

Modulaarisuus

D:ssä on sisäänrakennettu järjestelmä ohjelman jakamiseksi moduuleiksi (paketteiksi), joka mahdollistaa erillisen kokoamisen ja valvotun tuonnin-viennin. Pakettijärjestelmä muistuttaa Javaa tai Goa: paketit muodostavat hierarkkisen rakenteen, joka liittyy luonnollisesti tiedostojärjestelmäpuuhun. Toisin kuin C++, D:llä ei ole globaalia nimiavaruutta, vaan jokainen nimi on määritelty paketissa. Ohjeen importavulla ohjelmamoduuli voi tuoda paketin, jolloin kaikki siinä olevat määritelmät ovat käytettävissä. Tuodut nimet voidaan käyttää kelpuutuksella: " имя_пакета.имя_объекта".

Kieli tarjoaa useita työkaluja, joiden tarkoituksena on tarjota kätevää työtä tuotujen nimien kanssa. On mahdollista nimetä paketti uudelleen tuonnin aikana, asettaa tuodulle paketille vaihtoehtoinen nimi (alias), tuoda tiettyjä nimiä. Lisäksi kieli sallii ilman lisäohjeita tuotujen nimien käytön ilman paketin nimen määrittelemistä. Siinä on kuitenkin rajoitus: jos ohjelman laajuudessa on useampi kuin yksi vastaava nimen määritelmä, kääntäjä antaa virheen ja vaatii nimen tarkentamista. Tämä estää ns. "nimen kaappauksen", kun uutta pakettia lisättäessä tuontilistoihin kääntäjä alkaa liittää tiettyä nimeä ohjelmassa eri määritelmään kuin se, johon se aiemmin liitettiin.

Universal Function Call Syntax (UFCS)

D toteuttaa UFCS (Uniform function call syntax) -mekanismin, jonka avulla voit kutsua minkä tahansa objektin toimintoja ikään kuin ne olisivat sen menetelmiä. Esimerkiksi:

tuonti std . stdio ; tuonti std . algoritmi ; tuonti std . joukko ; void main () { auto a = [ 2 , 4 , 1 , 3 ]; // kaikki kolme seuraavaa ovat oikein ja toimivat samalla kirjoituksella ( a ); // "klassinen" C- tyyppinen versio . kirjoitettu (); // funktiota kutsutaan ikään kuin se olisi objektin "a" metodi, vaikka se ei ole . kirjoitettu ; // funktiota ilman parametreja voidaan kutsua ilman sulkuja // Tämän avulla voit käyttää funktionaalisille kielille ominaisia ​​kutsuketjuja int [] e = a . lajitella (). käänteinen ; // monirivinen ketjutus on myös mahdollista stdin . byLine ( KeepTerminator . kyllä ​​) . kartta !( a => a . idup ) . joukko . lajitella ; }

Funktioattribuutit

D:n funktiot voidaan määrittää lisävalinnaisilla attribuuteilla, joiden avulla voit määrittää nimenomaisesti joitakin näiden funktioiden toiminnan näkökohtia. Esimerkiksi pure -attribuutilla merkitty funktio on taatusti toiminnallisesti puhdas (joillain varoin) [6] . Toiminnallinen puhtaus tarkistetaan käännösvaiheessa. Esimerkki funktion määritteestä, jossa on attribuutti:

puhdas int summa ( int ensimmäinen , int toinen ) { return ensimmäinen + toinen ; } int summa ( int ensimmäinen , int toinen ) pure //-attribuutit voidaan määrittää myös argumenttiluettelon jälkeen { return ensimmäinen + toinen ; }

Esimerkkejä funktion määritteistä:

  • puhdas - toiminnallinen puhtaus
  • @safe - takuu muistin turvallisesta toiminnasta
  • nothrow - toiminto ei taatusti aiheuta poikkeuksia
  • @nogc - takaa, että toiminto ei sisällä toimintoja, jotka varaavat muistia roskakeräimelle
  • @ominaisuus on luokkametodin attribuutti, joka välttää "naiivien" getters-setterien käytön

Rinnakkaislaskenta

Kielessä on sisäänrakennettu mekanismi rinnakkaisten aliprosessien käynnistämiseksi sisäänrakennetun toiminnon avulla spawn()ja tiedonvaihto rinnakkain suoritettujen koodinpätkien välillä välittämällä viestejä (funktiot send()ja receive()/ receiveTimeout()). D:n kirjoittajat pitävät viestien käyttöä parempana kuin tiedonvaihtoa jaetun muistin kautta.

Kuitenkin tapauksissa, joissa tämä on välttämätöntä (esimerkiksi siirrettäessä suuria tietomääriä korutiinien välillä), on mahdollista käyttää perinteistä lähestymistapaa pakollisille kielille, joilla on jaetut muistialueet, ja päästä synkronointiin semaforien ja mutexien kautta . Tukeaksesi tällaista vaihtoa:

  • käyttämällä muuntajaa sharedsäikeiden välillä jaettua dataa voidaan ilmoittaa, kun taas yritykset työskennellä näiden tietojen kanssa ei-atomioperaatioilla estetään kääntäjätasolla;
  • kielikirjasto tarjoaa standardinmukaiset synkronointiprimitiivit;
  • kielikirjasto tarjoaa erityisiä lukitusluokkia, joita käytetään kontekstin lukitsemiseen : tällaisen luokan esiintymän ilmoittaminen menetelmässä synkronoi koodin kyseisestä pisteestä menetelmän loppuun;
  • Synkronoidun modifikaattorin avulla voit ilmoittaa koko luokan synkronoiduksi : kääntäjä synkronoi automaattisesti kaikki tämän luokan menetelmät, jotta kahta niistä ei voida suorittaa rinnakkain samalle jaetuksi julistetun luokan esiintymiselle.

Kaikkien sisäänrakennettujen synkronointityökalujen osalta kääntäjä valvoo automaattisesti ja kieltää yritykset muuttaa ei-jaettua tietoa synkronoidussa koodissa, joka on saatavilla useammalla kuin yhdellä säikeellä.

Sisäänrakennetut yksikkötestit

D:ssä yksikkötestit ovat osa kieltä ja niitä voidaan käyttää ilman lisäkirjastoja tai kehyksiä.

tuonti std . stdio ; int ensimmäinen ( int [] arr ) { return arr [ 0 ]; } yksikkötesti { int [] arr1 = [ 1 , 2 , 3 ]; int [] arr2 = [ 10 , 15 , 20 ]; väittää ( ensimmäinen ( arr1 ) == 1 ); väittää ( ensimmäinen ( arr2 ) == 10 ); } void main () { // ... }

Ohjelmointiparadigmat

D toteuttaa viisi pääohjelmointiparadigmaa - imperative , OOP , metaohjelmointi , toiminnallinen ohjelmointi ja rinnakkaislaskenta ( toimijamalli ).

Muistinhallinta

D käyttää roskakerääjää muistinhallintaan, mutta manuaalinen ohjaus on mahdollista myös käyttämällä operaattorin ylikuormitusta newja delete, samoin kuin käyttämällä malloc ja free , kuten C. Roskakeräin voidaan kytkeä päälle ja pois manuaalisesti, voit lisätä ja poistaa muistia alueilla sen näkyvyydestä, pakota käynnistämään osittainen tai täydellinen kokoonpanoprosessi. On olemassa yksityiskohtainen käsikirja , jossa kuvataan erilaisia ​​muistinhallintamenetelmiä D:ssä tapauksissa, joissa tavallista roskakeräystä ei voida soveltaa.

SafeD

SafeD on D-kielen osajoukon nimi, jonka käyttö takaa muistin käytön turvallisuuden .

Tietotyypit

Kielessä on runsaasti määriteltyjä tietotyyppejä ja mahdollisuuksia uusien tyyppien määrittämiseen. D-kielen tyypit on jaettu arvotyyppeihin ja viitetyyppeihin.

Perustyypit

Perustyypit voidaan jakaa seuraaviin luokkiin [7] :

  • void - erikoistyyppi tyhjille arvoille
  • bool - Boolen tyyppi
  • kokonaislukutyypit: signed byte, short, int, longja niitä vastaavat etumerkittömät ubyte, ushort, uint,ulong
  • liukulukutyypit: float, double, real. Liukulukutyypeille on olemassa vastaavat muunnelmat imaginaari- ja kompleksiluvuille :
    • kuvitteellinen: ifloat, idouble,ireal
    • monimutkainen: сfloat, сdouble,сreal
  • merkki (merkki) tyypit: char, wchar, dchar, jotka ilmaisevat UTF-8-, UTF-16- ja UTF-32-koodauksen koodiyksiköitä, vastaavasti.

Toisin kuin C++, kaikki kokonaislukutyyppien koot määritellään määrittelyssä. Eli tyyppi int on aina 32 bittiä. Kokonaislukuliteraaleja voidaan kirjoittaa desimaaleina, binäärinä (etuliite 0b) ja heksadesimaalilukuina (etuliite 0x). Literaalien C-tyylinen merkintä oktaalissa (eli etuliitteenä 0) on poistettu, koska tällainen merkintä on helppo sekoittaa desimaaliin. Jos sinun on edelleen käytettävä oktaalijärjestelmää, voit käyttää std.conv.octal- mallia .

Johdetut tyypit
  • pointer -osoitin
  • array - joukko
  • associative array - assosiatiivinen matriisi
  • function -toiminto
  • delegate - delegoida
  • string, wstring, dstring ovat käteviä aliaksia muuttumattomille etumerkitty (merkki) -tyyppisille taulukoille immutable(char)[], immutable(wchar)[]ja immutable(dchar)[], jotka ilmaisevat muuttumattomia ( muuttumattomia tarkenteita ) Unicode-merkkijonoja yhdessä UTF-8-, UTF-16- ja UTF-32-koodauksista.
Mukautetut tyypit
  • alias -salanimi
  • enum - luettelointi
  • struct - rakenne
  • union - yhdistys
  • class - Luokka
Tyyppipäätelmä, avainsanat "auto", "typeof" ja nimettömät ("Voldemort") tyypit

D:llä on tyyppipäättelymekanismi. Tämä tarkoittaa, että tyyppi voidaan pääsääntöisesti laskea käännöshetkellä eikä sitä tarvitse erikseen määrittää. Esimerkiksi lauseke: auto myVar = 10muunnetaan muotoon int myVar = 10. Tyyppipäätelmän käyttämisellä on useita etuja:

  • Lyhyempi ja luettavampi koodi, varsinkin jos se käyttää pitkiä rakenne- tai luokkanimiä. Esimerkiksi ilmaisu

VeryLongTypeName var = VeryLongTypeName(/* ... */);

voidaan korvata

auto var = VeryLongTypeName(/* ... */);

  • Avainsanan type avulla voit luoda muuttujan, joka on samantyyppinen kuin olemassa oleva muuttuja, vaikka sen tyyppi olisi tuntematon. Esimerkki:
// tiedosto1.d int var1 ; // tiedosto2.d typeof ( var1 ) var2 ; // var2 saa tyypin int
  • anonyymien tyyppien käyttö. Esimerkki:
// Funktio itse asiassa palauttaa tuloksen, jonka tyyppi on TheUnnameable, mutta koska tämä tyyppi on määritetty funktion sisällä, // emme voi asettaa sitä erikseen palautustyypiksi. // Voimme kuitenkin asettaa palautustyypiksi "auto", jolloin kääntäjä selvittää sen itse auto createVoldemortType ( int arvo ) { struct Nimeämätön { int getValue () { return value ; } } return TheUnnameable (); }

Nimettömiä tyyppejä kutsutaan epävirallisesti Voldemort-tyypeiksi Voldemortin ( "Hän-Kuka-Ei saa olla nimetty") mukaan, Harry Potter -sarjan päävastastajan [8] mukaan . Tyyppipäätelmää ei pidä sekoittaa dynaamiseen kirjoittamiseen , koska vaikka tyyppiä ei ole erikseen määritelty, se lasketaan käännösaikana, ei ajon aikana.

Toteutukset

  • DMD  - Digital Mars D ( VIKI ), Walter Brightin kehittämä referenssikääntäjä. Tämä kääntäjä toteuttaa kielistandardin täydellisimmin, tuki kaikille innovaatioille näkyy siinä ensisijaisesti. Etu- ja takaosa ( [1] ) jaetaan Boost - lisenssillä .
  • LDC  - DMD ( WIKI ) - käyttöliittymä LLVM :lle ( SITE )
  • GDC  - DMD ( VIKI ) - GCC-kääntäjän käyttöliittymä
  • LDC iOS:lle  — LDC-pohjainen työkalusarja ristiinkääntämiseen iOS:lle
  • D Androidille  (linkki ei saatavilla)  – Toolkit ristikääntämiseen Androidiin (x86 DMD:tä ja ARM LDC:tä käyttäen )
  • SDC (Stupid D Compiler)  on kokeellinen kääntäjä (kääntäjä kirjastona), joka käyttää LLVM:ää taustana eikä perustu DMD:hen.
  • Calypso  - LDC-haarukka, joka tarjoaa suoran Clang-yhteentoimivuuden mahdollistaen C-otsikoiden käytön suoraan.
  • MicroD  - DMD-haarukka, joka tulostaa C-lähdekoodin objektitiedostojen sijaan
  • DtoJS  - DMD-haarukka, joka tulostaa JavaScript-lähdekoodin objektitiedostojen sijaan
  • D-kääntäjä .NETille  – taustaohjelma D-ohjelmointikielen 2.0-kääntäjälle [9] [10] . Se kokoaa koodin Common Intermediate Language (CIL) -tavukoodiksi konekoodin sijaan. CIL voidaan sitten suorittaa Common Language Infrastructure (CLR) -virtuaalikoneen kautta .
  • DIL on käsin tehty kääntäjätoteutus D-ohjelmointikielelle, joka on kirjoitettu D v2:lla käyttäen Tango - standardikirjastoa. Lexer ja jäsentäjä on täysin toteutettu. Semanttista analyysiä työstetään. Taustaohjelma on todennäköisesti LLVM .

Kehitystyökalut ja työkalut

IDE:t ja editorit

Tuki D:lle eri IDE :issä , toteutettu laajennuksilla:

IDE kytkeä Alustat
IntelliJ IDEA DKieli cross-platform
Pimennys DDT cross-platform
MonoDevelop/Xamarin Mono-D cross-platform
visuaalinen studio Visual-D Windows
Visual Studio Code Koodi-D cross-platform
xcode D Xcodelle Mac-käyttöjärjestelmän kymmenes versio
Zeus IDE D Zeus IDE:lle Windows

D-kielen alkuperäiset IDE:t:

  • Coedit (Windows, Linux)
  • DLangIDE (Windows, Linux, OS X) - rakennettu itse D:lle, tukee syntaksin korostusta, koodin täydentämistä, DUB:ia, erilaisia ​​kääntäjiä, virheenkorjausta ja paljon muuta.

D:tä tukevat monet tekstieditorit: Vim, Emacs, Kate, Notepad++, Sublime Text, TextMate ja muut [11] .

Paketinhallinta

DUB on DUB:n virallinen paketinhallinta. DUB toimii pakettivarastona ja sitä käytetään riippuvuuden hallintaan ja myös koontijärjestelmänä. Riippuvuuksien joukko, projektia koskevat metatiedot ja kääntäjän liput tallennetaan JSON- tai SDL-muodossa. Esimerkki yksinkertaisesta projektitiedostosta (JSON):

{ "nimi" : "projektini" , "description" : "Pieni verkkopalveluni." , "tekijät" : [ "Peter Parker" ], "kotisivu" : "http://omaprojekti.example.com" , "lisenssi" : "GPL-2.0" , "riippuvuudet" : { "vibe-d" : " ~>0,7,23" } }

Apuohjelmat ja työkalut

rdmd  on DMD-kääntäjän mukana tuleva apuohjelma, jonka avulla voit kääntää ja ajaa D-lähdetiedostoja lennossa. Tämä mahdollistaa D:n käytön pienissä ohjelmissa samalla tavalla kuin bash, perl ja python:

// myprog.d # !/ usr / bin / env rdmd tuonti std . stdio ; void main () { writeln ( "Hei maailma, jossa automaattinen komentosarja on käynnissä!" ); }

Konsolissa olevan komennon kutsuminen ./myprog.dkääntää ja suorittaa ohjelman automaattisesti.

DPaste [12] on JSBin- ja CodePen-palveluiden  kaltainen online-palvelu D-ohjelmien suorittamiseen selaimessa .

run.dlang.io [13]  on online-kääntäjä ja purkuohjelma.

Käyttö, jakelu

D-kielen jakelu on rajallista, mutta sitä käytetään todelliseen teolliseen ohjelmistokehitykseen. Virallisella verkkosivustolla [14] on luettelo 26 yrityksestä, jotka menestyksekkäästi käyttävät D:tä ohjelmistojärjestelmien kehittämiseen useilla eri aloilla, mukaan lukien järjestelmäohjelmointi, verkkoprojektit, pelit ja pelimoottorit, ohjelmistot tieteellisiin laskelmiin, apuohjelmat eri tarkoituksiin. , ja niin edelleen. D-kieltä edistää erityisesti D Language Foundation, julkinen organisaatio, joka edistää itse D-kieltä ja sen avulla luotuja avoimen lähdekoodin ohjelmistoja .

TIOBE-indeksin mukaan suurin kiinnostus D:tä kohtaan ilmeni vuosina 2007-2009, maaliskuussa 2009 D-kieliindeksi saavutti 1,8:n (12. sija), mikä on sen absoluuttinen maksimi. 2010-luvun ensimmäisellä puoliskolla tapahtuneen laskun jälkeen vuoteen 2016 mennessä se joutui suhteellisen vakaaseen tilaan - indeksin numeerinen arvo vaihtelee välillä 1,0-1,4, rankingissa kieli on kolmannella kymmenellä. Kehittäjän avoimia työpaikkoja koskevien tietojen koontitulosten perusteella laaditussa suosioluokituksessa D - kieli ei ole päälistalla (top-20) eikä yleisellä (top-43) listalla, mikä viittaa työnantajien alhaiseen kysyntään.

Koodiesimerkkejä

Esimerkki 1

Hei maailma! »

tuonti std . stdio ; void main () { writeln ( "Hei, maailma!" ); }

Esimerkki 2

Ohjelma, joka tulostaa komentoriviargumentit, joilla sitä kutsuttiin

tuonti std . stdio : writefln ; void main ( merkkijono [] args ) { foreach ( i , arg ; args ) writefln ( "args[%d] = '%s'" , i , arg ); }

Esimerkki 3

Ohjelma, joka lukee sanaluettelon tiedostosta rivi riviltä ja tulostaa kaikki sanat, jotka ovat muiden sanojen anagrammeja

tuonti std . stdio , std . algoritmi , std . alue , std . merkkijono _ void main () { dstring [][ dstring ] signs2words ; foreach ( dchar [] w ; lines ( Tiedosto ( "words.txt" ))) { w = w . chomp (). laskea (); muuttumaton avain = w . dup . lajitella (). vapauttaa (). idup ; merkit2sanat [ avain ] ~= w . idup ; } foreach ( sanat ; merkit2sanat ) { if ( sanat . pituus > 1 ) { writefln ( sanat . join ( " " )); } } }

Katso myös

  • Digitaalinen Mars
  • Jos haluat vertailla D:n ominaisuuksia muihin kieliin, katso Ohjelmointikielten vertailu (syntaksi)

Muistiinpanot

  1. Kuvaus sopimusohjelmointiparadigman toteutuksesta Dee-kielellä . Arkistoitu alkuperäisestä 3. tammikuuta 2014.
  2. Muutosloki: 2.100.2 .
  3. D Android-D-ohjelmointikielen keskustelupalstalle . Haettu 7. kesäkuuta 2015. Arkistoitu alkuperäisestä 21. toukokuuta 2015.
  4. DMD 1.00 - tässä se on! (digitalmars.D.announce) Arkistoitu 5. maaliskuuta 2007 Wayback Machinessa 
  5. D 2.0 muutosloki (downlink) . Haettu 11. tammikuuta 2009. Arkistoitu alkuperäisestä 1. kesäkuuta 2012.    (Englanti)
  6. Functions - D - ohjelmointikieli . Haettu 17. kesäkuuta 2015. Arkistoitu alkuperäisestä 17. kesäkuuta 2015.
  7. Tyypit - D - ohjelmointikieli . Haettu 7. kesäkuuta 2015. Arkistoitu alkuperäisestä 17. toukokuuta 2015.
  8. Voldemortin tyypit kirjassa D | Tohtori Dobbin . Haettu 8. kesäkuuta 2015. Arkistoitu alkuperäisestä 19. kesäkuuta 2015.
  9. CodePlex-arkisto . CodePlex-arkisto. Haettu 16. helmikuuta 2018. Arkistoitu alkuperäisestä 26. tammikuuta 2018.
  10. D.NET-kääntäjän lähde on nyt saatavilla . InfoQ. Haettu 16. helmikuuta 2018. Arkistoitu alkuperäisestä 30. marraskuuta 2018.
  11. Editors-D Wiki . Käyttöpäivä: 16. kesäkuuta 2015. Arkistoitu alkuperäisestä 3. heinäkuuta 2015.
  12. Dpaste (downlink) . Haettu 16. kesäkuuta 2015. Arkistoitu alkuperäisestä 6. heinäkuuta 2015. 
  13. run.dlang.io . Haettu 23. syyskuuta 2019. Arkistoitu alkuperäisestä 24. joulukuuta 2019.
  14. Organisaatiot, jotka käyttävät D-kieltä . dlang.org. Haettu 7. lokakuuta 2019. Arkistoitu alkuperäisestä 6. elokuuta 2019.

Kirjallisuus

Linkit


,