dlib 2.0 — это библиотека-наследник dlib 1.x. У нее будет более тщательно продуманная архитектура и больше низкоуровневых функций. Библиотека пока находится на стадии дизайна, но вскоре будет доступна реализация части функций dlib 1.x.

https://github.com/gecko0307/dlib2

Предыстория

dlib 1.x исторически развивалась по своему уникальному пути, не учитывая экосистему языка. Сейчас в D-сообществе все более активно используются @nogc и betterC — новые проекты должны быть совместимы между собой и базироваться на одинаковых ограничениях и подходах.

Библиотека всегда стремилась к максимальной обратимой совместимости, в результате чего при добавлении новых функций накопилось множество компромиссов, а код стал слишком запутанным. Функции, зависящие от сборщика мусора, и независимые от него функции смешались в одну кучу. Кроме того, dlib 1.x требует от пользователя слишком глубокого понимания ее архитектурных особенностей. Есть части, которые работают «из коробки», но некоторые операции зачастую неинтуитивны, либо требуют сложной подготовительной работы для правильного выполнения, что делает их неудобными (например, dlib.filesystem.stdfs или dlib.network).

Принципы

dlib 2.0 устранит большинство недостатков классической версии dlib, включая:

  • Зависимость от Phobos. Базовая функциональность библиотеки будет вынесена в отдельный пакет, который можно будет скомпилировать полностью независимо от Phobos и druntime. Phobos будет использоваться только в некоторых высокоуровневых компонентах, где по-другому сделать невозможно;
  • Мешанину из GC-зависимого и GC-независимого кода. Каждый отдельный компонент будет явно либо GC, либо GC-free;
  • Отсутствие поддержки ARM.

Структура API

dlib 2.0 будет состоять из нескольких слоев API:

RTLD — низкоуровневый рантайм, заменяющий Phobos. Будет поддерживать компиляцию под x86_64, AArch64 и, в перспективе, WASM/WASI.

  • Управление динамической памятью;
  • Стандартный ввод/вывод;
  • Вычислительные потоки, мьютексы, атомарные операции;
  • Кроссплатформенные функции для работы с файловой системой;
  • Кроссплатформенная математическая библиотека;
  • Основные контейнеры: динамический массив, словарь, строка;
  • Фреймворк привязки к библиотекам C
  • OpenGL ES 2/3.

dlib — объектно-ориентированный уровень, который предоставляет более высокоуровневую функциональность. Будет служить унифицированным абстрактным интерфейсом для системных API (как минимум, Unix и Windows) — для тех возможностей, которые можно и нужно реализовать без сборщика мусора D. Этот слой будет, насколько это возможно, сохранять совместимость с классическим API dlib 1.x.

  • Потоки ввода/вывода;
  • Виртуальная файловая система;
  • Обработка изображений;
  • Обработка аудио;
  • Сеть.

dlib2 — новый высокоуровневый API. Здесь, например, могут быть встроенные привязки к различным популярным C-библиотекам. Также можно создать аппаратно-ускоряемый 2D-холст для вывода графики и, в перспективе, сделать свой UI-тулкит на нем — таким образом, dlib позволит создавать приложения с пользовательским интерфейсом.