суббота, декабря 24, 2005

C++0x

Update 27.12.2005: По поводу названия, почему C++0x. x будет заменен на номер года выхода стандарта. Это будет C++07, C++08, что-нибудь в этом роде. Разработка нового стандарта началась не недавно, о том, что принимаются предложения, было объявлено несколько лет назад. Процесс идет неспешно, сначала предложения копились, теперь рассматриваются...

"Упрочить доказанные достоинства C++ и двигаться вперед" - под таким девизом Бьерн Страуструп написал статью про разработку нового стандарта C++, C++0x.
C++0x планируется сделать почти на 100% совместимым с текущим стандартом, C++98. "Почти" потому что совсем на 100% сделать не получится. Страуструп в качестве примера приводит добавление нового ключевого слова. Код, который раньше использовал такое слово, уже не будет соответствовать новому стандарту.
Страуструп настивает на том, что C++ останется языком общего назначения. Более-менее специализированные вещи будут внесены в Стандартную Библиотеку.
Будет уделено внимание поддержке новичков. Сейчас, по мнению Страуструпа, язык больше ориентирован на экспертов и начинать на нем программировить довольно тяжело. Язык должен помогать новичку, защищать от внесения ошибок. Предназначенные для этого конструкции не должны стоять особняком, нужно чтобы они органично вписались в язык.
Сейчас можно отключить потенциально дорогие фичи, например RTTI, что положительно сказывается на производительности. Страуструпу очень нравится эта возможность и он пишет, что в C++0x в этом отношении ничего не изменится.
Я просмотрела по диагонали неполный список предложений по языку и список предложений по Стандартной библиотеке. Это именно предложения, не факт, что они буду включены в язык. Вот некоторые из них.
Неполный список предложений по языку:

  • Возможность переопределения новых приведений типов static_cast, dynamic_cast, это может оказаться удобным при использовании умных указателей (smart pointers).
  • Свойства (properties) в стиле Delphi/C#.
  • Опциональная сборка мусора.
  • Использование строк в switch.

    bool f(string s)
    {
    switch(s) {
    case "yes": return true;
    case "no": return false;
    default: throw Unexpected_string();
    }

  • Ключевое слово final, которое в сочетании с виртуальной функцией, запретит дальнейшее перекрытие этой функции.

Список пожеланий для Стандартной библиотеки:
  • Простой способ выводить на зкран содержимое контейнеров в красиво отформатированном виде. То есть cout << x должно "просто работать" для контейнеров.
  • XML парсер
  • Хорошая библиотека линейной алгебры (матрицы, векторы). Отдельно есть предложение по библиотеке для кватернионов специально для тех, кто разрабатывает 3Д игры.
  • Библиотека для работы с графами.
  • Паттерны проектирования. Особенно просят Singleton.


Ссылки по теме:
The C++ Standards Committee
Boost C++ Libraries

31 коммент.:

zorgg комментирует...

Я не очень хорошо понимаю, что этим людям мешает использовать boost.

Alena комментирует...

Вопрос не в использовании, а в стандартизации. STL, например, стала частью стандарта С++ уже после того, как ей все пользовались.

asgard комментирует...

Идея упрощения C++, имхо, не лучшая. Большее упрощение ведёт к более высокой степени абстракции, что даёт меньший контроль и порождает больше подводных камней. А рост STL может превратить плюсы в язык готовых реализаций. И так вроде язык мощный и гибкий, зачем его усложнять упрощениями? не понимаю....

Alena комментирует...

Идея упрощения C++, имхо, не лучшая.

Страуструп очень осторожен, когда говорит о введении более простых конструкций.
Например, сейчас обязательно надо ставить пробел между закрывающими угловыми скобками.
vector<vector<double> > v;
Страуструп предлагает разрешить конструкцию вида:
vector<vector<double>> v;

То есть это упрощения в хорошем смысле слова.

А рост STL может превратить плюсы в язык готовых реализаций.

По-моему, Страуструп боится конкуренции со стороны C#. Поэтому и идет речь об упрощении и о расширении Стандартной библиотеки.

И так вроде язык мощный и гибкий, зачем его усложнять упрощениями?

Цитата из статьи: "C++0x must support novices of all backgrounds much
better than does current C++—both through less error-prone language
features and through more supportive libraries."

asgard комментирует...

По-моему, Страуструп боится конкуренции со стороны C#. Поэтому и идет речь об упрощении и о расширении Стандартной библиотеки.

странно, чего тут боятся? C# даже не кросплатформенный, в отличие от Java, которую Стауструпу следует боятся больше. Более того, шарп суть тот же язык готовых реализаций, заточенный исключительно под форточки. Как я понял, это попытка приближения к ненужной большинсву монструозности, сохранив автономность плюсов. Не знаю, в общем. С++ и C# - разные весовые категории и языку из одной не следует переползать в другую. Имхо.

Marduk комментирует...

Спасибо за заметку :) Еще несколько интересных новшеств (tuples, reference_wrapper, auto в новом качестве) были упомянуты здесь: http://itc.ua/article.phtml?ID=22622.

