Wednesday, December 21st, 2011
Skriv en kommentar

Dagens programmeringsspråk heter rett og slett D. Og det er jo et greit navn på et språk som blant annet kan erstatte C. Egentlig er det vel mest sammenlignbart med C++, men D har også latt seg påvirke av språk som Java og C#, og dynamiske språk som Python og Ruby.

D forsøker å kombinere ytelsen til C++, sikkerheten og minnehåndteringen i de mest moderne, kompilerte språkene, og de dynamiske språkenes evne til å la utvikleren uttrykke seg så enkelt og effektivt som mulig.

d

Effektivitet, enkelhet og kraft

D kompileres til effektiv maskinkode. Ideomatisk D-kode er både rask og sikker. Men utvikleren har mulighet til å “sku av” typesikkerhet, og bruke pekere, direkte tilgang til C-funksjoner, og til og med inline assembly, om han ønsker det.

D lar deg skrive ganske mye kode uten unødvendige typedeklarasjoner – kompilatoren finner ut av det. Språket har også god og fleksibel, automatisk minnehåndtering.

Dessuten støtter språket “de fleste” programmeringsparadigmene, og har god samtidighets-støtte. Noen stikkord som bør være kjente for dem som leser denne bloggen er immutable state og message passing. D tillater ikke deling av state på tvers av tråder “by default”, men tilbyr kontrollert deling av data som kan endres (mutable state) når det er påkrevd. Her skiller altså D seg kraftig ut fra de fleste andre, imperative språkene.

Hvem D er laget for

D er laget for utviklere som ikke trives med objektorienteringen i C++ fordi den er for kompleks. D er laget for utviklere som liker kraften i C++, men som er frustrerte over å måtte bruke det meste av tiden sin på eksplisitt minnehåndtering og på å lete etter pointer-bugs.

D er også laget for utviklere som programmerer én del av løsningene sine i skripspråk som Python eller Ruby, og en annen del i C++. D kombinerer mange av styrkene fra begge sider, og gjør at du kan holde deg i ett språk.

Og sist men ikke minst: D er et praktisk språk. Det er laget for å få jobben gjort.

Litt kode

Syntaksen i D ser stort sett ut som C/C++. Løsningen av euler-oppgave nummer 1 inneholder derfor ingen overraskelser:

10 import std.stdio;
11 
12 bool includeNumber(int x)
13 {
14   return x % 3 == 0 || x % 5 == 0;
15 }
16 
17 void main()
18 {
19   int sum = 0;
20   for (int i = 0; i < 1000; i++)
21     if(includeNumber(i))
22       sum += i;
23   writeln(sum);
24 }

Vil du se mer D-kode er jeg redd du må ta turen til d-programming-language.org.

Noen flere detaljer

Merk at D ikke er bakoverkompatibelt med C. D har heller ingen preprosessor, og støtter ikke multippel arv. D støtter derimot templates, men disse skal være enklere å bruke enn varianten man finner i C++ (jeg kan ikke nok C++ til å uttale meg om dette selv).

D støtter også kodekontrakter / Design By Contract, som beskrevet i artikkelen om språket Cobra. Og det har innebygde muligheter for enhetstester.

En liten detalj med D som jeg virkelig setter pris på er at alle metoder er virtuelle. Jeg har alltid sagt at C# burde ha virtuelle metoder by default, men D har tatt det enda lengre. Torbjørn liker dette!

Konklusjon

Av og til kan det virke som om C og C++ har et absolutt monopol på visse områder. Da er det interessant når det kommer et språk som forsøker å erstatte og overgå dem. Selv om utbredelsen foreløpig er begrenset har jeg stor tro på D.

Ta turen innom www.d-programming-language.org – en behagelig side med mye informasjon – og bli inspirert du også!

Kategorier: Julekalender, Polyglot.
RSS feed for kommentarene. Tilbaketråkk.

