O D czytałem już jakiś czas temu na Wikipedii, ale wtedy znajdował się on w fazie rozwoju i szybko o nim zapomniałem. Dopiero parę dni temu, po zajrzeniu tam ponownie, mój wzrok przyciągnął numerek wersji oraz data premiery ulokowana w przeszłości i bardzo szybko do prywatnej wishlisty dopisałem "nauczyć się języka D". Postaram się teraz pokrótce opisać ten projekt.
D narodził się w 1999 roku w umyśle programisty Waltera Brighta, twórcy kompilatorów z firmy Digital Mars. Początkowym zamysłem było przeprojektowanie C++, by pozbyć się jego wad. Choć głównym źródłem inspiracji dla D był właśnie ten język, nie jest to jego wariant. Wiele możliwości C++ zostało przeprojektowanych na nowo, a wpływ na jego kształt wywarły również takie języki, jak Java, C# i Eiffel. Przez długi czas język pozostawał w wersji rozwojowej, co utrudniało jego wykorzystanie do celów produkcyjnych - stosunkowo często pojawiały się drastyczne zmiany powodujące utratę kompatybilności. Jednak równolegle do specyfikacji powstawał wzorcowy kompilator, DMD (Digital Mars D Compiler), a także port dla gcc. Specyfikacja, jak już podałem, została zamrożona 2 stycznia i można uznać, że nowy język nadaje się już do celów produkcyjnych. Poniżej przedstawiam przykładowy kod źródłowy zaczerpnięty z Wikipedii:
import std.stdio; // writefln() int main() { // tablica haszująca, indeksowana tablicami char[], zawierająca tablice tablic char[] char[][] [char[]] kontener; // Dodanie elementow kontener["Ania"] ~= "szalik"; kontener["Daniel"] ~= "bilety"; kontener["Ania"] ~= "czapka"; // Iteracja po wszystkich osobach foreach (char[] osoba, char[][] przedmioty; kontener) wyswietl_ilosc(osoba, przedmioty); return 0; } void wyswietl_ilosc(char[] osoba, char[][] przedmioty) { writefln(osoba, " ma ", przedmioty.length, " przedmiotów."); }
D jest językiem kompilowanym do kodu maszynowego, a nie wykonywanym przez interpreter, jak Java. Umożliwia także pisanie niskopoziomowe (wstawki assemblerowe), dlatego nadaje się zarówno do tworzenia rozbudowanych projektów, jak i fragmentów, gdzie sprawa wydajności jest krytyczna. Oto inne jego cechy:
- Domyślnie obsługiwane paradygmaty programowania: imperatywne, obiektowe, kontraktowe.
- Automatyczne zarządzanie pamięcią za pomocą odśmiercacza. Oprócz tego, można też ręcznie przydzielać i zwalniać pamięć, jeśli zajdzie taka potrzeba. Wskaźniki jako takie domyślnie są ukryte przed programistą, ale również w razie potrzeby można ich użyć.
- Prawdziwe moduły - koniec z #include <costam> :).
- Nowe typy danych - D natywnie obsługuje ciągi tekstowe, 8- i 16-bajtowe liczby, liczby urojone i zespolone.
- Wbudowane struktury danych - w D wiele struktur danych jest wbudowanych w sam język, np. tablice haszujące.
- Poprawiony model obiektowy - m.in. nie ma wielokrotnego dziedziczenia, są interfejsy.
- Binarna kompatybilność z bibliotekami C, tzn. program można linkować z bibliotekami stworzonymi dla języka C bez żadnych poprawek, dzięki czemu nie trzeba tworzyć portów setek projektów.
- Wsparcie dla Unicode.
- Obecność prostych struktur danych, przydatnych przy pisaniu niskopoziomowym.
- Wbudowany w język system dokumentacji.
- Wsparcie dla mechanizmów zarządzania projektem - generowanie różnych wersji programu z tego samego kodu, oznaczanie niektórych partii jako "przestarzałe".
I jeszcze kilka innych, o których jeszcze nie doczytałem. Walter Bright pomyślał też o twórcach programów narzędziowych dla D. Jako specjalista od kompilatorów, najlepiej wiedział, jak trudne jest maniuplowanie kodem C++:
It is spectacularly difficult to parse C++ 100% correctly. To do so really requires a full C++ compiler. Third party tools tend to parse only a subset of C++ correctly, so their use will constrain the source code to that subset. (...) D's lexical analyzer and parser are totally independent of each other and of the semantic analyzer. This means it is easy to write simple tools to manipulate D source perfectly without having to build a full compiler. It also means that source code can be transmitted in tokenized form for specialized applications. - Jest niesamowicie trudno przeparsować kod C++ w 100% poprawnie. Zadanie to naprawdę wymaga kompletnego kompilatora. Dodatkowe programy narzędziowe zazwyczaj przetwarzają poprawnie tylko wycinek składni, zatem ich użycie jest ograniczone tylko do kodu korzystającego z niego. (...) Analizator leksykalny i parser języka D są zupełnie niezależne od siebie nawzajem oraz od analizatora semantycznego. Oznacza to, że jest łatwo napisać proste programy do manipulowania kodem D bez konieczności tworzenia pełnego kompilatora. Oznacza to także, że kod źródłowy może być transmitowany do zewnętrznych, specjalistycznych aplikacji, wstępnie przetworzony, w formie stokenizowanej.
Języka programowania najlepiej uczyć się w praktyce. Już mam na oku parę aplikacji, przy których można wykorzystać język D i osobiście przekonać się o jego możliwościach.















Napisał Paweł `hwao` Hal w wtorek, 19 czerwca 2007 o 08:40
Po tak zachęcającym tekście od Zyx jakoś sama nabrałem ochoty na poskrobanie w nim. :)
Trzeba będzie się koniecznie przyjrzeć w "praktyce"