TheBits комментирует...

>>…C# даже не кросплатформенный, в отличие от Java,…
>>…Более того, шарп суть тот же язык готовых реализаций, заточенный исключительно под форточки.…


С# язык программирования который специально создавался для платформы .NET. Работать эта платформа может на win32, pocketpc и mac. Microsoft распространяет cпецификацию .net, по которой можно портировать .net и под любую другую платформу.

По–моему Алёна права со своим предположением. Боятся тут есть чего.

Лично мне C# больше нравится чем C++.

--
TheBits

Marduk комментирует...

>...Работать эта платформа может на win32, pocketpc и mac.

Маленькое уточнение - и на Linux, и на *BSD, и на Solaris тоже - благодаря проекту Mono. Что только подтверждает Ваши слова.

TheBits комментирует...

>...Работать эта платформа может на win32, pocketpc и mac.
>>Маленькое уточнение - и на Linux, и на *BSD, и на Solaris тоже - благодаря проекту Mono. Что только подтверждает Ваши слова.

Спасибо за информацию не знал об этом.
А для тех платформ что были сказаны выше microsoft сами выпустили средý .net.

Анонимный комментирует...

C# очень и очень поджимает С++.

Во-первых, как говорит народ в
http://www.gamedev.net/community/forums/topic.asp?topic_id=363322

C# выдает 90% скорости С++. Что в постоянным ростом производительность железа сводит приемущество C++ в скорости к минимуму. С Вистой майкрософт планирует вывести все что можно приложения в .NET c родным directX.

Во-вторых, как уже упоминалось .NET не только можно портировать, но уже портировали и продолжают на что ни попадя. Причем, не будем себе обманывать, С++ не кросс платформенный язык. Сорец игры под винду просто так не откомилируется под любую соряру или BSD просто физически. Везде надо править в ручную. При том что C# идет без изменений вообще под любым .NET будь он хоть на кофеварке - в принципе все равно, код править не надо.

Главное, достоинство C# в том что язык сам по себе гораздо более производительный, удобный и современный чем C++. Сейчас ситуция идет к тому, что скорость программы никому особо не нужна, а вот скорость разработки является главным фактором. Писать на C# c visual studio 2005 или даже дармовым лицензионым C# express одно удовольствие.

Самое главное, что С++ теряет нишу. То что надо близко к железу пишется на С, а не на пласах. Все остальное или пишется на специфичных для задачи языках типа питона. Ниша "один язык который может все" теряется потому что писать все что угодно на С++ сложнее чем на той же .NET

asgard комментирует...

C# выдает 90% скорости С++. Что в постоянным ростом производительность железа сводит приемущество C++ в скорости к минимуму. С Вистой майкрософт планирует вывести все что можно приложения в .NET c родным directX.
знаете, лично мне на дот нет и C# глубоко пофиг, ибо это язык для домохозяек(извините, если кого обидел, но это моё мнение). Концепция 'заглянул в ман, нашёл нужную функцию и вставил в нужном месте' меня не радует. C и C++ даёт больше контроля над тем, что ты делаешь. Да, нужно шевелить мозгами, но не в этом ли вся прелесть программирования?

удобный и современный чем C++.
современное == хорошее?
хм, софистика...

Писать на C# c visual studio 2005 или даже дармовым лицензионым C# express одно удовольствие.
у нас с вами разные понятия об удовальствии, ибо в моём понимание это
'писать на C в emacs'e'

Самое главное, что С++ теряет нишу.
согласен.

Alena комментирует...

Причем, не будем себе обманывать, С++ не кросс платформенный язык. Сорец игры под винду просто так не откомилируется под любую соряру или BSD просто физически. Везде надо править в ручную.

