Pull to refresh

C++0x. Не вошедшее

Reading time 6 min
Views 4.9K

На Хабре уже пробегали статьи о новом стандарте С++0х — что в него входит и как этим пользоваться. А эта статья — о том, что туда могло войти, но по определенным причинам было отклонено.

Концепты


Концепты — это такая классная штука, расширяющая применение шаблонов. Если очень коротко, то концепт позволяет выдвинуть требования к типу, используемому в шаблоне. Например — можно потребовать наличия публичных конструктора и деструктора, поддержки определенного интерфейса и кой-каких других вещей. Есть мысль, что концепты могли бы быть весьма полезны — уменьшить количество ошибок, избежать дурацких сообщения компилятора при работе с шаблонными типами, дать понимание пользователю шаблонного типа о том, что данный тип делает со своим аргументом. В общем, круто. Нечто похожее есть, например, в С#.
Концепты были убраны из черновика С++0х в июле 2009 года с формулировкой «не готово». Причин на то было несколько:
  1. В предложенном виде получилось слишком наворочено. Дополнение, описывающее концепты, занимало полторы сотни страниц (при том что весь остальной стандарт — около 800). Сложновато вышло. Попробовали упростить — но вышло еще хуже. Половина народу стала жаловаться, что урезали нужные вещи, вторая — что оставшееся всё-равно слишком сложно.
  2. Пару отдельных групп программистов в рамках личной инициативы попробовали сделать реализацию концептов в компиляторе. В GCC, конечно. Получилось, например, вот это и еще пару вариантов. Все они показали весьма посредственную производительность как в компиляции, так и в работе получившихся программ. Причём не только на примерах с использованием концептов, но и на обычных шаблонах. Реализации были признаны «доказывающими теоретическую возможность», но не пригодными к реальному использованию.
2 с лишним года разные люди пытались что-нибудь поделать со всей этой чехардой. Но 2 года для всей той толпы, которая пытается разрабатывать новый стандарт С++ — это просто мгновение. Ничего решить не удалось. Концептов в новом стандарте не будет. Хотя все сохраняют оптимизм, улыбаются и машут. Детальнее можно почитать тут.

Сборщик мусора


Автоматическая сборка мусора в С++ — вот оно, благодатное поле для холивара! Точите копья, благородные Рыцари Мыши и Клавиатуры, ибо здесь вас ждёт великое сражение как между собой, так и с толпой разномастных троллей! Ну казалось бы, какая нафиг сборка мусора в святая святых — С++ ?! С другой стороны, все познавшие этот запретный плод в других языках, потупив взор отмечают, что он сладок. С третьей — как его, #$%, реализовать в С++, не порушив ни обратную совместимость, ни типобезопасность, ни здравый смысл? С четвёртой — ну в других же языках как-то решили эту проблему? В пятых, другие языки — для домохозяек и индусов, а С++ — для познавших Дао. В общем, где-то после 25-той мысли на эту тему я сбиваюсь и забываю начало. Где-то в этой же плоскости находится и комитет по стандартизации С++. В С++0х сборщика мусора не будет.

Модули


