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] .
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.
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.
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.
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.
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 ; }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ä:
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:
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ä.
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 () { // ... }D toteuttaa viisi pääohjelmointiparadigmaa - imperative , OOP , metaohjelmointi , toiminnallinen ohjelmointi ja rinnakkaislaskenta ( toimijamalli ).
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 on D-kielen osajoukon nimi, jonka käyttö takaa muistin käytön turvallisuuden .
Kielessä on runsaasti määriteltyjä tietotyyppejä ja mahdollisuuksia uusien tyyppien määrittämiseen. D-kielen tyypit on jaettu arvotyyppeihin ja viitetyyppeihin.
PerustyypitPerustyypit voidaan jakaa seuraaviin luokkiin [7] :
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 tyypitD: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:
VeryLongTypeName var = VeryLongTypeName(/* ... */);
voidaan korvata
auto var = VeryLongTypeName(/* ... */);
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.
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:
D:tä tukevat monet tekstieditorit: Vim, Emacs, Kate, Notepad++, Sublime Text, TextMate ja muut [11] .
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" } }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.
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.
Hei maailma! »
tuonti std . stdio ; void main () { writeln ( "Hei, maailma!" ); }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 ); }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 ( " " )); } } }
Ohjelmointikielet | |
---|---|
|
C-ohjelmointikieli | |
---|---|
Kääntäjät |
|
Kirjastot | |
Erikoisuudet | |
Jotkut jälkeläiset | |
C ja muut kielet |
|
Luokka: C-ohjelmointikieli |
,