Programmeringsspråket D
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.

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.
Programmeringsbloggen
December 22nd, 2011 at 8:15 pm
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, ogstatic ifogversionistedetfor#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.scopegjø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));
}
December 22nd, 2011 at 9:52 pm
> 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?
December 22nd, 2011 at 10:50 pm
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));
December 22nd, 2011 at 11:01 pm
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!
November 29th, 2012 at 2:03 am
[...] 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 [...]