Если я использую какие-то вещи, специфичные для данной платформы, то моя программа не запустится на другой платформе, вне зависимости от языка. Я могу привести примеры вполне себе кроссплатформенных проектов, написанных на C++: Code::Blocks, Mozilla, игровой движок Allegro. Думаю, они со страшной силой используют #ifdef'ы для того, чтобы все заработало. Кроссплатформенность требует от разработчиков дополнительных усилий, абстрагирования от платформы. Люди пишут свои кроссплатформенные рантаймы, чтобы уже с их помощью работать: Apache Portable Runtime, Netscape Portable Runtime. То есть нельзя тут так просто пенять на язык, не в языке дело. Как Java, ее кроссплатформенность достигается за счет Java Runtime.

При том что C# идет без изменений вообще под любым .NET будь он хоть на кофеварке - в принципе все равно, код править не надо.

Но если я в коде на C# завязалась на DirectX, то мне все равно не удастся заставить его работать на, скажем, Linux'е.

Я натыкалась на жалобы людей, которые пишут на C# под .NET, что им таки пришлось поплясать с бубном, чтобы запустить приложение на другой платформе, даже на той же платформе, но на другой машине.

знаете, лично мне на дот нет и C# глубоко пофиг, ибо это язык для домохозяек(извините, если кого обидел, но это моё мнение).

Хех, ну я тоже домохозяйка в какой-то степени :-).

C и C++ даёт больше контроля над тем, что ты делаешь.

Поскольку я знаю о C# только по статьям, мне сложно судить, но... Если там есть возможность сделать какие-либо вещи "быстро и просто", значит ли это, что при желании нельзя зарыться поглубже и сделать все по-своему?

Анонимный комментирует...

http://www.livejournal.com/users/hodzanassredin/ Тут немного про Mono Гамедев C# и C++. Смотрите архивы.

Анонимный комментирует...

Но если я в коде на C# завязалась на DirectX, то мне все равно не удастся заставить его работать на, скажем, Linux'е.


Смешно!! Тоесть вы хотите сказать что когда напишите на с++ с привязкой к Directx в Linuxe у вас просто все побежит?

Я понимаю ваш пост и что вы не то имели в виду. Но в свете сравнения с# с с++ Такие выражения смешны.

Alena комментирует...

Смешно!! Тоесть вы хотите сказать что когда напишите на с++ с привязкой к Directx в Linuxe у вас просто все побежит?

Нет.

Я понимаю ваш пост и что вы не то имели в виду. Но в свете сравнения с# с с++ Такие выражения смешны.

На моем блоге я приветствую аргументированный спор. Дальнейшие глубокомысленные издевки и тому подобное будут удалены.

asgard комментирует...

Если там есть возможность сделать какие-либо вещи "быстро и просто", значит ли это, что при желании нельзя зарыться поглубже и сделать все по-своему?
Это довольно неоднозначный вопрос, на который можно дать только не однозначный ответ =)

Если я работаю над чем-то, что мне интересно, то я буду использовать C/C++ просто по той причине, что мне доставляет удовольствие программировать на этих языках. Я буду изобретать велосипеды, даже трёхколёсные, просто ради самого процесса.

Если мне нужно что-то быстро накатать, особенно если это что-то связано с сокетами(но не обязательно), а возьму perl, если же нужно нечто с гуем(GUI) причём на классах и довольно шустрое, я возьму python.

Если судить грубо, то C# включает два вышеуказаннох фактора. НО он даёт только видимость гибкости C++, множество готовых реализаций, котрыми славятся интерпретируемые языки, + _намеренно_ хороший стиль программирования, как в python.

Из всего вышесказанного мне не нравится 'видимость гибкости'. Более того, всё это мне напиминает искусно сделанный игрушечный пистолет, выглядит как настоящий, но
a) безопасный
b) годится только для игр.

И вообще на slackware.ru был высказан, точнее показан, ряд мегааргументов, почему у C# ничего не выйдет:
http://www.slackware.ru/article.ghtml?ID=544
=)

TheBits комментирует...

Но если я в коде на C# завязалась на DirectX, то мне все равно не удастся заставить его работать на, скажем, Linux'е.

Managed DirectX называется. Вполне возможно что портируют тоже. Ведь существуют разные там wine…

Я буду изобретать велосипеды, даже трёхколёсные, просто ради самого процесса.

В этом и различие Вас и программистов C#. Так как вторые сосредотачиваются на на решении задачи, а не на реализации.

Если мне нужно что-то быстро накатать, особенно если это что-то связано с сокетами(но не обязательно), а возьму perl, если же нужно нечто с гуем(GUI) причём на классах и довольно шустрое, я возьму python.