5 kommentarer til “Programmeringsspråket D”

  1. Jonas Says:

    D har ikke noe preprosessor, men det er ting i språket for å gjøre det meste av det (fornuftige) preprosessoren til C kan brukes til. Både C og D er litt lenge siden nå, men så vidt jeg husker er det viktigste mixins istedetfor #define-makroer, og static if og version istedetfor #ifdef-greier. Som med preprosessor-greiene virker det compile-time og avgjør hvilken kode som blir kompilert, men det føles mye mer som en ordentlig del av språket og koden blir penere og mer elegant og det ene med det andre. Det er mer restriktivt enn preprosessoren og du kan f.eks. ikke gjøre ting som #define END } (men så var det det med fornuftige da). Synes det er litt kult, særlig siden sånne conditional compilation-greier ikke er ting som blir løst i et hvilket som helst nytt og fancy språk (da det sikkert er veldig run-time og dynamisk og i det hele tatt).

    Også må jeg nevne scope. scope gjør ikke noe du ikke kan gjøre med try/catch/finally, men det ser mindre forferdelig ut. Tror ikke jeg har sett noe tilsvarende i andre språk, og det er litt trist. Det er et ganske fint eksempel her.

    Også også alternativ løsning:

    import std.stdio;
    import std.algorithm;
    import std.range;

    void main()
    {
    auto r = filter!("a % 3 == 0 || a % 5 == 0")(iota(1000));
    writeln(reduce!("a + b")(0, r));
    }

  2. Torbjørn Says:

    > auto r = filter!(“a % 3 == 0 || a % 5 == 0″)(iota(1000));
    > writeln(reduce!(“a + b”)(0, r));

    Hva i all verden er dette for noe? Er dette uttrykk som evalueres i runtime, siden det er strenger?

  3. Jonas Says:

    Neida. Har ikke helt helt periling på alt her, men. filter og reduce er noe template-greier (utropstegnene betyr noe templatete). “a + b” og det er template-argumentene. Tror de gjøres om til funksjoner av (unaryFun/binaryFun, som også er noe template-greier. Og alle disse template-greiene gjøres så vidt jeg vet under kompilering (det kompileres forskjellige versjoner av funksjonene for de forskjellige template-argumentene). Så alt i filter!(“a % 3 == 0 || a % 5 == 0″) gjøres under kompilering, mens funksjonskallet med iota(1000) som argument gjøres run-time.

    Kan forresten byttes ut med:
    auto r = filter!((int a){return a % 3 == 0 || a % 5 == 0;})(iota(1000));
    writeln(reduce!((int a, int b){return a + b;})(0, r));

  4. Torbjørn Says:

    Ah, ok, det gir mening. Takk for info – hadde ikke så mye tid til å sette meg inn i D, så disse tingene har jeg ikke sett på i det hele tatt. Veldig interessant!

  5. Jul med programmeringsbloggen « Dærnt's Corner Says:

    [...] Fantom, GNU Octave, Oz, CoffeeScript, Smalltalk, Rebol, Betterave, Cobol, Forth, Factor, Befunge, programmeringsspråket D, Prolog, Regex, og på selveste julaften falt valget på en Euler DSL. Marø´s egen oppsummering [...]

Skriv en kommentar

Tillatte tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Siste kommentarer

Torbjørn
PS: Takk til Børge Hansen, som delte SCARF-modellen med meg!...
Børge Hansen
Denne likte jeg veldig godt. Du skriver godt og har gode betraktninger  Keep it up – flere trenger å tørre å lære mer om ledelse – du l...
Tormod
Er egentlig ikke overrasket. F# sin fortè er programmererens produktivitet/kvalitet og anledning til parallell kjøring. Men kjøremotoren har ...
Stian
Ville også prøvd med et større problem (x100 eller x1000 f.eks). Når man snakker så små brøkdeler av et sekund som her så kan tiden for en ell...
Torbjørn
Har ikke sjekket - tar en titt i morgen hvis tid :)...
Einar W. Høst
Mhp tco: hva sier ILSpy?...
Torbjørn
Har ikke sett noe på PSeq før, men kjenner til den typen funksjoner fra blant annet Clojure. Og problemet med slike funksjoner i sammenhenger som de...
Håvard
Veldig bra sammenligning! Har du sett på ytelsen av PSeq.* fra powerpakken? Tipper den vil gi performancehit på små mengder, men kan kanskje resul...
Torbjørn
Jeg kom på en demonstrasjon-variant til jeg burde inkludere, nemlig bruk av list comprehension (en type computation expression (også kalt monads)). ...
Einar W. Høst
Interessant, det blir en trade-off mellom eleganse og fart på en måte. Den funksjonelle løsningen med vanlig filter er ren og pen, mens den imperat...
Creative Commons-lisens
Innholdet på denne bloggen er tilgjengelig under Creative Commons Navngivelse-Ikkekommersiell-DelPåSammeVilkår 3.0 Norge lisens.

Programmeringsbloggen
Kjempekjekt.com

© 2006-2013 Torbjørn Marø

Jeg har vært en profesjonell programmerer siden 1999, og dette er min blogg. Målet med bloggen er å stimulere meg selv og alle andre til kontinuerlig eksperimentering og læring.

Jeg forsøker å være allsidig, og programmerer blant annet i C#, Ruby, Erlang og Clojure.

Jeg praktiserer TDD og andre smidige utviklingspraksiser. Jeg er opptatt av kvalitet og ren kode.

Dette og ganske mye mer kan du lese om på denne bloggen!