[GiM logo] gim.org.pl is down || odświeżony jogger (v.0.4) GiMa

Większość z joggerowiczów słyszała chociaż o pythonie czy rubym. Niektórzy nawet piszą bardzo ciekawe artykuły na temat jednego bądź drugiego. Serią kilku artykułów chciałbym natomiast przybliżyć joggerowiczom mniej popularny język -- D. Mam nadzieję, że uda mi się skłonić chociaż kilka (no choćby jedną) osobę do zapoznania się z tym językiem.
Na wstępie zaznaczam, że nie jestem guru tego języka ;). Artykuł będzie ciut przydługi, prawdziwa przygoda zacznie się dopiero od następnego razu.

D jest językiem mającym poniekąd związek z C i C++. Mającym bo oprócz pewnych podobieństw w składni różni się od nich znacznie. D jest tak zwanym językiem wieloparadygmatowym umożliwiającym: programowanie impreatywne, programowanie obiektowe oraz metaprogramowanie (odsyłam do angielskiej wiki, bo na polskiej ten artykuł praktycznie nie istnieje ;)).

Przede wszystkim: D jest językiem kompilowanym do kodu natywnego (chociaż może być również interpretowany), przy czym szybkość kompilacji bije na głowę szybkość kompilatorów C czy C++. Jeżeli przyjmiemy, że kod w C++ wykonuje się szybciej niż kod w Javie (proszę o nie prowadzenie flame'a na ten temat w komentarzach :>), tak kod w D dorównuje szybkością C++ a nawet przewyższa.

D ma statyczne sprawdzanie typów. W D typy zmiennych podstawowych mają określone rozmiary w przeciwieństwie do C czy C++. D ma wbudowane typy zmiennych, które np w C++ są dostarczane przez biblioteki. Są to m.in: Tablice dynamiczne, stringi (ciągi znaków niespecjalnie pasuje, a każdy programista wie co to string), słowniki, liczby urojone. (Podobnie jak w pythonie, prawda?). D posiada dwie trzy (odmienne) biblioteki standardowe (więcej na ten temat w przyszłym odcinku). Istnieją dwa kompilatory D: oficjalny dmd, oraz nakładka na gcc - gdc.

Nieco więcej o cechach D (część może w chwili obecnej być niezrozumiała, ale może wyjaśni się w przyszłości) (acha, * oznacza, że może kiedyś więcej na dany temat ;)):
  • Różne:
    • Wbudowany garbage collector, ale nie trzeba z niego korzystać,
    • wersjonowanie, debugowanie i unittesty wbudowane w język,
    • Aliasowanie typów (odpowiednikiem alias (dla typów) w D jest typedef z C/C++, aliasowanie typów ma na celu jedynie skrócenie pisania, nic więcej),
    • Silne typowanie z użyciem typedef'a (szczegóły *),
    • foreach :)
    • stringi w switchu() (tego mi często brakuje w C ;/),
    • Wbudowany assembler (tak, nie tak jak w C, gdzie składnia asemblera jest zależna od kompilatora ;/), składnia jest określona, zestaw instrukcji jest poszerzany, o ile się nie mylę, w planach są kolejne architektury (na razie jest x86 to chyba oczywiste :>),
    • Dostęp do bibliotek C (nie oznacza to jednak, że można korzystać bezpośrednio z plików .h),
    • Możliwość kontroli wyrównania w pamięci elementów struktur,
    • SRC może być w unicodzie, IO w unikodzie,
    • Tworzenie dokumentacji z komentarzy (ddoc)
  • Funkcje:
    • Delegaty funkcji (w .necie też są),
    • przeciążanie funkcji,
    • typy składowania parametrówargumentów fukcji,
    • zagnieżdżone funkcje (sic!),
    • literały funkcji i delegat (w polskim zaczyna się przyjmować słowo literał, choć ja bym chyba wolał funkcje explicite, strinig explicite itd, ale to taka tam moja fanaberia :>),
    • bezpieczne typowanie argumentów funkcji ze zmienną ilością afgumentów (uff koszmarnie to po polsku wygląda, chodzi o znane z C funkcje: blabla(char *s, ...), które w C nie mają możliwości sprawdzania typów),
    • 'leniwy' typ składowania dla argumentów umożliwiający 'Leniwe' wartościowanie argumentów funkcji,
    • wykonywanie funkcji w czasie kompilacji (sic!) (z pewnymi ograniczeniami, ale jednak) (Oh yeah! można zrzucić np precomputing na kompilator, a niektórzy evil haxorzy piszą tak całe programy :>),
  • Tablice: łatwa zmiana rozmiaru (zazwyczaj chodzi nam o rozszerzanie :]), znany z pythona (strzelam, że z ruby'ego też Array slicing, bounds checking (sprawdzanie zakresu, jakby było niejasne :]), literały tablic, tablice asocjacyjne (indeksem AA w D może być cokolwiek)
  • OOP: moduły, interfejsy, zagnieżdżone klasy, klasy wewnętrzne (taka wariacja klas zagnieżdżonych), przeciążanie operatorów, kowariancja zwracanych typów (przez przeciążoną metodę w klasie dziedzicącej), proste 'właściwości' (w pythonie jest do tego property() w javie i (chyba) .necie settery i gettery, w D nie trzeba nic robić :])
  • OOP: D nie wspiera dziedziczenia wielobazowego (zwanego też dziedziczeniem wielokrotnym, choć ta nazwa sugeruje więcej niż nazwa 'wielobazowe').
  • Generic Programming (a jakże mogłoby zabraknąć!) (na polskiej wiki, użyte jest programowanie uogólnione, które przepraszam za wyrażenie wydaje mi się maksymalnie syfne :>)).
    • Szablony klas, szablony funkcji, uszczegóławianie typów parametrów szablonowych (niekoniecznie do konkretnych typów) (*), liczbowe parametry szblonów (*), aliasowanie parametrów szablonów (umożliwia to parametryzowanie szablonów dowolnym innym symbolem z D: nazwami, nazwami modułów, nazwami szablonów, instancji szablonów), szablony ze zmienną ilością parametrów (a przez to również argumentów).
    • mixiny szablonów i mixiny - podobne nazwy, ale to dwie zupełnie różne rzeczy, mixiny pozwalają w pewien sposób generować kod w czasie kompilacji,
    • static if - to chyba konstrukcja specyficzna dla D, w pewien sposób przypomina ifdef z C, ale tylko przypomina :]. static if (zamykający else if oraz else również są statyczne) pozwala na warunkową kompilację, ale jest to normalny element języka, więc musi być poprawny składniowo, po drugie może być używany w szablonach, więcej szczegółów (*),
    • assert i static assert - assert wiadomo do czego służy, static assert natomiast sprawdzany jest w czasie kompilacji (*),
    • typeof - ma inne zastosowanie niż w innych językach, do sprawdzania typów jest linijkę niżej, (*),
    • wyrażenia is - pozwalają na różne sprawdzanie typów i nie tylko w czasie kompilacji, nie będe teraz wnikał, (*) :],
  • Niezawodność:
    • Contract programming - w łatwy sposób można stawiać wymagania dla wejścia i wymagania dla wyjścia, które się odrzuca budując wersję do wypuszczenia,
    • statyczne konstruktory i destruktory (zarówno dla klas jak i modułów) - wywoływane odpowiednio prze wejściem do main i po opuszczeniu main,
    • try/catch/finally, do tego dochodzi jeszcze scope ale (*)
    • synchronized - dla wątków

