D (ohjelmointikieli)

ohjelmointikieli

D on Walter Brightin kehittämä moniparadigmainen oliopohjainen imperatiivinen ohjelmointikieli. Se on kehitetty C/C++:n pohjalta ja siinä on uudistettu monia C++:n ominaisuuksia. Lisäksi hyödyllisiksi havaittuja ominaisuuksia on lainattu muista kielistä.

D
Paradigma moniparadigmainen: imperatiivinen, olio, funktionaalinen, meta
Tyypitys vahva, staattinen
Yleinen suoritusmalli käännetty
Muistinhallinta roskienkeruu, manuaalinen
Julkaistu 1999
Suunnitellut Walter Bright
Kehittäjä Digital Mars
Vakaa versio 1.071 / 2.056 (27. lokakuuta 2011)
Merkittävimmät toteutukset DMD (referenssitoteutus), GDC, LDC
Vaikutteet C, C++, C#, Eiffel, Java, Lisp
Vaikuttanut Delight, MiniD, Vala
Käyttöjärjestelmä Windows, Linux, Mac OS X, FreeBSD, AIX
Verkkosivu dlang.org
Uutisryhmä digitalmars.D (news.digitalmars.com)

Ominaisuudet muokkaa

D:n suunnittelussa on otettu huomioon C++:n käytössä vuosien aikana kertyneitä kokemuksia. D käyttää monia C++:n konsepteja ja laajentaa toiminnallisuutta toteuttamalla kielen tasolla tuottavuutta lisääviä ominaisuuksia, joita ovat esimerkiksi sopimuspohjainen ohjelmointi, yksikkötestaus, aidot ohjelmamoduulit, roskienkeruu, ensimmäisen luokan oliot, kehittyneet taulukko- ja assosiatiivinen taulukko-tietotyypit, sisäluokat ja -funktiot, sulkeumat ja uudelleen suunniteltu geneerinen ohjelmointi. D mahdollistaa C++:n lailla matalan tason ohjelmoinnin, jossa apuna voidaan käyttää kääntäjän assembleria. C++:n moniperintä on korvattu tavallisella yksinkertaisella perinnällä, rajapinnoilla ja mixineillä. D:n esittelyt, lauseet ja lausekkeet muistuttavat läheisesti C++:n vastaavia.

Yhteensopivuus muiden järjestelmien kanssa muokkaa

D tukee täydellisesti C-kielen ABI-rajapintaa (Application Binary Interface) sekä C:n tietotyyppejä ja mahdollistaa näin suoran pääsyn C-kieliseen ohjelmakoodiin ja kirjastoihin. C:n standardikirjasto on osa standardia D-kieltä. Koska D ei vielä ole standardoitu, tarkoitetaan tällä Digital Marsin referenssi-implementaatiota ja -spesifikaatiota.

C++:n ABI ei ole tuettu, mutta D-kielestä voidaan kutsua C-kielen ABI:n kautta C++-koodia, joka on kääritty C-kielisiin funktioihin. D kuitenkin tukee täysin C++-kielistä COM (Component Object Model) koodia.

Toteutukset muokkaa

Nykyiset D:n toteutukset kääntävät ohjelmat suoraan natiivikoodiksi. Tällä hetkellä merkittävimmät kääntäjät D:lle ovat Digital Marsin DMD sekä vapaa GDC.

DMD:n etuosa (selaaja, jäsennin) on julkaistu GNU GPL:n ja Artistic License:n alla. Toteutuksen tekijänoikeudet omistaa pääosin Digital Mars, muilta osin koodi on joko public domainia tai muun yhteensopivan vapaan lisenssin alla. Kääntäjä perustuu viralliseen D-spesifikaatioon, mutta on suljettua lähdekoodia ja tukee ainoastaan Windows- ja Linux/x86-alustoja.

Toinen merkittävä D-kääntäjä, GDC, yhdistää DMD:n etuosan GCC:tä käyttävään takaosaan. GDC toimii teoriassa kaikilla alustoilla, joilla GCC:kin, ja on lisäksi julkaistu vapaan GNU GPL -lisenssin alla. GDC on käytännön syistä ajoittain spesifikaation osalta jäljessä virallista kääntäjää. Linux-jakeluista ainakin Debian, Gentoo ja Ubuntu tarjoavat kääntäjää paketinhallintansa kautta.

D on yhä aktiivisen kehitystyön alla ja sen kääntäjistä julkaistaan säännöllisesti uusia versioita. Kääntäjän 1.0-haaraan ilmestyy lähinnä bugikorjauksia, mutta 2.0-haaraan myös epävakaita uusia toimintoja. Ehkä merkittävin muutos 2.0-versiossa on C++-kielen const-järjestelmän vastine. D 2.0 sisältänee ilmestyessään myös monia muita uusia ominaisuuksia, kuten aidot sulkeumat, paremman muistimallin monisäikeiselle ohjelmoinnille, suurehkon päivityksen standardikirjastoon ja monia pienempiä korjauksia.

Esimerkkejä muokkaa

Hei maailma muokkaa

Tämä esimerkki kirjoittaa ruudulle sanat "Hei maailma!" ja sen jälkeen komentorivin argumentit. Jokaisen D-ohjelman suorittaminen alkaa main funktiosta, ja args on merkkijonojen taulukko, jossa komentorivin argumentit ovat. Argumentit ovat valinnaisia. Merkkijonoa kuvataan D:ssä tyypillä string. D 1.x:ssä string on alias merkkijonojen taulukolle(char[]), mutta 2.x estää merkkijonon muokkaamisen. Useiden merkkijonojen taulukko on vastaavasti string[].

import std.stdio;       // tuo writefln()

int main(string[] args)
{
    writefln("Hei maailma!");
    foreach(indeksi, arvo; args)
        writefln("args[%d] = '%s'", indeksi, arvo);
    return 0;
}

foreach-lauseella voidaan käydä läpi mikä tahansa kokoelma. Vakiotietotyypit tarjoavat oletustoiminnallisuuden, mutta iterointi voidaan tarvittaessa erikoistaa määritellyissä luokissa. Lause päättelee indeksin ja arvon tyypit automaattisesti, mutta ne voidaan myös ilmoittaa.

Hajautustaulukot muokkaa

Esimerkki havainnollistaa hajautustaulujen käyttöä monimutkaisen tietorakenteen rakentamisessa.

import std.stdio;       // tuo write[f]ln()

int main(string[] args)
{
    // Määritellään hajautustaulu, jossa arvoina on taulukoita merkkijonoista ja
    // avaimena merkkijono
    string[] [string] säiliö;

    // Lisätään säiliöön henkilöitä ja heille esineitä
    säiliö["Tuomikki"] ~= "puukko";
    säiliö["Airikka"] ~= "löylykauha";
    säiliö["Tuomikki"] ~= "puhelin";

    // Käydään läpi säiliön henkilöt
    foreach (string henkilö, string[] esineet; säiliö)
        kerro_montako_esinettä(henkilö, esineet);
    return 0; // ohjelma onnistui
}

void kerro_montako_esinettä(string henkilö, string[] esineet)
{
    writeln(henkilö, " kantaa ", esineet.length, " esinettä.");
}

Lähteet muokkaa

  • Alexandrescu, Andrei: The D programming language. Upper Saddle River, N. J.: Addison-Wesley, 2010. ISBN 978-0-321-63536-5. (englanniksi)

Aiheesta muualla muokkaa