Язык D


Язык D, предложенный фирмой Digital Mars, представляет собой развитие C++, дополненное идеями из более молодых языков - таких, как Java, C#, Python и Ruby. Язык располагает мощным рантаймом, в нем есть автоматическое управление памятью, встроенные динамические и ассоциативные массивы, средства unit-тестирования, профайлинга и статической интроспекции. D компилируется в машинный код - производительность программ на нем практически не уступает C++. Стандартная библиотека D содержит богатый набор инструментов для обработки данных, работы с файлами, для создания многопоточных и сетевых приложений и многое другое. D доступен в нескольких реализациях, есть компиляторы для Windows, Linux и macOS.

D изначально был разработан как личный проект Уолтера Брайта, американского специалиста с многолетним опытом создания компиляторов. В частности, он является автором первого нативного компилятора C++, а также компилятора Symantec C++ (ныне Digital Mars C++). Впоследствии к проекту примкнули другие именитые разработчики, в числе которых сам Андрей Александреску. D активно развивается и обновляется, с каждым днем растет число программистов на нем.

D не навязывает программисту какую-либо идеологию или парадигму, не привязывает программиста к какой-либо среде или платформе, не "тянет" с собой большой динамический рантайм и другие зависимости. Программы на D легко писать и читать, они компактны и в большинстве случаев близки к псевдокоду. На D можно писать в процедурном, объектно-ориентированном и функциональном стиле. Синтаксис D схож с синтаксисом C++, C# и Java - это облегчает его изучение для тех, кто знаком с этими языками. Кроме того, на D очень легко портировать готовый код с любого из языков семейства фигурных скобок. Программы на D могут напрямую связываться с библиотеками C.

D одинаково хорошо подходит для создания
  • консольных утилит и скриптов (есть возможность выполнять D-код напрямую, без предварительной компиляции);
  • веб-приложений (есть веб-фреймворк и поддержка различных БД); 
  • игр и мультимедийных программ (высокая производительность, прямой доступ к OpenGL и DirectX, поддержка SSE);
  • GUI-приложений (есть привязки к различным тулкитам с C-интерфейсом, в том числе Gtk+ и Tcl/Tk, а также враппер Qt и ряд нативных тулкитов);
  • драйверов и операционных систем (на D можно писать на уровне C - язык предоставляет прямой доступ к памяти, располагает близкой к "железу" системой типов, имеет встроенный ассемблер, а также специальное подмножество betterC для компиляции без рантайма).
Основные компиляторы D:
  • DigitalMars D Compiler (DMD) - официальный компилятор от создателей D. Является референсной реализацией языка - генерирует не самый быстрый код, но в нем всегда самые свежие фичи. DMD стабилен, работает "из коробки" на всех основных платформах (Windows, Linux, macOS, FreeBSD), поддерживает как 32-, так и 64-битные системы.
  • LLVM D Compiler (LDC) - компилятор на основе фреймворка LLVM, что одновременно позволяет ему генерировать оптимизированный код и быть переносимым под самые разные платформы. Так, с LDC уже возможна компиляция D под ARM и iOS, а также (экспериментально) в Web Assembly. Windows и Unix-системы также поддерживаются в полной мере. Релизы LDC слегка отстают от DMD, но только на одну-две минорные версии.
  • GNU D Compiler (GDC) - компилятор на основе бэкенда GCC. Генерирует очень быстрый код, существует в вариантах для Windows, Linux и ARM с полноценной поддержкой 64-битных систем. По релизам, к сожалению, довольно сильно отстает от DMD.
Если вы затрудняетесь с выбором компилятора, советую начать с DMD, а затем перейти на LDC, если вас интересует производительность или платформы, отличные от x86, либо на GDC, если вы работаете с Linux и  GNU-тулчейном. Например, для создания небольших консольных утилит или графических программ, нетребовательных к производительности, идеально подойдет DMD. Для игр и других ресурсоемких приложений лучше выбрать LDC, а для системного программирования и создания ядер операционных систем - GDC.

 