To oczywiście nie wszystko, starałem się dużą przedstawić dużą część możliwości, stąd ten chaos :> Co dalej? Gdzie udać się z tego miejsca? Oto garść linków:

catz: [kom.puterowe] [programowanie w D] [Techblog]
tagz: [D] [D programming language] [D programowanie] [język D] [krótko o D]
dnia piątek, 09 listopad 2007, 001829 by Michał 'GiM' Spadliński

Komentarze:

Proszę wpisy pisane po angielsku komentować również w tym języku.

To D or not to D.

Jak wspomniałem w pierwszej części istnieją dwa kompilatory: oficjalny rozwiajny przez digitalmars - dmd
oraz nakładka na gcc - gdc. Do tego istnieją trzy biblioteki standardowe phobos,
rozwijana przez community tango, oraz z ostatnich war[.[...]

dnia piątek, 09 listopad 2007, 002717 by gim

Ty wujku! :)
Ciesz się, że w ogóle zrobiłem ten wpis o programowianiu uogólnionym na wiki, bo by nie było. :)

dnia piątek, 09 listopad 2007, 102009 by trochej

Cześć. Natknąłem się nad twój blog totalnie przepadkiem :) Ale to dobrze. Widzę że o D troche wiesz i tworzysz. Postaje ciekawy projekt podręcznika http://pl.wikibooks.org/wiki/D , jakbyś był chętny pomóc to było by fajnie :) pozdro

dnia piątek, 09 listopad 2007, 111702 by aleph, Witek

Dzięki za poruszenie ciekawego tematu. Nie jestem programistą, ale raz na jakiś czas zdarza mi się trochę kodować, a język D zapowiada się bardzo ciekawie :)

dnia piątek, 09 listopad 2007, 201147 by vmario

No proszę - D! Przyznam szczerze, że język ten był obiektem mojego zainteresowania, po tym jak postanowiłem poszukać lepszego od C++. Próbowałem pythona( to zupełnie nie dla mnie) i javy( ta pomimo wielu zalet jak dla mnie ustępuje C++). Nawet chciałem spróbować, ale odepchnął mnie fakt, że język ten wydał mi się bardzo słabo udokumentowany( zwłaszcza po polsku). Tak więc staraj się, może mnie przekonasz :)

dnia sobota, 10 listopad 2007, 131419 by Elwis

The D part 5 - wykonywanie w czasie kompilacji, tablice asocjacyjne, statyczne konstruktory

Ten wpis miał być, dokończeniem na temat kontraktów (design by contract), ale ponieważ akurat o tym było na
drugich warsztatach, więc odsyłam tam :).
Zacznijmy od czegoś prostego, jak w D zadeklarować i zainicjalizować tablicę? Stw

dnia środa, 14 listopad 2007, 195220 by gim

GDC przestał już chyba być rozwijany. Natomiast jest jeszcze jeden kompilator: LDC (http://www.dsource.org/projects/ldc).

dnia sobota, 21 luty 2009, 212540 by aidecoe

@aidecoe: erm to jest wpis z 2007, wiesz o tym, prawda? :]
btw: o llvmdc było na konferencji tango.

dnia niedziela, 22 luty 2009, 170746 by GiM

Wiem, ale w nowszych wpisach nic o tym nie wspomniałeś, więc poinformowałem.

dnia niedziela, 22 luty 2009, 171441 by aidecoe

..tożsamość..:
..meritum..:
..lokum..:
Wpisz kod:code