Откуда пошла эта мода на обмазывание шаблонами к месту и не к месту? Нет, я ничего не имею против шаблонов, если действительно надо — только приветствую.
Но в последние годы появился какой-то особенный класс С++ программистов, которые пихают шаблоны везде, делая код и ошибки компиляции нечитаемыми.
Такие люди пишут код, обмазанный шаблонами — и говорят "смотрите, как просто и красиво!". Да нихрена не просто и не красиво! Разбор такого кода вызывает у меня только головную боль.
Если все еще непонятно, о чем говорю — приведу пример — boost::spirit. Это просто экстремум шаблонофилии.
Ну или просто может я лох, а другие умные. Наболело, в общем.
Здравствуйте, kurchatov, Вы писали:
K>Откуда пошла эта мода на обмазывание шаблонами к месту и не к месту? Нет, я ничего не имею против шаблонов, если действительно надо — только приветствую. K>Но в последние годы появился какой-то особенный класс С++ программистов, которые пихают шаблоны везде, делая код и ошибки компиляции нечитаемыми. K>Такие люди пишут код, обмазанный шаблонами — и говорят "смотрите, как просто и красиво!". Да нихрена не просто и не красиво! Разбор такого кода вызывает у меня только головную боль.
ну... а у меня хобби — астрофизика, и это для меня дико сложно. но мне что, всех астрофизиков называть идиотами все усложняющими? посыл понятен?
(если не понятен, то — в своей тупости виноват только я, и мои генетические предки)
K>Если все еще непонятно, о чем говорю — приведу пример — boost::spirit. Это просто экстремум шаблонофилии.
спирит решает свой класс задач, и решает их очень эффективно, насколько это возможно в С++.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Здравствуйте, niXman, Вы писали:
X>ну... а у меня хобби — астрофизика, и это для меня дико сложно. но мне что, всех астрофизиков называть идиотами все усложняющими? посыл понятен? X>(если не понятен, то — в своей тупости виноват только я, и мои генетические предки)
Мой топик скорее о слесарях, использующих токарный станок там, где можно обойтись напильником.
K>>Если все еще непонятно, о чем говорю — приведу пример — boost::spirit. Это просто экстремум шаблонофилии. X>спирит решает свой класс задач, и решает их очень эффективно, насколько это возможно в С++.
Да. Не считая нечитаемых ошибок при компиляции. Я вообще молчу о времени, которое занимает сама компиляция!
Здравствуйте, kurchatov, Вы писали:
K>Да. Не считая нечитаемых ошибок при компиляции. Я вообще молчу о времени, которое занимает сама компиляция!
ну... это неотъемлемая часть с++
ну а ты что бы использовал? какую-нить pcre_библиотеку без возможности статического анализа выражений?
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Здравствуйте, kurchatov, Вы писали:
K>Причем тут pcre? Spirit — это грамматики, так что скорее бизон какой-нибудь.
да, напутал.
flex/bison — дико неудобно для С++. для С — да, выбора-то нет.
K>Вы тоже любите обмазываться шаблонами, да?
ну... я не знаю. со стороны виднее =)
а сообщения об ошибках неудобными будут до тех пор, пока компилятор не научится концептам, имхо.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
В целом, излишняя шаблонизация прикладного кода — действительно ни к чему.
Что же касается K>Если все еще непонятно, о чем говорю — приведу пример — boost::spirit. Это просто экстремум шаблонофилии.
Довольно таки странный пример. spirit — это либа, предоставляющая такие возможности (embedded EBNF), которые просто невозможно достичь иными способами. Если есть возможность (желание) использовать препроцессинг — никто не воспрешает, берите теплый ламповый bison.
Процитирую себя же =)
P>Довольно таки странный пример. spirit — это либа, предоставляющая такие возможности (embedded EBNF), которые просто невозможно достичь иными способами. Если есть возможность (желание) использовать препроцессинг — никто не воспрешает, берите теплый ламповый bison.
У spirit-a нет никаких преимуществ перед бизоном. Оба делают одно и то же, только первый — во время компиляции с нечитаемыми ошибками.
P>spirit — это либа, предоставляющая такие возможности (embedded EBNF), которые просто невозможно достичь иными способами.
Да вот только не EBNF она предоставляет, а нечитаемую пародию на него. На практике от использования спирита возникает больше проблем, чем решается. Самое оптимальное почти во всех случаях — сделать прототип на ANTLR и написать рабочий парсер вручную по мотивам сгенерированного кода.
Здравствуйте, kurchatov, Вы писали:
K>Если все еще непонятно, о чем говорю — приведу пример — boost::spirit. Это просто экстремум шаблонофилии.
На самом деле не экстремум. Экстремум можно поискать где-то в области пересечения boost.mpl, boost.proto, boost.fusion... )
Что касается boost.spirit, то пожалуй не соглашусь. Во всяком случае пока никто не продемонстрирует мне настолько же удобный и быстрый аналог, но без "шаблонофилии".
Т.е. вот допустим есть тривиальная задачка: прочитать большой текстовый файл в специфическом формате (например какая-нибудь вариация на тему csv). Какое вы предложите решение, чтобы оно было быстродействующим и при этом занимало пару строчек кода? )
Здравствуйте, alex_public, Вы писали:
_>Что касается boost.spirit, то пожалуй не соглашусь. Во всяком случае пока никто не продемонстрирует мне настолько же удобный и быстрый аналог, но без "шаблонофилии".
что значит быстрый? Что спирит, что бизон делают одно — генерируют конечный автомат для парсинга. Быстрее вы парсинг не сделаете.
Удобный? boost::spirit? Ну вы неординарная личность.
Здравствуйте, alex_public, Вы писали:
K>>Если все еще непонятно, о чем говорю — приведу пример — boost::spirit. Это просто экстремум шаблонофилии.
_>На самом деле не экстремум. Экстремум можно поискать где-то в области пересечения boost.mpl, boost.proto, boost.fusion... )
Для добавления экстремальности я бы еще добавил boost.preprocessor в эту компанию, хоть это и другой вид магии Вот пример: https://github.com/pmed/v8pp/blob/master/v8pp/call_from_v8.hpp — вызов С++ функции (или функции-члена) из JavaScript-движка V8. При вызове производится преобразование списка аргументов v8::Arguments из JavaScript к аргументам требуемой функции. Я не знаю как проще сделать это в С++03, только генерировать код руками/внешним скриптом.
Переписываю сейчас это на С++11 с variadic templates и радуюсь своему счастью
Автор использует boost.fusion потому что нет пока в языке compile-time reflection, а код генерировать надо. И генерация внешними инструментами им не подходит.
Шаблоны в С++ — один из эффективнейших инструментов. Так что не удивительно, что люди пытаются попробовать применить этот инструмент по-разному.
"Метапрограммисты надоели" — это только симптом. А реальная проблема — это отсутствие нормально поставленного процесса разработки, включающего обязательное наличие стандартов кодирования и ревью кода. Будет нормально поставлен процесс — таких проблем просто не будет возникать. А если и будет, то они будут решаться в оперативном порядке не мешая процессу.
Здравствуйте, alex_public, Вы писали:
_>Что касается boost.spirit, то пожалуй не соглашусь. Во всяком случае пока никто не продемонстрирует мне настолько же удобный и быстрый аналог, но без "шаблонофилии".
_>Т.е. вот допустим есть тривиальная задачка: прочитать большой текстовый файл в специфическом формате (например какая-нибудь вариация на тему csv). Какое вы предложите решение, чтобы оно было быстродействующим и при этом занимало пару строчек кода? )
А зачем обязательно "пару строчек кода"? Если там будет 20 строк, но они будут понятнее и проще в отладке — чем это хуже? Причем, в случае со спиритом, они еще и быстрее компилироваться будут
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Здравствуйте, kurchatov, Вы писали:
K>что значит быстрый? Что спирит, что бизон делают одно — генерируют конечный автомат для парсинга. Быстрее вы парсинг не сделаете.
Т.е. как вариант решения предлагается бизон? И это на C++ (а не на C)?
K>Удобный? boost::spirit? Ну вы неординарная личность.
А что там неудобного то при использование? При написание spirit'a (или копание в его исходниках) действительно требуется знание МП на шаблонах. Но при обычном использование же ничего не нужно. Вот какие особые знания шаблонной магии требуются для написания скажем такого parse(file.data(), file.data()+file.size(), int_[([&](const int& n){sum+=n; count++;})] % ','); простейшего кода?
Здравствуйте, alex_public, Вы писали:
_>А что там неудобного то при использование? При написание spirit'a (или копание в его исходниках) действительно требуется знание МП на шаблонах. Но при обычном использование же ничего не нужно. Вот какие особые знания шаблонной магии требуются для написания скажем такого parse(file.data(), file.data()+file.size(), int_[([&](const int& n){sum+=n; count++;})] % ','); простейшего кода?
Пример тривиальный. И это мы с вами знаем, как оно работает. А придет новичок в вашу команду, и сколько времени ему потребуется врубиться в грамматику посложнее?
Здравствуйте, PM, Вы писали:
PM>Для добавления экстремальности я бы еще добавил boost.preprocessor в эту компанию, хоть это и другой вид магии Вот пример: https://github.com/pmed/v8pp/blob/master/v8pp/call_from_v8.hpp — вызов С++ функции (или функции-члена) из JavaScript-движка V8. При вызове производится преобразование списка аргументов v8::Arguments из JavaScript к аргументам требуемой функции. Я не знаю как проще сделать это в С++03, только генерировать код руками/внешним скриптом.
Да, да, есть такая штука. Я её использовал для автоматической генерации ORM (за неимением интроспекции времени компиляции в языке). Просто автор темки переживал именно за шаблоны. )
PM>Переписываю сейчас это на С++11 с variadic templates и радуюсь своему счастью
Автор использует boost.fusion потому что нет пока в языке compile-time reflection, а код генерировать надо. И генерация внешними инструментами им не подходит.
Да, это как мне кажется самый большой недостаток языка (ну про сложность мы упоминать не будем) в данный момент. Но в данном случае boost.fusion — это всё же на мой взгляд уж слишком костыльное решение.
C++ с годами становится все сложнее и сложнее. Особенно в последнее время, когда стандарты стали готовиться с невиданной скоростью (C++11, C++14, ...).
Отличный язык превращается в сложнейшего монстра. Группа гиков от программирования написала Boost, и я очень рад, что далеко не все компании (особенно топовые) решаются использовать его.
Это только удорожает и удлиняет разработку ПО. Скучаю по C++ 03.
Здравствуйте, Хон Гиль Дон, Вы писали:
ХГД>А зачем обязательно "пару строчек кода"? Если там будет 20 строк, но они будут понятнее и проще в отладке — чем это хуже? Причем, в случае со спиритом, они еще и быстрее компилироваться будут
А кто сказал, что они будут проще? ) Не следует путать внутренности спирита (действительно довольно нетривиальные) и использование его в качестве готовой библиотеки.