Новость из категории: Информация

Язык программирования D: модули и их тестирование

Содержание:
1. Массивы и строки;
2. Семантика и шаблоны;
3. Функциональные типы и делегаты;
4. Модули и их тестирование (Вы читаете данный раздел);
5. Контрактное программирование.
Модули и их тестирование

Язык программирования D: модули и их тестирование

В D нет заголовочных файлов и директив #include, а есть модули, очень похожие на модули языка Python. Каждый файл по умолчанию является модулем с именем, совпадающим с именем файла, а действительно глобальных переменных нет вовсе - все они ограничены своим модулем. Нет в D и пространств имен (namespaces) поскольку области видимости символов определяются модулями. Есть несколько форм импорта модулей:
import std.stdio ; // Обычный импорт всего содержимого модуля
import widget : fun, gun; // Селективный импорт
// Импорт с назначением псевдонима
import list = util.container.finite.linear.list;

Компилятор очень строг в разрешении возможных конфликтов имен и никогда не допускает неоднозначностей.

Автоматическое тестирование элементов программы сейчас используется настолько широко, что в D ввели специальный блок unittest для тестирования модулей. В него помещается тестовый код, который обязан выполняться без ошибок, если модуль работает, как надо (как правило, это директивы assert). При обычной компиляции этот блок игнорируется, но если передать компилятору флаг --unittest, то он компилируется, а при старте программы перед входом в main запускаются тесты всех ее модулей. В нашем примере с делегатами тест может выглядеть так:
unittest {
auto add5 = do_plus(5);
assert(add5(10)==15); assert(add5(100)==105);
}

Выполнение кода на этапе компиляции

В С++ можно выполнять код на стадии компиляции с помощью «шаблонного метапрограммирования». Эта техника позволяет добиться небывалой выразительности и оптимизации кода (взять хотя бы библиотеки вроде boost::spirit и Eigen), но необычайно сложна. Ее сложность вызвана тем, что шаблонное мета-программирование в С++ основано на чистом хакерстве - использовании шаблонов не по назначению. Знание С++ ничего не дает для метапрограммирования - это по сути особый, очень сложный и весьма ограниченный в средствах язык. В D выполнение кода на стадии компиляции изначально заложено в дизайне языка. Во-первых, на этапе компиляции можно вызвать любую функцию:
// (метод 1) специальный «статический assert»
static assert( function_to_call_at_compile_time(arg1,arg2) );
// (метод 2) присвоение enum происходит на стадии компиляции
enum val = function_to_call_at_compile_time(arg1,arg2);
// (метод 3) инициализация статической переменной происходит
// на стадии компиляции
static val = function_to_call_at_compile_time(arg1,arg2);

Язык программирования D: модули и их тестирование

Во-вторых, в D есть «подмешивания» (mixins), подобные операторам eval в скриптовых языках, но выполняемые при компиляции. На этапе компиляции любая строка может быть интерпретирована как код:
// Генерирует строку кода, объявляющего 100 функций
string generate_functions(){
string ret;
foreach(n;1..100)
ret ~= "void function_" ~ to!string(n) ~
"(){ writeln(" ~ to!string(n) ~ "); }";
return ret;
}
mixin(generate_functions()); // Компилируем эту строку кода

function_14(); // Вызываем функцию

Обращает на себя внимание оператор конкатенации строк «~» и очень простое преобразование числа в строку.

Подмешивания во многих случаях полностью заменяют внешние генераторы кода. Можно, например, взять текстовое описание GUI (скажем, XML, созданный визуальным редактором) и прямо на месте сгенерировать и откомпилировать код всех виджетов.

Как же может выполняется код, если он еще не скомпилирован? Фронтэнд компилятора D содержит для этого особый встроенный интерпретатор. Пока что он имеет ограничения (например, не умеет выделять память для классов), но и то, что уже есть, на порядки мощнее, проще и быстрее «хакерского мета-программирования» в С++. Перспективы такого подхода огромны и пока даже не осмыслены до конца.

Рейтинг статьи

Оценка
0/5
голосов: 0
Ваша оценка статье по пятибальной шкале:
 
 
   

Поделиться

Похожие новости

Комментарии

^ Наверх