Я однжды спросил свою друга программиста, является ли он фанатом питона. На что он мне ответил: «на самом деле хороший разработчик должен быть не зависим от языка программирования. и выбирать конкретный язык сообразно задачам которые решаются.». Никто не говорил что C# пришел порвать и заменить всех и всё.

Alena комментирует...

На этом тема C++ vs. C# закрыта.

Анонимный комментирует...

Допустим, к 2008 году стандарт наконец выйдет. Учитывая текущую ситуацию с компиляторами и поддержкой оными стандарта, нормальные компиляторы под C++0x появятся года через три, не раньше (оччень оптимистичная оценка).
Сейчас есть масса интересных исследовательских языков, которые пока еще не получили распространения - Scala, Nemerle, и т.п.
К тому времени, когда C++0x можно будет реально использовать, он станет просто никому не нужен. Область низкоуровневого программирования прочно занята C, а высокоуровневую область займут новые языки. CLI обеспечивает достаточно удобную связку между этими двумя областями.
За C++ же останется только унаследованный код, и некоторое количество программистов, которые не могут/не хотят переучиваться.
Впрочем, это всё ИМХО :)

xan комментирует...

Кстати, насколько я знаю, C++/CLI пользуется сборщиком мусора .Net да и еще обходит компиляцию в СLI. Хотя многие обвиняют Microsoft в том, что название C++/CLI вводит людей в заблуждение, т.к. этот язык не полностью поддерживает стандарт...

Alena комментирует...

A Brief Look at C++0x by Bjarne Stroustrup

Анонимный комментирует...

Почитал тут насчёт тепловой смерти Вселенной, в смысле безвременной кончины C++... Улыбнулся :)

Спешу заверить сомневающихся, что (горячо нелюбимый мной) язык C нас переживёт, а (пламенно обожаемый) C++ и подавно.

Половина моего кода завязана на шаблонном программировании. Половина используемых паттернов проектирования реализована не в стиле GoF, а в стиле Modern C++ с шаблонами и проверками времени компиляции. Уж не буду взрослым людям объяснять про статический полиморфизм и катастрофически высокую производительность сгенерированного из шаблонов кода (по сравнению с generic'ами и жалкой имитацией шаблонов с помощью динамического полиморфизма).

Где это в C#, Jav'е, Perl'е? Пока ни один язык не предоставит мне полноценную реализацию библиотек вроде STL и Boost, и возможность создания беспрецендентно гибких и расширяемых программ — даже думать не буду о переходе на т. н. "современный" язык. Ну, окошечки склепать раз в пятилетку — ладно, на C#. Но разменять мощь Могучего Языка на пару-тройку дешёвых фич... Нет, оно того не стоит. Новые языки можно изучать факультативно, просто расширять инструментарий. Но никак не вместо.

А насчёт низкоуровнего программирования... Ничего нельзя сделать на C такого, чего нельзя сделать на C++ без потери эффективности.

Есть ещё язык D. Вряд ли он завоюет бешеную популярность, но лично мне очень хотелось бы...

Спасибо Алёне за прекрасный блог. Один недостаток — оторваться сложно ;)

Qbit

Alena комментирует...

Половина моего кода завязана на шаблонном программировании. Половина используемых паттернов проектирования реализована не в стиле GoF, а в стиле Modern C++ с шаблонами и проверками времени компиляции.

Эффективность - это, конечно, хорошо... Но как ты решаешь проблемы, возникающие при отладке такого кода? С поддержкой тоже тяжело. Придется нанимать весьма квалифицированных, а, следовательно, дорогих специалистов.

Спасибо Алёне за прекрасный блог. Один недостаток — оторваться сложно ;)

Стараюсь :-)

Анонимный комментирует...

Очень трудный вопрос…… с одной стороны, те кто зарабатывают на хлеб программированием должны учитывать тенденции рынка. На данный момент, на рынки ценится быстрая разработка так как уже давно всем известно что дешевле купить железа чем дополнительных программистов. В сфере быстрых решений, С++ явно уступает таким языкам как JAVA и С#. (А в сфере web разработки, С++ вообще в не игре).
С другой стороны, С++ особо не меняется. Тоже самое нельзя сказать про .NET – в котором каждые полтора года выходит новый framework, после чего надо сидеть и учить эту хрень с каждым новым выпуском.
Итак, вывод следующий…. Если вы хотите работать в той или иной фирме, то лучше вам сделать следующее:
1. Подзабыть С++
2. Открыть ваш любимый браузер и ввести либо C#, либо .NET jobs
3. Выслать резюме туда где больше вакансий

