C++0x больше не будет иметь концепций. Мнения? Как это повлияет на вас?
На встрече C++ 0x в июле 2009 года во Франкфурте было решено удалить концепции из C++0x. Лично я разочарован, но я предпочел бы иметь реализуемый C++ 0x, а не C++0x. Они сказали, что будут добавлены позже.
Что вы думаете об этом решении / проблеме? Как это повлияет на тебя?
9 ответов
Лично я не слишком недоволен удалением, поскольку целью концепций было главным образом улучшить сообщения об ошибках времени компиляции, как пишет Джереми Сик, один из соавторов предложения Concepts ( http://lambda-the-ultimate.org/node/3518):
Хотя предложение Concepts не было совершенным (может ли какое-либо расширение для C++ действительно быть идеальным?), Оно предоставило бы очень полезное и полезное расширение для языка, расширение, которое значительно сократило бы печально известные сообщения об ошибках, которые нынешние пользователи библиотек шаблонов страдают с.
Конечно, у концепций было больше цели, чем просто дать компиляторам более короткие сообщения об ошибках, но в настоящее время я думаю, что мы все можем жить без них.
РЕДАКТИРОВАТЬ: Херб Саттер также пишет в своем блоге:
Q: Разве этот C++0x не был одной большой особенностью?
A: Нет. Понятия были бы хорошими, но для большинства пользователей наличие или отсутствие понятий не будет иметь никакого значения для их опыта с C++0x, за исключением качества сообщений об ошибках.
Вопрос: Разве это не идеи о добавлении новой выразительной силы в язык и, таким образом, о создании новых основных видов программ или стилей программирования?
A: Не совсем. Концепции почти полностью направлены на улучшение сообщений об ошибках.
Я с нетерпением ждал их. Главным образом для лучшего сообщения об ошибках, когда компиляция не удалась. Ничего подобного чтению 1000 строк символов, чтобы выяснить ваши глупые ошибки.
Мне грустно видеть, что они выпадают из списка.
Лично мне нравятся типы, которые я использую, чтобы подчиняться известному интерфейсу, будь то примитивы, структуры или классы. Таким образом, я знаю, как я могу использовать тип и что я должен реализовать, чтобы обеспечить тип.
Этого легко достичь с помощью стандартного объектно-ориентированного программирования. Однако, по моему мнению, хотя технически универсальное программирование строго типизировано, оно теряет концепцию интерфейса, которую обеспечивает типизация ОО. На самом деле универсальное программирование похоже на динамическую типизацию, но разрешается при компиляции с точки зрения интерфейса.
Например, я передаю итератор в алгоритм, который он должен предоставить некоторым операторам, но нет интерфейса, который бы указывал, что должны делать эти операторы или каковы их контракты (только документация). Если у вас есть operator++()
а также operator*()
он скомпилируется, но он не дает вам таких же гарантий типа, которые интерфейсы дают вам в OO.
Для меня концепции приносят типы в общее программирование, а интерфейсы определенности приносят в ОО, лучшая компиляция - это просто бонус.
Я знаю, что мы все программисты на С ++, и мы очень умны, мы читаем документацию и понимаем перегрузку операторов и тонкости общего программирования. Но когда язык, обеспечивающий гарантии, на которые я могу положиться, и компилятор может протестировать, я могу потратить больше сил на решение проблем, которые мне платят за решение.
Я еще не слишком увлекся концепциями. Однако, что я заметил, так это то, что они, как правило, были довольно многословны. Я думаю, что я не хотел бы их в библиотеке STL. Я уже знаю библиотеку, я могу легко разобрать любые ошибки во время компиляции. Нет необходимости в понятиях. Тем не менее, было бы неплохо описать концепцию моих собственных классов, чтобы коллеги выучили их быстрее и избежали неправильного использования. Насколько я понимаю, каждая концепция - это ограничение, ограничивающее использование типа. Это было бы хорошо при создании новых интерфейсов, которые кто-то должен изучить.
Я тоже думал, что это плохой звонок и что C++0x
будет хуже для удаления, но только что закончив читать "Страуструп", " Упрощение использования концепций", я передумал. Я понятия не имел, что предложение по концепции было настолько сложным, и я думаю, что хорошо, что оно будет хорошо продумано, прежде чем будет добавлено в язык. Несмотря на то, что Страуструп проповедует сохранение концепций, его статья убедила меня в том, что в нынешнем виде концепции принесут больше вреда, чем пользы, и, хотя BS предлагает решение, я боюсь, что оно может быть спешно, а не все последствия еще не поняты.
Это очень печально. Внедрение концепций в C++ привело бы к тому, что его система типов приблизилась бы к тому же уровню мощности, что и классы типов Haskell, и это было бы замечательно - язык, оптимизированный для скорости, позволяющий вам делать все, что вы хотите, и в то же время строго безопасный для типов, если вы не используете аварийные отверстия (пока еще остается быстро!). Предполагалось также исправить давнюю проблему сложности использования STL и Boost (и библиотек шаблонов в целом) из-за слабой "утки во время компиляции" природы шаблонов C++03 и связанных с этим проблем с компилятором. Отчет об ошибках.
Я думаю, что они приняли правильное решение. Мне бы очень хотелось, чтобы в язык была добавлена высококачественная реализация концепций, но спецификация двигалась в неправильном направлении, что накладывало слишком много бремени на пользователя, чтобы явно указывать карты концептов. Статья Страуструпа действительно предлагает некоторые исправления, но это будет довольно радикальным изменением, так что я думаю, что так поздно в этом процессе. И без компилятора, чтобы проверить это.
Таким образом, концепции, как они были определены до конца, были бы большим шагом назад, препятствовав общему программированию и, возможно, раскололи сообщество C++, с большой группой программистов, придерживающихся C++03.
Концепции, предложенные "исправленными" Страуструпом, были бы, насколько я вижу, нормальными, но было бы рискованно принимать эти изменения так быстро. (И я не уверен, что это не вызвало бы дальнейших задержек.)
Честно говоря, я рад видеть, что они рисковали и удалили их на данный момент. До сих пор мы жили без концепций, и я могу жить без них еще 5 лет.
Мне грустно.
Я проверяю ConceptGCC, и это здорово! Я уже пишу некоторую простую библиотеку, используя это, и я вижу некоторые недостатки, такие как больший объем кода для написания или некоторые проблемы с умом, думая о силе абстракции концепций. Библиотека концепций std действительно создает проблемы, поэтому включать ее в стандарт - просто недоразумение. Я думаю, что новый стандарт должен только стандартизировать грамматику понятия и дать некоторые советы, как его использовать.
Я очень люблю концепции! Возможность заставить очень разные типы вести себя одинаково с помощью внешнего определения (отображение концепции) является очень мощной и полезной функцией (особенно потому, что это происходит во время компиляции и поэтому не влияет на производительность во время выполнения).
Я думаю, что это даже мощнее и лучше, чем реализовывать все полезные функции непосредственно в типе и получать к ним доступ через интерфейсы, как в.NET. Это не позволяет расширять позже (хорошо, .NET знает методы расширения начиная с 3.0 (или 3.5, не уверен), но это не то же самое).
Улучшение сообщений об ошибках - еще одно (и оригинальное) большое улучшение, которое приносят концепции.
Но одна из моих первых мыслей при чтении концепций заключалась в следующем: это займет ОЧЕНЬ много времени, пока GCC и MSVC не поддержат его.
Поэтому я думаю, что имеет смысл удалить его из будущего стандарта. НО, что я хотел бы, это фиксированное соглашение функций для стандартов после C++0x, которое содержит концепции. Это позволило бы поставщикам компиляторов лучше подготовиться к стандарту C++2x.
Поэтому я очень надеюсь, что мы увидим концепции в не столь отдаленном будущем.