D-OHJELMOINTIKIELI AA-kerho, 33 Antti Uusimäki Arto Savolainen
2 D-OHJELMOINTIKIELI D-kielen historia alkaa vuodesta 1999, kun Walter Bright aloitti uuden ohjelmointikielen kehittämisen. Ensimmäinen versio julkaistiin joulukuussa 2001, joka kehittyi D1-kielen 1.0 versioksi tammikuussa 2007. D-kielen yhteisö oli tyytymätön kielen viralliseen Phobos runtime- ja standarikirjastoon, ja alkoi kehittämään vaihtoehtoista Tango-kirjastoa. Tango ja Phobos eivät olleet yhteensopivia erilaisista runtime-rajapintaratkaisuista johtuen, ja molempien yhtäaikainen kehitys aiheutti ongelmia kielen käyttäjille, joiden piti valita kumpaa kirjastoa käyttää. Kesäkuussa 2007 kielestä julkaistiin versio D2, jonka oli tarkoitus esitellä uusia ja mahdollisesti vanhan kielen kanssa yhteensopimattomia ominaisuuksia. D-kielen version D1 bugeja alettiin korjaamaan, ja samanaikaisesti D2-version kehitys jatkui kasvavaa tahtia. D2- versio erotti standard-kirjaston ajoajasta, joka mahdollisti Phoboksen ja Tangon yhteensopivuusongelmien korjaamisen. D1-version kehitys lakkautettiin joulukuussa 2012 ja versiosta D2 tuli kielen virallinen versio, jota kutsutaan nykyään yksinkertaisesti nimellä D. D on korkean tason ohjelmointikieli, jonka tavoitteena on olla turvallinen, tarjota mahdollisuus kirjoittaa suorituskyvyltään tehokasta koodia, sekä tarjota rajapinta joka antaa käyttäjälle pääsyn lähelle käyttöjärjestelmää ja laitteistoa. Ohjelmointikieli on saanut pääasiassa vaikutteita C++-ohjelmointikielestä, koska yksi tavoitteista oli suunnitella uudelleen C++-kielen ominaisuuksia. Vaikutteita on otettu myös lukuisista muista ohjelmointikielistä, kuten Java, C#, Python, Ruby ja Eiffel. D on moniparadigmainen ohjelmointikieli, joka painottuu etupäässä imperatiiviseen ja olio-ohjelmointiparadigmaan. Imperatiivinen ohjelmointi on peräisin C-perheen kielistä ja kielen syntaksi on lähes identtistä C tai C++kielen kanssa. Esimerkiksi kielen syntaksissa puolipiste ilmaisee lausekkeiden päättymisen, ja funktioiden vaikutusalue määritellään aaltosulkujen avulla. Olio-ohjelmointiominaisuuksien suunnittelussa on otettu vaikutteita Javakielestä. Toisin kuin C++, D ei salli moniperintää, ja käyttää Java-tyylisiä rajapintoja (interface). Rakentajat määritellään this-avainsanan avulla. Periyttäessä kantaluokan rakentajaa kutsutaan super-avainsanan avulla ja sitä voidaan kutsua missä tahansa kohtaa rakentajan koodia. Luokille voidaan määritellä metodeiksi C#-tyylisiä propertyjä @property-avainsanan avulla, jotka toimivat helppokäyttöisinä rajapintoina luokkien attribuutteihin. D-kielessä
3 voidaan myös vertailla suoraan Struct-tietorakenteiden yhtäsuuruutta ilman, että täytyy erikseen määritellä vertailuoperaattori. D-ohjelmointikielessä on sisäänrakennettu sopimussuunnittelun tukeminen ja poikkeukset. Tämä on tehty yhdenmukaisemmaksi, yksinkertaisemmaksi ja helpommin hallittavaksi kuin C++-kielessä. Kääntäjät voivat tehdä tehokkaampaa koodia sopimuksista saadun informaation perusteella. D- kielessä Assert määrittää lausekkeen, jonka pitää olla tosi, muussa tapauksessa heitetään poikkeus AssertError. Funktioissa sopimusten ehdot määritellään in, out, ja body-avainsanojen avulla. In-lohkossa määritellään asserteilla esiehdot. Out-lohko ottaa parametrikseen funktion paluuarvon ja tarkastaa assertin avulla jälkiehdon. Funktion normaali toiminnallisuus sijoitetaan body-lohkon sisälle. Avainsanaa invariant käytetään tarkistamaan Assertin avulla luokan tila rakentajan suorittamisen jälkeen. Kielessä on myös tuki sopimussuunnittelun periytymiselle. Metaohjelmointi toteutetaan templaateilla, joiden käyttö D-kielessä on yritetty tehdä helpommaksi kuin C++-kielessä yksinkertaistamalla syntaksia. Jos mahdollista, funktiot suoritetaan käännösaikana optimointisyistä. Funktionaalisen ohjelmoinnin ominaisuuksia D-kielessä ovat muun muassa sulkeumat ja lambda-lauseet. Lisäksi D tukee rinnakkaista ohjelmointia. D on staattisesti tyypitetty kieli samoin kuin C ja C++, eli muuttujan tyyppi tarvii tietää jo käännösaikana. Template-metaohjelmoinnilla voidaan mallintaa dynaamista tyypitystä. Muistinhallinta tapahtuu roskienkeruun avulla. D mahdollistaa kattavan roskienkeruun hallinnan. Ohjelmoija voi tarvittaessa ottaa roskienkeruun pois päältä tai muokata tarkkailtua muistialuetta. Kieli sisältää myös C-kielen mallocja free-funktiot. D sisältää kaikki C++ vastaavat primitiivityypit. Avainsana unsigned on hylätty ja positiiviset tyypit merkitään lyhyemmin u-etuliitteellä, kuten esimerkiksi uint. Liukulukujen laskentatarkkuutta on parannettu tukemalla real-tyyppiä, joka on prosessorituesta riippuen joko double tai laajennettu 80-bittinen esitys. Kieleen on sisällytetty eritysarvot, - ja NaN (Not-a-Number), jotka auttavat virheiden tunnistamisessa liukulukuja käsiteltäessä. Jokaiselle primitiivityypille on määritelty oletusalustaja (.init), joka varmistaa, että muuttujalle on aina asetettu arvo vaikka sitä ei alustettaisi koodissa. Tämä poistaa määrittelemättömäksi jääneistä muuttujista johtuvat virheet. D-kielen säiliöitä ovat array, binaryheap, dlist, rbtree ja slist. Array pelkällä []- merkinnällä on C++-kielen vector- ja deque-säiliöitä vastaava dynaaminen tietorakenne. Asettamalla hakasulkujen sisälle kokonaisluku saadaan C-kielen
4 arrayta vastaava staattinen tietorakenne. Assosiatiivinen array voidaan tehdä asettamalla hakasulkujen sisälle tyyppi, joka toimii indeksinä, kuten esimerkiksi string[string] hello. Tämän jälkeen voidaan taulukkoon tallentamisen yhteydessä asettaa tunniste hakasulkujen sisälle, joka toimii indeksinä alkiolle. D-kielen string on toteutettuna array tietorakenteen erikoistuksena, joten char-tyyppistä taulukkoa voidaan vertailla string-tietotyyppiin. D nopeuttaa käännösprosessia käyttämällä kirjastojen symbolista sisällyttämistä. C ja C++ käyttävät esiprosessorin include-mekanismia, joka lisää sisällytettävän tiedoston sisällön suoraan tekstinä käännettävään tiedostoon. Suurissa projekteissa tämä voi hidastaa käännösaikaa huomattavasti, ja vaatii makrojen käyttöä useiden lisäysten estämiseksi. D:ssä sisällytettävät tiedostot käännetään etukäteen. Myös useita muita C- esikääntäjän makroja on muutettu D:ssä kielen sisäänrakennetuiksi ominaisuuksiksi. Nimiavaruudet on D:ssä toteutettu module-mekanismilla. Jokainen moduuli on omassa tiedostossaan, ja rajoittaa nimiavaruuden tiedoston sisältöön. C++:n using-esittely on korvattu alias-avainsanalla, jota voi käyttää myös muiden käsitteiden kuten tyyppien tai funktioiden uudelleennimeämiseen. Toisin kuin C++:n typedef, alias ei luo uutta tyyppiä. Moduulejen lisäysjärjestys ei vaikuta ohjelman semantiikkaan. Moduuleista voi kasata packageiksi kutsuttuja hierarkioita. Kielelle on tarjolla useita kääntäjätoteutuksia. DMD on Walter Brightin virallinen D kääntäjä, ja GDC ja LDC ovat avoimen lähdekoodin vaihtoehtoja. D:tä tukevia integroituja kehitysympäristöjä ovat mm. Eclipse, Microsoft Visual Studio, Emacs ja MonoDevelop. Vaikka joissain tapauksissa D saattaa olla nopeampi, C++-kääntäjät näyttäisivät kuitenkin tuottavan yleisesti nopeampaa koodia. D:n muistinhallinta vaikuttaisi olevan suoritusta eniten hidastava tekijä. D-ohjelmointikieltä käytetään korvaamaan C++-kieltä järjestelmissä, joissa vaaditaan suorituskyvyltään tehokasta koodia ja korkeamman tason ohjelmointikielen ominaisuuksia lisäämään tuottavuutta. Mainittavia asioita ovat esimerkiksi yksinkertaisempi syntaksi templateille ja funktionaaliselle ohjelmoinnille, sekä roskienkeruu. Esimerkiksi Facebook on alkanut käyttämään D-kieltä tuotannossa ja suomalainen peliteollisuus Remedy on myös kiinnostunut siitä.
5 Lähteet: http://dlang.org/ https://en.wikipedia.org/wiki/d_(programming_language) http://forum.dlang.org/post/sxbssnhflvzklpyfvtlp@forum.dlang.org http://www.drdobbs.com/mobile/facebook-adopts-d-language/240162694