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ł, (*) :],
- 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).
- 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:
- http://www.digitalmars.com/d/ - oficjalna strona języka z dokumentacją
- http://dsource.org/ - czyli mini source forge dla projektów tworzonych w D,
- http://dsource.org/projects/tutorials/wiki - zbiór tutoriali do D,
- http://www.prowiki.org/wiki4d/ - Wiki4D,
- D Programming - książka na temat programowania w D na wikibooks,
- http://www.dprogramming.com/ oraz http://www.dprogramming.com/ - poświęcone D, DFL (D Forms Library) i kilku innym ptojektom,
- http://dblog.aldacron.net/ oraz http://larsivi.net/ - dwa znane i ciekawe blogi na temat D,
gim.org.pl is down