Ежили вы работаете сами на себя, то мой совет….
1. Выучите язык программирования С++
2. Освойте библиотеку BOOST
3. Освойте STL
4. Освойте Qt

После этого, вы сможете писать под любую платформу – и скорее всего с той же скоростью как и .NET программист…..потому что .NET программисту придется “учить” .NET каждые полтора года, а вам придется освоить высший перечисленный материал лишь ОДНИ раз. Почему? Да потому что только Microsoft имеет возможность каждые пару лет менять модель программирования для своей OS.

NightmareZ комментирует...

Тоже самое нельзя сказать про .NET – в котором каждые полтора года выходит новый framework, после чего надо сидеть и учить эту хрень с каждым новым выпуском.

Ничего подобного. В новых фреймворках сохраняется совместимость со старыми. А изучать приходится лишь новые возможности.

В последнее время пишу на третьем шарпе. Очень доволен. Быстро, удобно, эффективно. Удобный язык. Огромная библиотека всего-что-нужно. Уверен, что на C++ с тем же уровнем знаний писал бы раза в два медленней и с большим количеством ошибок.

Сейчас пишу вторую версию комплекса физических программ на шарпе под OpenGL. Ни разу не возникло мысли, что я выбрал неправильный язык для реализации.

archimed7592 комментирует...

.net как пришёл, так и уйдёт, а С++ как был, так и останется :-P.

NightmareZ комментирует...

.net как пришёл, так и уйдёт, а С++ как был, так и останется :-P.
Я бы не стал зарекаться. Чёрт его знает, что там будет дальше. Ява же не ушла - почему .NET должен уйти?

А, если, лет через 10 он и отбросит копыта - то уже будет наплевать.... другие времена, другие языки, другие платформы....

И не факт, что C++ будет цвести и пахнуть всё это время.

Ваша проблема, имхо, - фанатизм. Язык, платформа, среда разработки - всего-лишь инструменты. Не более того. А вы делаете из них религию.
Выбирать нужно то, что целесообразнее использовать, а не то, что "круто".

archimed7592 комментирует...

Чёрт его знает, что там будет дальше. Ява же не ушла - почему .NET должен уйти?
А кто сказал, что Java должна уйти? :)
Java нас с тобой переживёт...

Ваша проблема, имхо, - фанатизм.
У меня то проблем нет. С С++ я зарабатываю себе на хлеб и меня это вполне устраивает... Чего не сказать о .net'чиках - куда не плюнь везде есть студент-.net'чик, ищущий работу...

Язык, платформа, среда разработки - всего-лишь инструменты. Не более того. А вы делаете из них религию.
Выбирать нужно то, что целесообразнее использовать, а не то, что "круто".

Несомненно. Только нет такой области, где .net превосходил бы по каким-либо параметрам C++(читай "был бы предпочтительней").
Единственное что может предложить .net - это быстрое развёртывание сайтика, не рассчитанного на нормальную нагрузку(asp много клиентов не вытягивает). Пример нагруженного сайта на asp можно увидеть на msdn, к примеру :-D.

У меня богатый опыт как с С++, так и с .net: личной мой выбор - это С++.

ps. Ладно, не будем нервировать Алёнку, разжигая здесь холивар, которому никогда не будет конца... Я больше спорить не собираюсь.

Alexey Bobyakov комментирует...

Qbit пишет:
Где это в C#, Jav'е, Perl'е? Пока ни один язык не предоставит мне полноценную реализацию библиотек вроде STL и Boost, и возможность создания беспрецендентно гибких и расширяемых программ — даже думать не буду о переходе на т. н. "современный" язык.
Переходите на "старый" Lisp, в нём есть всё и даже больше =)
Да-да, мы возвращаемся к старым как мир полюсам Fortran и Lisp. Прошло почти 50 лет, компьютеры стали гораздо быстрее, и нас всё больше привлекает гибкость языка, метапрограммирование за счёт некоторой потери в производительности.

Алёна комментирует...

Ладно, не будем нервировать Алёнку,

Это правильно.
I'm watching you... always watching :-)

GooRoo комментирует...

Забавно читать о том, как C++ уже вроде как должен был бы умереть пару лет назад :)
Новый стандарт всё ещё не вышел, а я на С++ до сих пор. Правильно писали выше: С++ + STL + Boost + Qt — это отличная комбинация.