вторник, 14 июля 2015 г.

[prog.c++] Сильно двойственные чувства после прочтения "Translating Haskell to C++ metaprogramming"

День или два назад сразу на нескольких ресурсах проскочила ссылка на статью "Translating Haskell to C++ metaprogramming". Судя по всему, статья вызвала большой интерес. Так что нашел время и глянул сам. Ну и что можно сказать?

Первое впечатление -- очередная попытка натянуть сову на глобус. Мне, как старому пердуну, начинавшему с C++ без шаблонов и исключений, грустно смотреть на код вида:

template <typename Pattern1, typename Pattern2>
struct endTagDeriv<After<Pattern1,Pattern2>> {
    const bool c = nullable<Pattern1>();
    using type = typename std::conditional<nullable<Pattern1>(),Pattern2,NotAllowed>::type;
};

Ну вот хоть убейте меня, но мне не нравится, когда на C++ пишут в таком духе. Имхо, все-таки язык предназначался для других целей. А потому и написание кода в стиле Haskell-я сопровождается ну очень уж большим объемом синтаксического оверхэда (c).

Однако, не могут не радовать две вещи.

Во-первых, когда укушенные Александреску энтузиасты начинают иметь C++ и в хвост и в гриву, то это неизбежно приведет к нескольким положительным последствиям. Сам C++ рано или поздно обзаведется инструментами, упрощающими подобный код. Ну и некоторые best practices будут выработаны, которые покажут границы здравого смысла: мол, вот так нормально, а вот так уже overkill.

Во-вторых, это отличная демонстрация того, почему новые языки с более примитивными возможностями (в первую очередь это касается Go и Rust) не являются непосредственной угрозой для C++. Как раз потому, что C++ дает разработчику очень широкий "динамический диапазон": на одном и том же языке можно работать с адресами, байтами и битами, и тут же, не отходя от кассы, писать многоэтажные шаблоны, с кучей проверок в compile-time. Т.е. не только каждый разработчик может найти для себя интересное ему подмножество языка, но и в больших и сложных проектах все это может должным образом сочетаться и взаимодополняться. Тогда как Go и Rust выглядят как тщательно огороженные песочницы: вот здесь для вас собраны все игрушки и самый лучший песок для приготовления куличиков, но за пределы песочницы ни-ни!

Поэтому и создается впечатление, что Go -- это своеобразная замена Python-у. А Rust -- замена plain old C. Ну а C++ они смогут заменить лишь местами и лишь от части. Да и то, нужно будет посмотреть на все это дело лет эдак через 10 ;)

Комментариев нет: