День или два назад сразу на нескольких ресурсах проскочила ссылка на статью "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 ;)
Комментариев нет:
Отправить комментарий