D (programovací jazyk)

Z Wikipedie, otevřené encyklopedie
Skočit na: Navigace, Hledání
D
Paradigma multiparadigmatický: aspektově orientovaný, objektově orientovaný, imperativní, funkcionální, generický, paralelní
Vznikl v 2001[1]
Vývojář Walter Bright, Andrei Alexandrescu (od roku 2006)
Poslední verze 2.069 / 1.073[1][2] (3. listopad 2015[3])
Typová kontrola silná, statická
Hlavní implementace DMD (referenční implementace), GDC, LDC
Ovlivněn jazyky C++, C#, Java, Eiffel, Python, Ruby
Ovlivnil jazyky MiniD, DScript, Vala, Qore
OS DMD: Linux, FreeBSD, Windows, Mac OS X, GDC, LDC: UN*X, Windows, Mac OS X
Licence GPL/Artistic (DMD frontend), Boost (standardní knihovna a runtime), Dostupný kód (DMD backend), Plně open-source (LDC a GDC)[4]
Web dlang.org

D je multiparadigmatický, aspektově a objektově orientovaný, imperativní a systémový programovací jazyk. Jeho autoři jsou Walter Bright z firmy Digital Mars a Andrei Alexandrescu. Vychází z jazyka C++, ale není to totéž. Jazyk D přestavěl některé rysy C++ a je ovlivněn jazyky Java, C#, Eiffel a Python. Stabilní verze 1.0 byla vydána 2. ledna 2007.

Designové cíle jazyka D jsou zkombinovat výkon kompilovaných jazyků s bezpečnostní a expresivní silou moderních dynamických jazyků. Idiomatický kód v D je obvykle stejně rychlý jako ekvivalentní C++ kód a přitom je kratší a paměťově bezpečný. Automatické odvození typu a automatická správa paměti umožňují rychlejší vývoj, přičemž kontrola mezí, design by contract a typový systém připravený na paralelní programování, pomáhají omezit počet chyb.

Vlastnosti[editovat | editovat zdroj]

Programovací jazyk D se poučil tam, kde má v praxi C++ problémy. I když používá mnoho konceptů jazyka C++, také se některých zbavuje, a tudíž není kompatibilní s C++ zdrojovým kódem. Přidává do funkcionality C++ implementací design by contract, unit testy, pravé moduly, mixiny, automatická správa paměti, first class pole, asociativní pole, dynamická pole, rozdělování polí, vnořené funkce, vnořené třídy, closures a lambda funkce, anonymní funkce, interpretaci jazyka při kompilaci, pozdní inicializace a změněnou syntaxi šablon. D může být stejně jako C++ použit pro nízkoúrovňové programování díky zabudované podpoře Jazyka symbolických adres (inline Assembler). Vícenásobná dědičnost je podobně jako v Javě realizována pomocí rozhraní. Syntaxe deklarace, příkazů a výrazů je stejná, jako v C++.

Inline assembler představuje zásadní rozdíl mezi D a aplikačními jazyky jako Java a C#. Inline assembler umožňuje programátorovi vkládat kód v assembleru, což je technika používaná systémovými programátory pro přístup k nízkoúrovňovým vlastnostem procesoru. To je zapotřebí při psaní kódu programu který bude pracovat přímo s hardwarem, jako například operační systém a ovladače zařízení.

D má zabudovanou podporu dokumentačních komentářů a podporuje automatické generování dokumentace.

Charakteristika jazyka[editovat | editovat zdroj]

Datové typy[editovat | editovat zdroj]

Celočíselné[editovat | editovat zdroj]

byte (8 bitů)

short (16 bitů)

int (32 bitů)

long (64 bitů)

Bezznaménkové typy se deklarují pomocí prefixu u (například uint)

Desetinná čísla[editovat | editovat zdroj]

float (32 bitů)

double (64 bitů)

real (největší možný rozsah na dané platformě)

Pomocí prefixů c a i lze deklarovat imaginární nebo komplexní čísla (například ifloat, cfloat). Literály imaginárních čísel mají sufix i, například 1.0i.

Znaky[editovat | editovat zdroj]

char (8 bitů)

wchar (16 bitů)

dchar (32 bitů)

Pole[editovat | editovat zdroj]

Indexují se od nuly.

Statická: mají konstantní velikost. Deklarují se takto: datový_typ[velikost].

Dynamická: mají proměnnou velikost. Deklarují se takto: datový_typ[].

Řetězce jsou aliasy na dynamická pole neměnných znaků: string je totéž jako immutable(char)[].

Asociativní pole[editovat | editovat zdroj]

Můžou být indexována čímkoli, nejen číslem. Deklarují se takto: datový_typ[indexovací_typ].

Atributy[editovat | editovat zdroj]

Datové typy mají vlastnosti. Přistupuje se k nim takto: typ.atribut, nebo proměnná.atribut.

Atributy, které mají všechny typy:

.init implicitní hodnota neinicializované proměnné

.sizeof velikost v bajtech

.alignof zarovnání v paměti