Вы, наверное, знаете, что при необходимости создать некий компонент (библиотеку) в целях многоразового её использования на выходе Вашей работы получаются *.h-файл и, собственно, скомпилированная библиотека (ну или исходники, если Вы за opensource). При этом в других языках (в том же С#) артефакт на выходе только один — сама библиотека, содержащая в метаданных самоописание всех своих типов и функций. Основная мысль архитекторов модулей в С++ — добиться того же. Судите сами: отсутствие нескольких файлов автоматом даёт меньше хаоса, меньше ошибок рассинхронизации, раскрывает меньше деталей реализации кода и вообще очень удобно. А как же это использовать, если не будет *.h -файлов? Ну вот как-то так:
import std; // Module import directive.
int main() {
std::cout << “Hello World\n”;
}

Мысль избавиться от веками сложившейся традиции делить исходники на файлы заголовков и реализаций будоражит воображение. Мир еще не готов к подобным потрясениям. В С++0х данной фичи не ждите.
Хороший документ с описанием затеи: www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2316.pdf

GUI, Math Special Functions, Networking, File System


Многие начинающие программисты, пройдя этап «Hello world» сталкиваются с реальными жизненными задачами и с удивлением отмечают, что в таком мощном и крутом языке как С++ в его базовой комплектации (компилятор + стандартная библиотека) сделать почти ничего нельзя! Ни тебе окошко забабахать, ни 2 байта по сети переслать, ни XML распарсить. Для всего требуется искать отдельные библиотеки, использовать API операционной системы или вручную перепахивать целину ненаписанного кода. После чего возникают закидоны в духе «а давайте язык в стандартной комплектации будет уметь петь и танцевать». Мнение комитета стандартизации нерушимо. Мухи — отдельно, а котлеты — отдельно. Некоторые из указанных в заголовке абзаца вещей просто выброшены за борт, другие — планируются к рассмотрению в следующем TR. В С++0х их не будет.

Thread pools, task launching, and reader-writer locks


При общем понимании важности параллельного программирования (и нужно признать, что в С++0х много всякого добавилось именно для него), реализовать все возможные идеи нет никакой возможности. Т.е. очень хотелось бы, но придётся отложить выход стандарта еще лет на 5. А ведь дата выхода уж намечена, красные ленточки натянуты, водка на фуршетных столах греется, а жаркое — остывает. Так что на встрече в городе Кона был принят «компромис Кона», который, в числе прочего, выбросил из стандарта пулы потоков и некоторые другие прикольные вещи, пообещав, однако, обязательно рассмотреть их в следующем TR или стандарте.

Macro scopes


В часто задаваемых вопросах на странице Страуструпа можно почитать его критику макросов. В целом она похожа на мысли бабушек у подъезда о современной молодежи: макросы, мол, не знают никаких границ, им плевать на все области видимости, классы, неймспейсы и все прочее. Это неуважение и переход рамок часто чревато как конфликтами макросов и старого доброго кода, так и, иногда, самих макросов друг с дружкой. Хорошо бы было объяснить этим выскочкам их место в песочнице и обозначить её рамки. Выглядеть это должно ну вот хотя бы так.
Честно говоря, я не нашел информации о том, почему эта затея не вошла в стандарт. Мне кажется, никто толком не понял деталей взаимодействия этих самых регионов и старых добрых #define и #undef директив. Как-то оно всё неинтуитивно. В общем, пока что этой штуки в С++0х не будет.

Reflection


Те, кто знает, что это такое, в этом месте вздрогнули. Для тех, кто не знает, я поясню — это способ получения и манипулирования информацией о типах данных и их внутренностях во всяких корыстных целях. Можно узнать, есть ли в классе метод с определенной сигнатурой, или изменить код метода «на лету» или вызвать извне private-метод класса или еще чего-нибудь этакое сделать. Штука эта очень полезна при разработке различных логгеров, моков, плагинов и других вещей. И, как-бы, нет никаких объективных причин отсутствия рефлексии в С++ — вся нужная информация есть в коде, она имеется у компилятора и её вполне можно было бы получить на рантайме. По крайней мере Страуструп не видит никаких для этого препятствий. Но видно, видит кто-то другой. Так что рефлексии в С++0х не будет.

Выводы


Собор и базар
С прискорбием хочется отметить, что коллективная работа над стандартом С++, в отличии от многих других коллективных проектов, идет языку С++ скорее во вред, чем на пользу. Если в С# и других языках, за которым стоят большие корпорации-создатели все решается единолично и от генерации новой идеи до её реализации проходит от силы год, то в С++ есть некоторые мысли, по которым не могут договориться уже лет по 10-12. Базар — это базар, а собор — это собор. Тем не менее, жизнь не стоит на месте, бумаги перекладываются из папки в папку, электронные почтальоны носят электронные письма и у наших с вами внуков у нас с вами есть еще шансы увидеть все описанные в статье вещи «вживую».

Дежавю


В процессе написания этой статьи меня не покидало ощущение дежавю. Где-то я это всё уже видел! Но где? Ах да — в C++/CLI! В самом деле, управляемый С++, странноватое детище Microsoft, созданное даже не как новый язык, а как «мостик» между старым кодом на С++ и платформой .NET, имеет почти все описанное в статье — и концепты, и сборщик мусора, и модули, и всю мощь библиотеки классов .NET и Reflection. Вот только не помогает ему это ни разу — новый проект на чистом С++/CLI никто начинать не будет (C# и VB значительно удобнее), язык занял свою нишу ровно там, где и планировала Microsoft — в проектах с необходимостью использовать и старый код на С++ и .NET. Прикольно в этом всем даже не то, что Microsoft сумела в одиночку за фигню времени сделать то, что транснациональный альянс ковыряет уже полтора десятка лет. Страшно, что будет дальше. Возможны 3 варианта:
  1. Сообщество принимает в качестве стандарта всех описанных вещей реализацию от Microsoft. Это унизительно, а потому маловероятно.
  2. Разговоры затягиваются еще на десятилетие. Язык медленно сдувается под натиском более динамичных коллег.
  3. Альянс принимает свою собственную реализацию концептов, сборщика мусора и т.д. с другим синтаксисом. Это самый апокалиптический вариант, поскольку одни и те же вещи будут по-разному реализовываться в разных диалектах языка. А это капец.
В общем, поживем — увидим, как оно будет. Пишите на С++ и да пребудет с Вами сила!
Tags:
Hubs:
+119
Comments 96
Comments Comments 96

Articles