[]
K>Ну, это очередной контейнер данных. K>Конечно, это помогает. Но вряд ли это составляет хотя бы 20% работы программиста.
У не любителей буста, и по совместительству любителей, велосипедов — наверное все 80%
А если учесть, что они эти лисапеды нифига не тестят, а потом тратят кучу времени на поиск и фикс в них багов — то собственно этим в основном они и занимаются. Я лично насмотрелся на все эти самописные стороки\списки\мютексы ...
Не, есть конечно команды, которые осознано отказываются от буста\стл и т. д. и у которых есть свои вменяемые аналоги нужных им кирпичиков.
Правда я таких в живую не встречал, только и инторнетах, по типу — "и вы говорите" (с).
ЗЫ Вместо "буста" здесь можно подставить тот же qt. Да даже и std, т. к. пересечение множества не любителей буста и не любителей STL нифига не пусто.
Здравствуйте, Ikemefula, Вы писали:
I>Так ты предложи внятную замену спириту. А то много кому не нравится буст и спирит в частности, но ничего внятного на замену предложить не могут.
Генераторов парсеров нафигачено более чем достаточно.
Проблема в метапрограммировании на шаблонах — стремительно растущее время компиляции при росте сложности парсера + отладка всей этой херни уж очень на любителя.
Чисто с менеджерской точки зрения — код на спирите банально высокорисковый и слишком завязан на автора.
I>И вот здесь, внезапно, оказывается так, что любой человек, который способен написать внятный парсер, становится незаменимым при поддержке кода.
Внятно написанный парсер проще поддерживать и развивать.
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, CreatorCray, Вы писали:
CC>Здравствуйте, Ikemefula, Вы писали:
I>>Так ты предложи внятную замену спириту. А то много кому не нравится буст и спирит в частности, но ничего внятного на замену предложить не могут. CC>Генераторов парсеров нафигачено более чем достаточно.
И? Покажи класс, чтоб мы все увидели, что решения не на спирите низкорисковые, их отладка не на любителя, ничего не завязано на автора, код понятный и легко поддерживаемый?
CC>Проблема в метапрограммировании на шаблонах — стремительно растущее время компиляции при росте сложности парсера + отладка всей этой херни уж очень на любителя.
Компиляция — да (но это улучшается с приходом С++11), а вот с отладкой вообще никогда проблем не было.
CC>Чисто с менеджерской точки зрения — код на спирите банально высокорисковый и слишком завязан на автора.
Мой опыт противоречит этим утверждениям.
CC>Внятно написанный парсер проще поддерживать и развивать.
Здравствуйте, CreatorCray, Вы писали:
I>>Так ты предложи внятную замену спириту. А то много кому не нравится буст и спирит в частности, но ничего внятного на замену предложить не могут. CC>Генераторов парсеров нафигачено более чем достаточно.
Нет в мире простых генераторов парсеров. Для просто грамматики все просто, но, что характерно, не проще чем парсер комбинаторы (спирит). Для сложной — надо приседать и приседать.
CC>Проблема в метапрограммировании на шаблонах — стремительно растущее время компиляции при росте сложности парсера + отладка всей этой херни уж очень на любителя. CC>Чисто с менеджерской точки зрения — код на спирите банально высокорисковый и слишком завязан на автора.
Отладкой спирита не надо заниматься, нужно думать над внятной грамматикой. А вот когда на выходе AST, там надо и повозиться с отладкой. Что характерно, работу с АСТ тебе ни один генератор парсеров не заменит.
I>>И вот здесь, внезапно, оказывается так, что любой человек, который способен написать внятный парсер, становится незаменимым при поддержке кода. CC>Внятно написанный парсер проще поддерживать и развивать.
Спирит это, считай, в чистом виде БНФ. Идея простая до безобразия — комбинаторы парсеров.
J>(вообще, для такого простого парсера достаточно коротенького регэкспа ([^\x1F"]*)\x1F?, так что я предполагаю, что это часть какого-то большого парсера)
CC>>На деле оказывается проще сразу расстрелять агитирующих за спирит и изначально писать на чёи либо другом.
J>Критикуя — предлагай! (с)
J>yacc? bison? scanf? istream?
Чисто врукопашную получается не сильно длиннее
template <class It, class Str> void foo(It& start, It e, Str& attr)
{
It s = start;
for (; s != e; ++s)
if (*s == '0x1F' | *s == '\"')
break;
// можно добавить здесь условие if (s != start) чтобы было как со спиритом
attr = Str(start, s);
if (*s == '0x1F')
++s;
start = s;
}
О том, какой вариант понятнее, можно спорить. Зато компилируется влет и когда вложишь штук 30 парсеров друг в друга — не придется по исходникам вылавливать наличие всяких там FUSION_MAX_VECTOR_SIZE. Я уж не говорю про BOOST_SPIRIT_THREADSAFE и прочие грабли, которых в либе такого размера наверняка пара штук припрятана.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Здравствуйте, alex_public, Вы писали:
_>Но в любом случае в современном C++ это уже всё давно не актуально. )
После std::initializer_list (2011г) — да. Вопрос, нужен ли бы был std::initializer_list, если бы в C++ были нормальные встроенные массивы —
Любители оптимизации, считающие, что неявная передача размера губит им производительность, могли бы использовать передачу указателя на первый элемент в явном виде (откуда бы вызываемая функция узнала размер массива, это уже другой вопрос, но, наверное, откуда-нибудь бы узнала, ну там ограничивающий элемент в конце, например).
Для совместимости с C можно было бы оставить "разложение" массива до указателя для случая функций со спецификатором extern "C".
И уж ни в C, ни в C++ нет оправдания вот такому:
void foo(int x[4]);
...
int z[3] = {};
foo(z); // ну вот тут-то компилятор мог бы возмутиться!!! Ну я так думаю...
Эээх, но это же было все не прикольно, WG21 прикольно было играться с шаблонами, исключениями, множественным наследованием, виртуальными базовыми классами, а вот довести до ума массивы — скучно.
Люди! Люди, смотрите, я сошел с ума! Люди! Возлюбите друг друга! (вы чувствуете, какой бред?)
J>>(вообще, для такого простого парсера достаточно коротенького регэкспа ([^\x1F"]*)\x1F?, так что я предполагаю, что это часть какого-то большого парсера)
ХГД>Чисто врукопашную получается не сильно длиннее
ХГД>template <class It, class Str> void foo(It& start, It e, Str& attr)
ХГД>{
ХГД> It s = start;
ХГД> for (; s != e; ++s)
ХГД> if (*s == '0x1F' | *s == '\"')
ХГД> break;
ХГД> // можно добавить здесь условие if (s != start) чтобы было как со спиритом
ХГД> attr = Str(start, s);
ХГД> if (*s == '0x1F') // вот здесь ты разыменовываешь е (если в строке не было 1F и кавычки)
ХГД> ++s; // а здесь ты вылетаешь за е
ХГД> start = s; // и возвращаешь этот веселый итератор обратно через start
ХГД>}
ХГД>О том, какой вариант понятнее, можно спорить. Зато компилируется влет и когда вложишь штук 30 парсеров друг в друга — не придется по исходникам вылавливать наличие всяких там FUSION_MAX_VECTOR_SIZE. Я уж не говорю про BOOST_SPIRIT_THREADSAFE и прочие грабли, которых в либе такого размера наверняка пара штук припрятана.
Да не о чем спорить, все в комментах к коду выше
Спасибо за иллюстрацию
ХГД>>template <class It, class Str> void foo(It& start, It e, Str& attr)
ХГД>>{
ХГД>> It s = start;
ХГД>> for (; s != e; ++s)
ХГД>> if (*s == '0x1F' | *s == '\"')
ХГД>> break;
ХГД>> // можно добавить здесь условие if (s != start) чтобы было как со спиритом
ХГД>> attr = Str(start, s);
J>ХГД> if (*s == '0x1F') // вот здесь ты разыменовываешь е (если в строке не было 1F и кавычки)
ХГД>> ++s; // а здесь ты вылетаешь за е
ХГД>> start = s; // и возвращаешь этот веселый итератор обратно через start
ХГД>>}
J>
ХГД>>О том, какой вариант понятнее, можно спорить. Зато компилируется влет и когда вложишь штук 30 парсеров друг в друга — не придется по исходникам вылавливать наличие всяких там FUSION_MAX_VECTOR_SIZE. Я уж не говорю про BOOST_SPIRIT_THREADSAFE и прочие грабли, которых в либе такого размера наверняка пара штук припрятана.
J>Да не о чем спорить, все в комментах к коду выше J>Спасибо за иллюстрацию
Ну да, косякнул, в низкоуровневом коде это бывает чаще. Зато найти это на порядок проще, чем последствия неприменения BOOST_SPIRIT_THREADSAFE, коих на прошлой неделе в коде коллег пришлось воткнуть три штуки.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Здравствуйте, Хон Гиль Дон, Вы писали:
ХГД>Ну да, косякнул, в низкоуровневом коде это бывает чаще. Зато найти это на порядок проще, чем последствия неприменения BOOST_SPIRIT_THREADSAFE, коих на прошлой неделе в коде коллег пришлось воткнуть три штуки.
так забавно видеть оправдания последствий нечтения доки =)
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
ХГД>>Ну да, косякнул, в низкоуровневом коде это бывает чаще. Зато найти это на порядок проще, чем последствия неприменения BOOST_SPIRIT_THREADSAFE, коих на прошлой неделе в коде коллег пришлось воткнуть три штуки. X>так забавно видеть оправдания последствий нечтения доки =)
Я вообще не видел пользователей spirit, которые бы про этот дефайн из доки узнали. Я про него, например, узнал, когда разбирался чего у меня boost::serialization при работе с xml архивами падает. И если не ошибаюсь, то оно до сих пор в бусте по умолчанию так небезопасно и собирается.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Здравствуйте, Хон Гиль Дон, Вы писали:
ХГД>Здравствуйте, jazzer, Вы писали:
ХГД>>> if (*s == '0x1F') // вот здесь ты разыменовываешь е (если в строке не было 1F и кавычки)
ХГД>>> ++s; // а здесь ты вылетаешь за е
ХГД>>> start = s; // и возвращаешь этот веселый итератор обратно через start
ХГД>>>}
ХГД>>>О том, какой вариант понятнее, можно спорить. J>>Да не о чем спорить, все в комментах к коду выше J>>Спасибо за иллюстрацию
ХГД>Ну да, косякнул, в низкоуровневом коде это бывает чаще.
О чем и речь. Вместо простецкого полуоднострочного спирит-парсера (который еще короче записывается вообще регэкспом), есть полотенце низкоуровневого кода, в котором мало что понятно, зато легко напортачить и потом разгребать коредампы.
ХГД>Зато найти это на порядок проще, чем последствия неприменения BOOST_SPIRIT_THREADSAFE, коих на прошлой неделе в коде коллег пришлось воткнуть три штуки.
Ну это разве что если сравнивать с поиском многопоточных ошибок.
Потому что ошибки парсинга и обработки краевых случаев искать замучаешься.
А ведь ты там еще что-то про 30 вложенных парсеров писал...
Ну недаром же генераторы парсеров придумали, ой, недаром
А насчет многопоточности — не проще компилятору -DBOOST_SPIRIT_THREADSAFE скормить, раз уж у вас многопоточный парсинг, и забыть о проблеме раз и навсегда?
J>(вообще, для такого простого парсера достаточно коротенького регэкспа ([^\x1F"]*)\x1F?, так что я предполагаю, что это часть какого-то большого парсера)
Да именно так — часть большого парсера. Сам написал четыре года назад, впервые решив использовать спирит.
Недавно возник вопрос по коду. SVN показывает, что это писал я. В комите ссылка на баг в трекере, в котором написанно про проблемы со старыми файлами. "Падает на символе 0x1F"
Здравствуйте, Хон Гиль Дон, Вы писали:
ХГД>Я вообще не видел пользователей spirit, которые бы про этот дефайн из доки узнали. Я про него, например, узнал, когда разбирался чего у меня boost::serialization при работе с xml архивами падает. И если не ошибаюсь, то оно до сих пор в бусте по умолчанию так небезопасно и собирается.
ну я про этот макрос узнал из тестов спирита, он там используется.
в доке не искал, да. но я хз, неужели этот макрос не упоминается в доке?
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Здравствуйте, TimurSPB, Вы писали:
TSP>Да именно так — часть большого парсера. Сам написал четыре года назад, впервые решив использовать спирит.
То есть ты здесь дал пример кода, написанного человеком, который "впервые решил использовать спирит", и предлагаешь нам сделать на его основе далеко идущие выводы о самом спирите?
TSP>>Да именно так — часть большого парсера. Сам написал четыре года назад, впервые решив использовать спирит. J>То есть ты здесь дал пример кода, написанного человеком, который "впервые решил использовать спирит", и предлагаешь нам сделать на его основе далеко идущие выводы о самом спирите?
Выводы каждый сам сделает. Но если мне понадобится сделать парсер, то я всё таки буду использовать спирит. Но делать это надо осознанно.
Здравствуйте, jazzer, Вы писали:
ХГД>>Ну да, косякнул, в низкоуровневом коде это бывает чаще. J>О чем и речь. Вместо простецкого полуоднострочного спирит-парсера (который еще короче записывается вообще регэкспом), есть полотенце низкоуровневого кода, в котором мало что понятно, зато легко напортачить и потом разгребать коредампы.
Когда там спирита набегает не одна строка, а хотя бы десять, 200 строк низкоуровнего кода уже не выглядят столь ужасными. Лично для меня, естественно.
ХГД>>Зато найти это на порядок проще, чем последствия неприменения BOOST_SPIRIT_THREADSAFE, коих на прошлой неделе в коде коллег пришлось воткнуть три штуки. J>Ну это разве что если сравнивать с поиском многопоточных ошибок. J>Потому что ошибки парсинга и обработки краевых случаев искать замучаешься.
Это при применении спирита их искать замучаешься А уж если надо вычислять позицию, на которой случился синтакс еррор — вообще вешайся. А с низкоуровневым кодом пофиг, все прекрасно отлаживается, если чего-то не хватает — дописать можно без многочасовых копаний в доках или чужих исходниках.
J>А ведь ты там еще что-то про 30 вложенных парсеров писал...
Дебаг итераторам это без разницы
J>Ну недаром же генераторы парсеров придумали, ой, недаром
J>А насчет многопоточности — не проще компилятору -DBOOST_SPIRIT_THREADSAFE скормить, раз уж у вас многопоточный парсинг, и забыть о проблеме раз и навсегда?
Ну так зачем было примеры на классике постить Ки, конечно, значительно лучше, но и там привязка семантических действий вся такая же неудобная и по-прежнему чертова уйма уровней вложенности.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Здравствуйте, niXman, Вы писали:
ХГД>>Я вообще не видел пользователей spirit, которые бы про этот дефайн из доки узнали. Я про него, например, узнал, когда разбирался чего у меня boost::serialization при работе с xml архивами падает. И если не ошибаюсь, то оно до сих пор в бусте по умолчанию так небезопасно и собирается.
X>ну я про этот макрос узнал из тестов спирита, он там используется.
Ну сам же видишь — дока в этом плане бесполезна
X>в доке не искал, да. но я хз, неужели этот макрос не упоминается в доке?
В доке к спириту упоминается. Но, например, в доке к serialization при него вроде бы ничего нет и автор сериализации, похоже, вообще про него не знал. Я его спрашивал когда-то, а как типа твою либу с таким дефайном собирать, а то не линкуется, thread требует — внятного ответа не получил.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Здравствуйте, NeoCode, Вы писали:
NC>Но считаю что врага надо знать в лицо У меня тоже есть хобби — разработка своего языка программирования, не менее (и даже гораздо более) мощного чем С++, но без всей этой головной боли.
Может стоит посмотреть на Ada?