Використання в мові D сторонніх бібліотек

    На хвилі інтересу до мови D вирішив і я внести свій внесок у його популяризацію. Стаття не для новачків, а більше для тих хто розглядає D як другу мову. Відомо, що на зорі свого розвитку, мови програмування мають небагатий набір бібліотек і це часто не дозволяє починати писати на них щось серйозне. Сподіваюся стаття допоможе кому-небудь переступити цей бар'єр.
Нижче будуть розглянуті можливості утиліти dub, а так само підключення сторонніх пакетів і бібліотек написаних на C / C + + на прикладі чудової бібліотеки libev .
 
 

Утиліта dub

Чесно кажучи, я досі "плаваю" в опціях dmd , необхідних для компіляції і збірки додатку. Виною тому утиліта dub , яка бере на себе всі ці турботи і дозволяє відкласти вивчення нюансів компіляції і збірки пропозиції на потім, коли це дійсно стане необхідно. Крім цього, ця корисна програмка виконує функції пакетного менеджера, володіючи функціоналом, аналогічним утилітам pip для python, npm для javascript і т.п.
 
 

Ініціалізація проекту

Для ініціалізації програми за допомогою утиліти dub треба створити каталог проекту, перейти в нього і виконати команду:
 
$ dub init

В результаті буде створений файл dub.json , за допомогою якого задається конфігурація і параметри збірки додатку. А також, підкаталог source , що містить файл app.d з нехитрою хелоуворлдом.
Збірка і / або запуск програми проводиться цієї ж утилітою, що запускається з кореневого каталогу проекту, тобто з каталогу, що містить файл
dub.json
. Щоб скомпілювати, зібрати і запустити хелоуворлд з файлу
app.d
, досить виконати команду
dub
.
 
 

Підключення сторонніх пакетів (бібліотек)

У термінах мови, бібліотеки сторонніх розробників на D, поширювані у вигляді вихідних кодів, називаються пакети. Утиліта
dub
використовує реєстр пакетів, що знаходиться по наступною адресою . Використання бібліотек, написаних за допомогою C / C + + також можливо, але для цього необхідне підключення в проект спеціальних пакетів, званих binding . Сама ж бібліотека повинна бути встановлена ​​в системі. Наприклад, libev , яка далі буде задіяна, встановлюється в debian подібних дистрибутивах linux наступним чином:
 
$ sudo apt-get install dev-libev

Для використання її в проекті на D потрібен Біндінг, який добрий чоловік вже зробив і розмістив у вище названому реєстрі. Там же є інструкція, які зміни потрібно внести в файл
dub.json
для використання
libev
в проекті. Все зводиться до додавання в розділ dependencies файлу
dub.json
імені пакета, версії і, по необхідності, деяких інших параметрів.
При наступному виконанні команди
dub
, всі перераховані в dependencies пакети будуть перевірені і довантажуючи у разі їх відсутності.
 
 

Хелоуворлд з використанням libev

Після вище описаних маніпуляцій проект готовий до використання фичей з
libev
. Нижче приведений код, який слід помістити в файл
app.d
, і якщо все пройшло гладко, отримаємо виконуваний файл, який буде радувати раз в секунду сполученням "Hello, World!" В консолі.
 
 
import std.stdio;
import deimos.ev;

void main()
{
	ev_timer watcher;
	extern© void cb_timer(ev_loop_t* loop, ev_timer* watcher, int revents) {
		writeln("Hello, World!");
	}

	auto p_loop = ev_loop_new(EVFLAG_AUTO);
	ev_timer_init(&watcher, &cb_timer, 1.0, 1.0);
	
	ev_timer_start(p_loop, &watcher);
	ev_run(p_loop, 0);
}

Що тут варто відзначити в плані використання сторонніх бібліотек в програмах на D?
По-перше, у другому рядку підключається пакет-Біндінг до
libev
. По-друге, функція зворотного виклику
cb_timer
визначена як
extern©
. Фактично її виклик відбуватиметься з надр підключеної бібліотеки, а вона у нас написана на С. Отже, угоду про виклик
cb_timer
має відповідати викликом функцій написаних на С.
 
Що можна сказати в цілому, дивлячись на код? Крім фичи мови D, що дозволила визначити
cb_timer
в тілі функції
main
, код мало відрізняється від аналогічної програми на C. Це пов'язано з тим, що пакети-Біндінг зазвичай містять мінімальну обв'язку над викликами функцій з сішних бібліотек. Часто для зручності робиться ще один рівень обв'язки, який надає більш читається код з використанням "синтаксичного цукру" мови D. Наприклад, аналогічний код міг би виглядати якось так.
 
 
import std.stdio;
import hilevel.libev;

void main()
{
	auto watcher = new TimerWatcher(1.0, 1.0, (revents) {
		writeln("Hello, World!");
	});
	defaultEventLoop.start();
}

До речі, код наведений вище — реально існуючий. Я спробував зробити високорівневу обгортку над
libev
, використовуючи параметризрвані клас для вотчерів. Вийшло ніби непогано. Якщо це буде комусь цікаво — в наступній статті розповім про це.
 
PS: Непогано б було вже зробити підсвічування синтаксису D в редакторі хабратопіков.
    
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.