Ссылки

 

Известные разработчики и личности в мире D

 

Интересные проекты на D


Веб:
  • Higgs - JIT-компилятор JavaScript
Системщина:
  • PowerNex - ядро операционной системы для x86_64
  • Vitis - семантическая файловая система для Linux
Игры:
  • Spectral Robot Task Force - трехмерная пошаговая стратегия в стиле X-COM и Fire Emblem о войне роботов со звероподобными монстрами. Разработана на движке Dash.
  • Mayhem Intergalactic - пошаговая стратегическая игра на космическую тематику. Необходимо управлять армиями космических кораблей для захвата вражеских территорий. Победитель конкурса инди-игр Independent Game Festival 2008.
  • Empire - классическая Empire, одна из первых стратегических игр в истории (первая версия была создана еще в 1977 г.) портирована на D! Кстати, автор Empire - тоже Уолтер Брайт.
  • Wormhol - трехмерный вариант игры "Змейка" для нескольких игроков. 
  • Laser Patriarch - игра для Ludum Dare 36, графический "рогалик" со случайно генерируемой картой.
Наука:
  • Eilmer - симулятор динамики сжимаемых газов.
  • Mir GLAS - библиотека линейной алгебры, по тестам обгоняющая OpenBLAS.
  • BioD - фреймворк для написания приложений биоинформатики.
  • RIP - библиотека научного анализа и обработки изображений.
Библиотеки, фреймворки, тулкиты:
  • DUB - стандартная система сборки и пакетный менеджер для D (теперь DUB входит в официальный дистрибутив компилятора, так что отдельно скачивать его не нужно).
  • Dlang UI - нативный кроссплатформенный GUI-тулкит.
  • GtkD - тулкит для разработки графических приложений на D с использованием популярной библиотеки GTK+. GtkD включает прямой интерфейс к C-функциям GTK+, а также удобную и мощную объектно-ориентированную обертку над ними.
  • Vibe.d - быстрый и мощный веб-фреймворк. 
  • Derelict - "джентльменский набор" разработчика игр: коллекция привязок к мультимедийным библиотекам (OpenGL, OpenAL, SDL, ODE, DevIL, FreeType, OGG/Vorbis и т.д.). Поддерживает все версии OpenGL, включая 3.1, 3.2, 3.3 и 4.0.
  • BindBC - аналог Derelict, не использующий сборщик мусора, конкатенацию строк, классы и исключения. На момент написания этого текста включает привязки к OpenGL, OpenAL, SDL, GLFW, FreeImage, FreeType.
  • Visual D - проект по интеграции D в среду разработки Microsoft Visual Studio.
  • Mono-D - аналогично для MonoDevelop.
  • DDT - для Eclipse.
Полезные инструменты:
  • Compiler Explorer - интерактивный компилятор на основе GDC с мгновенным выводом ассемблерного листинга.
  • Travis D Compilers - автогенерируемая таблица со всеми компиляторами D, которые на данный момент поддерживаются Travis CI.
  • DPLDocs - онлайн-генератор документации для D-проектов. Использует язык разметки Adrdox, являющийся надмножеством Ddoc.
Мои проекты на D:
  • dlib - коллекция библиотек для создания игровых движков, а также мультимедийных и научно-инженерных приложений.
  • Dagon - фреймворк для разработки 3D-игр c графическим движком на базе OpenGL 4.0.
  • dmech - физический движок, симулятор динамики твердых тел.
  • Box - архив-контейнер для хранения файлов с нелатинскими именами.  