byte a;
int b;
float c;
a.sizeof;//1
b.sizeof;//4
c.sizeof;//4

Atributy celočíselných typů:

.init nula

.max nejvyšší možná hodnota

.min nejnižší možná hodnota

int.init;//0
int a=int.max;
int b=int.min;
int c=123;
int d=a+c;//Přetečení, D nekontroluje, zda se hodnota vejde
int e=b-c;//Podtečení, D nekontroluje, zda se hodnota vejde

Atributy desetinných čísel:

.init to samé co .nan

.nan neplatná hodnota, výsledek dělení nuly nulou

.infinity nekonečno, výsledek dělení nenulového čísla nulou

.dig přesnost v desetinných číslech

.re reálná část

.im imaginární část

float.init;//float.nan
cfloat a=5.0+2.0i;
ifloat b=a.im;//2.0i
float c=a.re;//5.0
float d=c/0.0;//float.inf
float e=0.0/0.0;//float.nan

Atributy polí:

.lenght délka pole (u dynamického ji lze měnit: pole.lenght=nová_délka)

.ptr ukazatel na první prvek pole

.dup vrátí nově vytvořené dynamické pole, do něhož překopíruje současné pole

.idup to samé co .dup, ale nové pole bude neměnné

.sort seřadí pole

.reverse převrátí pole

int[5] a=[1,2,3,4,5];
a.lenght;//5
int[] b=a.dup;//Dynamické pole, kopie pole a
b.lenght;//5
b.lenght=12;//Změna velikosti pole
a.ptr;//Ukazatel na počátek pole
b.reverse;//b==[5,4,3,2,1]
immutable(int)[] c=b.idup;//Neměnná kopie

Struktury[editovat | editovat zdroj]

Deklarují se klíčovým slovem struct za které se napíše jméno struktury a pak ve složených závorkách všechny členské proměnné a metody. Struktury v D mohou obsahovat i statické proměnné a metody.

Příklad:

import std.conv;

struct Osoba
{
    int vek;
    string jmeno;
    static Osoba nejstarsi;
    string predstav_se()
    {
        //Textove retezce a pole se spojuji operatorem ~
        //to!string je funkce která převede vek na string
        return "Jsem "~jmeno~" a mám "~to!string(vek)~" let.";
    }
    void zestarni()
    {
        ++vek;
        if(vek>nejstarsi.vek)
        {
            nejstarsi=this;
        }
    }
    static string predstav_nejstarsiho()
    {
        return "Jmenuje se " ~ nejstarsi.jmeno ~ " a je starý " ~ nejstarsi.vek.to!string ~ " let.";
    }
}

Inicializace[editovat | editovat zdroj]

//Když jsou uvedeny jména členů, může být inicializace v jiném pořadí, než v deklaraci struktury
Osoba pepa={jmeno:"Josef Novák", vek: 20};
//Pokud se to inicializuje C-stylem, musí být prvky v daném pořadí
Osoba petr={26, "Petr Pupík"};
//Při inicializaci pomocí strukturového literálu musí být inicializace vyhodnotitelná v čase kompilace
Osoba alena=Osoba(65, "Alena Dvořáková");
//Také nemusíme uvést inicializátor vůbec
Osoba jana;//jana.vek==0, jana.jmeno==null
//Potom to můžeme kdykoli inicializovat takto:
jana.jmeno="Jana Svobodová";
jana.vek=15;

Všechny struktury mají vlastnost .tupleof, která vrátí n-tici prvků struktury.

Unie[editovat | editovat zdroj]

Unie na rozdíl od struktur mají velikost největší položky a jednotlivé členy se v paměti překrývají (statické se nepřekrývají). Deklarují se stejně jako struktury ale místo struct se použije union.

union MojeUnie
{
    byte a;
    int b;
    double c;
}

Inicializace[editovat | editovat zdroj]

//Tak:
MojeUnie x={d:0.0};
//Nebo tak:
MojeUnie y;
y.b=0;

Ukázka kódu[editovat | editovat zdroj]

Tento program vytiskne předané parametry. Funkce main je vstupní bod programu, a args je pole řetězců obsahující parametry příkazové řádky.

Smyčka foreach projde postupně všechny řetězce v poli args a vypíše je pomocí funkce writefln (formátovaný výstup s odřádkováním). Jednotlivým argumentům ve foreach je automaticky přiřazen datový typ podle kontextu; i datový typ int, line typ string. i slouží jako automatický index určující kolikátým prvkem je právě iterováno.

import std.stdio : writefln;

void main(string[] args)
{
    foreach (i, arg; args)
        writefln("args[%d] = '%s'", i, arg);
}

Externí odkazy[editovat | editovat zdroj]

Reference[editovat | editovat zdroj]

V tomto článku byl použit překlad textu z článku D (programming language) na anglické Wikipedii.

  1. a b changelog
  2. http://dlang.org/changelog.html
  3. http://forum.dlang.org/post/jhfdcu$iht$1@digitalmars.com
  4. http://dlang.org/faq.html