11 комментариев:

  1. Обратите внимание D lang-у можно помочь...https://www.bountysource.com/trackers/383571-d-programming-language

    ОтветитьУдалить
  2. Здравствуйте, Какое у вас впечатление от этого языка? Какие недостатки встречали при написании кода? Чем он лучше по сравнению с c++?

    ОтветитьУдалить
    Ответы
    1. Недостаток у D, по сути, только один - привязка некоторых встроенных фич к сборщику мусора. Поначалу в языке мне нравилось абсолютно все, но потом я решил вручную выделять и высвобождать память, и оказалось, что это не так просто. Пришлось, например, написать свои контейнеры. Сейчас я пишу, по сути, на некоем подмножестве D, где не используются ассоциативные массивы, замыкания и т.д. В принципе, пока доволен. У D очень богатые возможности метапрограммирования, при помощи шаблонов можно обеспечить любой нужный уровень абстракции. Где требуется, можно писать на уровне C, а где-то - как в скриптовых языках. Основные преимущества перед C++, как мне кажется - это именно шаблоны, а также диапазоны как часть языка. Ну и скорость компиляции, само собой.
      Еще на D есть Derelict, прямого аналога которому на C++ я не знаю - очень удобный фреймворк для динамической линковки, создавать биндинги одно удовольствие. OpenGL любой версии, расширения - все из коробки. Повторюсь, может быть, на C++ тоже что-то такое написали, я не в курсе.

      Удалить
    2. Здравствуйте, спасибо за ответ, ещё есть вопрос про concurrency(модель message passing): если использовали, были ли какие-то проблемы при использовании?

      Удалить
    3. Вот message passing не использовал, как-то не приходилось активно работать с многопоточностью.

      Удалить
  3. Доброго времени суток! У вас написано следующее:
    >> прямой доступ к OpenGL и DirectX
    Однако, где ни погуглю, везде пишут про derelict. Подскажите, где поискать про прямой доступ к OpenGL

    ОтветитьУдалить
    Ответы
    1. Здравствуйте! Извините за поздний ответ - только сейчас заметил комментарий. Derelict - это и есть прямой биндинг (привязка) OpenGL. Он упрощает динамическую линковку OpenGL, позволяя выбрать нужную версию в рантайме. Сами функции вызываются напрямую, без дополнительных слоев абстракции.
      Вообще Derelict - это биндинг-фреймворк. Он поддерживает не только OpenGL, но и много других библиотек, так что это очень полезная штука. Можно на его основе создавать свои биндинги.

      Удалить
  4. Здравствуйте. Подскажите как попробовать Dagon.
    При компиляции учебного примера Dagon выдаёт ошибку - "Error: Nuklear library is not found. Please, install Nuklear.". Компиляция в Linux через dub.
    Решил собрать nuklear сам - библиотека собралась. Скачал Dagon и nuklear и собрал их по отдельности в директории проекта libs.
    Указал зависимости так (согласно путей):

    "dependencies": {
    "dagon": {"path": "./libs/dagon-master/"},
    "nukleard": {"path": "./libs/nukleard-master/"}
    }

    При компиляции всё равно выдает: "Error: Nuklear library is not found. Please, install Nuklear."

    Как можно решить данную проблему?

    ОтветитьУдалить
    Ответы
    1. Нашел библиотеку bindingc-nuclear - статически собрать не получилось.
      Проект Dagon компиллируется - но требует динамических библиотек nuklear при запуске.
      На github официального nuklear написано, что компиляция идет привязкой кода nuclear к коду проекта (без создания библиотек).
      В пакетах AltLinux самой nuklear нет.
      Буду пробовать создать библиотеки загрузкой кода в CodeBlocks и последующей компилляцией (не факт, что заработает).

      Удалить
    2. Нужно установить Nuklear в систему. Проверьте, нет ли готового пакета в системных репозиториях. Если нет, то остается только собирать из исходников.
      Но я к очередному релизу планирую сделать Nuklear отключаемым на этапе компиляции, так что все, кроме SDL и OpenGL, станет необязательным.

      Удалить
    3. Теперь можно отключить привязку к Nuklear при помощи субконфигурации "NoNuklear" в dub.json:

      "subConfigurations": {
      "dagon": "NoNuklear"
      }

      Удалить