tag:blogger.com,1999:blog-82241632298373946692024-03-02T19:48:01.105+01:00The lonely compilerКогда созданная тобой программа сама (!) разбирается в большом и сложном тексте, выясняет все синтаксические и семантические взаимосвязи его элементов... Как описать свои чувства, когда наблюдаешь это?.. А когда эта программа начинает анализировать <i><b>саму себя</b></i>!..zouevhttp://www.blogger.com/profile/09163739178551976623noreply@blogger.comBlogger48125tag:blogger.com,1999:blog-8224163229837394669.post-78469111980691870812011-01-19T12:13:00.010+01:002011-01-19T15:34:52.080+01:00Зачем Сколкову Микрософт?В предыдущем посте я призывал молодые команды посмотреть на перспективу Сколково не с высоты "птичьего полета", а с точки зрения собственных задач и потребностей. При таком смещении фокуса может оказаться, что дело это вполне выгодное - несмотря на сомнительность всей инициативы в целом.<br /><br />Закончил я тот пост такими словами: "Это все, наверное, правильно, если бы была уверенность, что Сколково и создается, собственно, для подобных компактных коллективов из талантливых и упорных молодых людей, пытающихся сделать что-то, чего до них не было".<br /><br />Так вот, что-то у меня возникли сомнения: действительно ли Сколково создается для таких коллективов? Эти сомнения появились, когда я прочитал, что в Сколково приглашаются... Микрософт, Cisco, Интел и (кажется) IBM. Причем, сообщения о (только даже предварительном!) согласии этих монстров сопровождались напыщенной просто-таки до неприличия городостью: смотрите, какие гиганты поддерживают и одобряют нашу инициативу и готовы, так сказать, влиться!..<br /><br />Вот это мне как раз решительно непонятно! В самом деле, объясните мне, уважаемые авторы идеи: <span style="font-weight:bold;">каким именно образом</span> наличие в Сколково Микрософта может послужить делу модернизации/инновации???? (Дело, конечно, не в Микрософте как таковом: вместо него можно подставить любого гиганта из приведенных выше.)<br /><br />В одном из сообщений говорилось: в исследовательском центре Cisco будет занято до 1000 российских инженеров. Ну так прекрасно, я только за: тысяча наших специалистов будет заниматься интересной работой и получать за нее, наверное, адекватные деньги. Только вот причем здесь российские инновации, ну объясните хоть кто-нибудь!! В этой фирме они будут разрабатывать новые умные и мощные устройства (и софт для них), которые поставляются по всему миру - прекрасно! Но... работать-то они будут на Cisco! И созданная ими интеллектуальная собственность будет принадлежать этой уважаемой компании!<br /><br />Я хочу быть правильно понятым: я вовсе не против того, чтобы Cisco работала в России, и не призываю гнать "проклятых капиталистов" из страны "потенциального противника" каленой метлой. Чем больше таких "исследовательских центров" западных компаний будет, тем лучше. (Они, собственно, и сейчас возникают, и далеко не только в Москве/Питере.) Я только не понимаю одного: почему их так активно тянут именно в Сколково, которое, судя по заявлениям авторов инициативы, создается все-таки для поддержки перспективных разработок отечественных коллективов???<br /><br />Ну давайте порассуждаем. Может, они нужны там для создания некоей "инновационной среды", креативной атмосферы, которая послужила бы питательной средой для инноваций? Сомневаюсь: вряд ли коммерческая фирма заинтересована в обмене идеями (что, естественно, подразумевает необходимость делиться <span style="font-style:italic;">своими</span>) - им, скорее, интересно получить некую инновацию в свою собственность, а получив ее, сделать продукт на ее основе - и уж конечно, не "делиться" ей.<br /><br />Дальше. Может быть, гигантов пускают в Сколково, чтобы они там на свои средства что-нибудь организовали? Ну там, "компьютерный класс" обрудовали? :-) Наверное, такое может быть, но, ей-Богу, это как-то несерьезно. Кроме того, объявлено ведь, что государственных денег в Сколково вбухивается немерено - может, и не нужны дополнительные вливания от того же Cisco?<br /><br />В общем, не могу представить, каковы были мотивы у решения настойчиво зазывать этих монстров в "инновационную" Сколковскую долину - но само решение выглядит, право же, идущим вразрез с базовыми принципами всей инициативы. Или, наоборот, представляется вполне "в духе" обычной бюрократической логики: давайте позовем монстра, он нам там все как надо организует...<br /><br />Ну правда же, получается удивительно и странно: отмена налогов, бюрократических препон и закорючек, доступные инвестиции, помощь в продвижении и коммерциализации - все, что сулят нам в Сколково - и нужно в первую очередь как раз молодым начинающим командам! А Микрософт прекрасно проживет и без этих преференций, они много лет по всему миру работают и прекрасно умеют бороться со всякими проблемами, которые, наоборот, могут стать непреодолимыми и смертельными для начинающих...<br /><br />И в заключение. Микрософт, IBM и т.д., кто бы что ни говорил,- очень хорошие компании, сделавшие много достойных и полезных продуктов, некоторые из которых изменили лицо нашего мира к лучшему. Такие организации, как, например, Microsoft Research, и сейчас являются весьма продвинутыми исследовательскими центрами, в которых работают выдающиеся специалисты (знаю это по собственному опыту общения с ними - как в Редмонде, так и в Кембридже). Отделения MR есть во многих странах, даже в Китае. И было бы просто замечательно, если в один прекрасный день отделение MR возникло в России - я бы посчитал честью работать там рядовым сотрудником (и не обиделся бы, если бы меня не взяли :-)). <br /><br />В России - но <span style="font-weight:bold;">не в Сколково</span>! Оно для другого задумано.<br /><br />Или... <span style="font-style:italic;">для того самого</span>?..zouevhttp://www.blogger.com/profile/09163739178551976623noreply@blogger.com11tag:blogger.com,1999:blog-8224163229837394669.post-25003677808304083622011-01-13T14:23:00.005+01:002011-01-13T14:38:16.493+01:00Интерстрон: реализация нового стандарта Си++С публикацией перевода нового стандарта ясность еще не наступила - но это не означает, что мы "зациклились" на этой проблеме. Реализация нового стандарта идет своим чередом. Сейчас наш компилятор Си++ уже поддерживает такие возможности "нового" Си++:<br /><br />1. Спецификатор типа <span style="font-weight:bold;">auto</span> для переменных.<br />2. Спецификатор <span style="font-weight:bold;">decltype</span>.<br />3. Подряд идущие закрывающие угловые скобки <span style="font-weight:bold;">>></span> в списках параметров шаблонов.<br />4. Конструкция <span style="font-weight:bold;">static_assert</span>.<br />5. Спецификатор extern для шаблонов: <span style="font-weight:bold;">extern template</span>.<br />6. Расширенное friend-объявление вида <span style="font-weight:bold;">friend T</span>, где <span style="font-weight:bold;">T</span> - параметр шаблона.<br />7. Предопределенная переменная <span style="font-weight:bold;">__func__</span> для функций.<br />8. Обобщённые константные выражения.<br />9. R-ссылки и ref-квалификаторы.<br />10. Константа <span style="font-weight:bold;">nullptr</span>.<br />11. Шаблоны с переменным числом параметров (variadic templates).<br />12. Расширенные enum'ы.<br />13. Списки инициализаторов.<br />14. Спецификатор inline для пространств имен: <span style="font-weight:bold;">inline namespace</span>.<br />15. Шаблонные алиасы (<span style="font-weight:bold;">template<...> using <новый тип> = ...</span>)<br />16. Задание <span style="font-weight:bold;">=delete</span> и <span style="font-weight:bold;">=default</span> для функций.<br />17. Описатель <span style="font-weight:bold;">explicit</span> для функций преобразования типа.<br />18. Ослабление требований к union'ам.<br />19. Делегирование конструкторов.<br />20. Наследование конструкторов.<br /><br />- ну и довольно много мелких усовершенствований.<br /><br />В процессе реализации находятся такие свойства, как инициализаторы для нестатических членов класса и - конечно же!- лямбда-выражения и альтернативный синтаксис объявления функций (с типом возврата в конце после "стрелочки" <span style="font-weight:bold;">-></span>). По нашим планам это будет ближе к концу февраля.<br /><br />За такие вещи, как пользовательские литералы, циклы с range, атрибуты и конструкторы перемещения (move-конструкторы) пока не брались.zouevhttp://www.blogger.com/profile/09163739178551976623noreply@blogger.com10tag:blogger.com,1999:blog-8224163229837394669.post-16565913397355567992011-01-11T17:14:00.011+01:002011-01-19T21:06:14.396+01:00Сколково: угол зренияАжиотаж в электронной (другой не читаю) печати насчет сколковской инициативы прошел, интенсивность обсуждений спадает, а я только спохватился. :-) Вот такое нехитрое соображение насчет всего этого.<br /><br />Я вполне разделяю практически повсеместный скептицизм по поводу проекта Сколково. Пусть даже этот проект и начинался с вполне благими целями, в чем я, в общем, уверен (но и здесь несколько наивным выглядит желание скопировать сугубо внешние признаки успешных аналогов - прямо как Петр, начавший свои реформы с бритья боярам бород и натягивания на них камзолов; умные люди пишут об "обратном культе карго", что кажется мне очень точным и остроумным наблюдением).<br /><br />Однако, какими бы ни были благими побудительные мотивы инициаторов, имеется очень большая вероятность, что в итоге все сведется к банальному "попилу бабла", бюрократическим играм, созданию теплых мест "для своих", и всего прочего подобного, что мы ежедневно и повсеместно наблюдаем. Будут, конечно, победные реляции, репортажи по ТВ; но постепенно общественное внимание будет ослабевать, обычные российские реалии просочатся в Сколково сквозь построенные антибюрократические преграды, и проект тихо загнется, превратившись в еще один "технопарк", которых и сейчас достаточно.<br /><br />Но если бы этим мои ощущения и ограничивались - не стоило тратить время на написание этого поста. Так вот, мне кажется, что не все так плохо; все зависит от того, <span style="font-style:italic;">под каким углом зрения</span> смотреть на Сколково.<br /><br />Действительно, если исходить из глобального подхода "за державу обидно" - абсолютный скептицизм выглядит вполне оправданным: еще один надутый пузырь, в который вбухивается чертова уйма государственных средств и к которому немедленно присосутся сотни нахлебников в лице "своих" участников, "своих" бюрократов и прочих управителей...<br /><br />Но... <span style="font-weight:bold;">давайте сменим угол зрения</span>: посмотрим на Сколково не с высоты полета "государственного орла", а с <span style="font-style:italic;">локальной</span> точки зрения - со стороны небольших команд, разрабатывающих что-то действительно крутое и перспективное (а самый завзятый скептик все-таки не сможет отрицать, что по части креативности у нас пока еще неплохо...). В самом деле, что там обещают: полное отсутствие бюрократии, освобождение от налогов, минимум бумажной волокиты, своя таможня, своя милиция (!), отдельная территория, рентное жилье по разумным ценам, маркетинговая и инвесторская поддержка, творческая среда,- идеальные условия для работы! Да, знаю, знаю: все это, даже если и будет поначалу, в дальнейшем неизбежно "рассосется": и жилье начнут продавать нуворишам, и своя бюрократия просто не может не самозародиться, и милиция с таможней коррумпируются...<br /><br />Но ведь энтропия наступит <span style="font-weight:bold;">не сразу</span>, вот в чем все дело!! И вот пока извечные российские реалии не опутали своими щупальцами Сколково (года три минимум будет, как мне кажется) - этот "золотой" период и может оказаться тем, чего не хватает молодым командам. По моему мнению, для подобных стартапов действительно продуктивной была бы такая логика: "Что произойдет со Сколково потом - мы не знаем, и повлиять на это не можем. Но пока здесь есть хорошие условия, которые создали как раз для таких, как мы - странно было бы ими не воспользоваться. Пусть это ненадолго, но нам и нужно два-три года, чтобы раскрутиться".<br /><br />...Это все, наверное, правильно, если бы была уверенность, что Сколково и создается, собственно, для подобных компактных коллективов из талантливых и упорных молодых людей, пытающихся сделать что-то, чего до них не было. А вот такой уверенности у меня что-то все меньше и меньше... Об этом - следующий пост про Сколково.zouevhttp://www.blogger.com/profile/09163739178551976623noreply@blogger.com5tag:blogger.com,1999:blog-8224163229837394669.post-89880078002923223132011-01-03T17:57:00.003+01:002011-01-03T18:05:39.789+01:00Веб-сайтКак-то так невольно и неожиданно для меня самого получилось, что какая-то информация обо мне, о моих прошлых и нынешних проектах, публикациях и т.п. вдруг взяла и скомпоновалась в виде кое-как структурированного набора веб-страничек. :-))<br /><br />Вот, прошу любить и жаловать:<br /><br /><span style="font-weight:bold;">eugene.zouev.name</span><br /><br />(обратите внимание, без www!)<br /><br />Там на самом деле больше половины страниц пустые, и, наверное, нет ни одной, содержимое которой меня полностью устраивает. Так что периодически буду туда писать, дописывать, подправлять, изменять. Но вот дизайн вряд ли изменится: нет ни времени, ни желания самому красивые картинки придумывать и ваять. Гугл за меня все придумал, и спасибо ему за это.<br /><br />В общем, не судите строго. :-)zouevhttp://www.blogger.com/profile/09163739178551976623noreply@blogger.com2tag:blogger.com,1999:blog-8224163229837394669.post-21405101241333497672011-01-03T17:50:00.002+01:002011-01-03T17:57:07.552+01:00Перевод Стандарта Си++Да, друзья и коллеги, я вас, наверное, задолбал уже своими "новостями" насчет перевода... Искренне прошу прощения - и сам хотел бы порадовать "конкретной" новостью, да все не получается.<br /><br />В общем, так: перевод выйдет в печатной версии точно. Сейчас ведутся (ну, если честно, после новогодних каникул возобновятся :-)) переговоры с издательствами, которые могли бы выполнить печать.<br /><br />Я очень хочу выпустить также и электронную версию; переговоры об этом тоже ведутся.<br /><br />Ну что же делать?- не все бывает так, как планировалось. Еще раз прошу извинить за отсутствие реальных новостей. Самому обидно, тем более, что текст-то полностью готов уже довольно давно...zouevhttp://www.blogger.com/profile/09163739178551976623noreply@blogger.com9tag:blogger.com,1999:blog-8224163229837394669.post-32076823928046362632010-10-15T11:38:00.005+02:002010-10-15T11:54:06.144+02:00Перевод стандарта: последние новостиВот самая свежая информация.<br /><br /><span style="font-weight:bold;">Первое</span>. Перевод <span style="font-weight:bold;">полностью готов</span>: написан (включая все запланированные приложения), отформатирован для печати, и все такое прочее. Больше 700 страниц текста формата А4. Более того, уже была договоренность с типографией о выпуске пробного тиража в 1000 экземпляров. И еще более того: была запланирована презентация книги на выставке CHIPEXPO в конце этого месяца... <br /><br /><span style="font-weight:bold;">Второе</span>. Вся эта активность была в самый последний момент (вчера вечером) <span style="font-style:italic;">остановлена</span>. Тиража не будет, не будет и презентации. Не спрашивайте, кто остановил и почему; скажем так: лица, уполномоченные принимать такие решения...<br /><br /><span style="font-weight:bold;">Третье</span>: что будет. А будет (сначала, по крайней мере) <span style="font-weight:bold;">электронная версия перевода</span>. В отличие от печатного варианта, она будет, во-первых, цветная (различные по характеру и смыслу фрагменты текста представлены различными цветами и шрифтами) и, во-вторых, пронизана перекрестными ссылками - на синтаксические правила, на разделы стандарта и так далее. Так что: просто читать с экрана, перескакивая при желании по перекрестным ссылкам. Будет ли возможность печати фрагментов или теста в целом, пока не знаю - ведутся переговоры с теми, кто будет такой продукт непосредственно производить.<br /><br />В общем, ничего в жизни просто и быстро не бывает, к сожалению... Обо всех дальнейших планах и новостях буду стараться оперативно сообщать.zouevhttp://www.blogger.com/profile/09163739178551976623noreply@blogger.com12tag:blogger.com,1999:blog-8224163229837394669.post-28113196299994615672010-10-13T16:40:00.003+02:002010-10-13T16:51:15.035+02:00Конференция "Разработка ПО 2010"В пятницу 15 октября выступаю на конференции "Разработка ПО 2010". Вот <a href="http://cee-secr.org/lang/ru-ru/">сайт конференции</a>. Мое выступление (если организаторы в очередной раз не изменят расписание :-)) в 11.15 в комнате С, в самой маленькой из имеющихся аудиторий. Я не в претензии: мой доклад <span style="font-weight:bold;">"Семантические интерфейсы языков программирования"</span> вряд ли вызовет большой приток публики. :-)<br /><br />Вроде бы, туда можно прийти даже без регистрации, просто послушать. Надо только иметь с собой паспорт. Адрес (где-то в районе Курского вокзала) и полное расписание есть на указанном сайте. Кстати, в ту же пятницу, в 16.30 там выступает Страуструп: <span style="font-weight:bold;">"Введение в С++0x"</span>.<br /><br />(Это я рекламирую конференцию по просьбе организаторов. :-))<br /><br />Новости (важные!) о выходе перевода Стандарта С++ последуют завтра.zouevhttp://www.blogger.com/profile/09163739178551976623noreply@blogger.com4tag:blogger.com,1999:blog-8224163229837394669.post-87680644487273840482010-03-28T17:49:00.024+02:002010-03-28T20:14:30.058+02:00Code Contracts в .NET и монополия C#В последней (четвертой) версии .NET и, соответственно, в VS2010, появились средства спецификации параметров, пред- и постусловий, инвариантов классов и всего того, что с подачи Бертрана Майера называется Code Contracts или Design by Contract.<br /><br />Вот пара ссылок:<br />- <a href="http://msdn.microsoft.com/en-us/devlabs/dd491992.aspx">Объява из Микрософта</a>;<br />- <a href="http://progg.ru/Tags/code-contracts">Список статей по теме</a>.<br /><br />Неутомимый и вездесущий Дино Эспозито уже, конечно, отозвался на это новшество несколькими постами:<br /><br />- <a href="http://dotnetslackers.com/articles/net/Code-Contracts-Preview-Assert-Assume.aspx">Assert/Assume</a><br />- <a href="http://dotnetslackers.com/articles/net/Code-Contracts-Preview-Invariants.aspx">Invariants</a><br />- <a href="http://dotnetslackers.com/articles/net/Code-Contracts-Preview-Preconditions.aspx">Preconditions</a><br />- <a href="http://dotnetslackers.com/articles/net/Code-Contracts-Preview-PostConditions.aspx">Postconditions</a><br /><br />Документ с полным описанием новых средств .NET, помеченный этим январем, лежит у Микрософта <a href="http://download.microsoft.com/download/C/2/7/C2715F76-F56C-4D37-9231-EF8076B7EC13/userdoc.pdf">здесь</a>.<br /><br />Многие интересующиеся об этом уже знают, но вот что интересно заметить. Возникает ощущение (и чем дальше, тем больше это ощущение крепнет), что Микрософт стремится втиснуть в .NET поддержку всего, <span style="font-style:italic;">что вообще есть в программировании</span>. Начав с введения в виртуальную машину и MSIL нормальной системы типов и стековой модели выполнения, адекватной императивным языкам (и, естественно, отразив все это в базовом языке C#), они постепенно начали добавлять - и в систему, и в язык - все новые и новые возможности, иногда даже приниципиально отличающиеся от императивной парадигмы. Типов<span style="font-weight:bold;">а</span>я параметризация, технология LINQ, динамическая типизация, теперь вот - контрактное программирование.<br /><br />Каждое отдельное нововведение объясняется вполне понятными причинами: и обобщенное программирование нужно и полезно (кто спорит?), и работа с БД непосредственно из программ, и поддержка функциональной парадигмы ("функциональная мафия" из Кембриджского отделения Microsoft Research активность не снижает :-)), и динамическая типизация нужна, чтобы поддерживать скриптовые языки...<br /><br />Принципиально важно в контексте моих рассуждений то, что все эти новшества <span style="font-style:italic;">получают свою поддержку в базовом языке</span>. И вот в один прекрасный день обнаружится, что программировать под .NET имеет смысл только в этом базовом языке - <span style="font-weight:bold;">в C# есть все</span>, и это "все" адекватно поддерживается платформой .NET!<br /><br />Наверное, я несколько сгущаю краски, и всегда останутся энтузиасты, предпочитающие и в .NET программировать на F#, Nemerle, Хаскелле, Питоне. Просто ниша для использования этих языков в рамках .NET сузится до совершенно микроскопических размеров.<br /><br />Но вот как быть с такими промышленными языками, как Eiffel и Scala? С введением поддержки контрактного программирования C# практически полностью "покроет" почти все преимущества Эйфеля, а то немногое особенное, что еще есть в этом языке, вряд ли окажется причиной выбора этого языка для реальных проектов. И сейчас не очень понятно, какова популярность Эйфеля как такового (в <a href="http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html">индексе TIOBE</a> он сильно ниже первых пятидесяти языков), а его присутствие в мире .NET кажется совершенно эфемерным...<br /><br />Проект портирования Скалы на .NET все еще, вроде бы, имеет некоторый смысл (уж больно мощный и привлекательный язык, и даже после появления в C# "функциональных" черт в Скале все еще остаются вполне уникальные и очень удобные для программирования свойства), но все равно, потенциальная пользовательская база для этого языка наверняка существенно сократится...<br /><br />Повторяю: я не говорю, что происходит катастрофа,- видна <span style="font-style:italic;">тенденция</span>: мы все дальше и дальше отодвигаемся от идиллической картины, десять лет назад нарисованной нам маркетологами из Микрософта: мол, неважно, на каком языке программировать, выбирай любой, лишь бы компилятор генерировал CIL-совместимый код.<br /><br />"Пусть расцветает тысяча цветов" (или как это китайцы говорили)...zouevhttp://www.blogger.com/profile/09163739178551976623noreply@blogger.com12tag:blogger.com,1999:blog-8224163229837394669.post-37134507879187463712010-01-07T13:41:00.004+01:002010-01-07T14:55:13.904+01:00Перевод Стандарта С++: финиш близокВ конце ноября появились сразу две очередные версии черновика стандарта (драфта): документы с номерами <span style="font-weight:bold;">n2960</span> и <span style="font-weight:bold;">n3000</span>. Пришлось заново проходить весь перевод, вносить правки и переводить новые фрагменты.<br /><br />С одной стороны, модификации в документах сделаны по-человечески: красным выделяются удаляемые фрагменты, зеленым - добавляемые. Удобно.<br /><br />Но, с другой стороны, эти модификации делаются строго относительно предыдущей версии драфта; правки, внесенные ранее, уже никак не выделяются. А в данном случае для меня это означает, что пришлось проходить свой перевод <span style="font-style:italic;">дважды</span>, последовательно внося в него правки из двух версий драфта, так как появились они на сайте комитета одновременно. Не самая творческая работа, как вы понимаете...<br /><br />В чем существо модификаций:<br /><br />- Разделы 14.10 и 14.11 <span style="font-weight:bold;">о концептах</span> удалены полностью. Также удалены все ссылки на него и на его подразделы, а эти ссылки были разбросаны по всему тексту.<br /><br />- Раздел 5.1 (он превратился в подраздел 5.1.2) <span style="font-weight:bold;">о лямбда-выражениях</span> полностью переписан. Слава Богу, в нем появились примеры, так что самому не нужно теперь их придумывать (а уж собрался было). Однако, переводить пришлось все заново.<br /><br />- Очень много мелких правок по всему тексту. Где опечатка исправлена, где уточнение сделано... Вносить их нетрудно, но все равно, занятие это на редкость занудное.<br /><br />В общем, итог к настоящему моменту такой: <span style="font-weight:bold;">перевод полностью готов, осталось сформировать приложения</span> (ну, и предисловие написать :-)).<br /><br />Приложения - это отдельная песня. :-) Из приложений самого драфта в дело пойдет, видимо, только сводка синтаксиса, большинство остальных не столь уж важны (с учетом того, что перевод будет только ядра языка, без стандартных библиотек).<br /><br />Зато будет несколько собственных приложений, и вот их-то я сейчас и готовлю. Очень коротко, что там будет:<br /><br />- <span style="font-weight:bold;">Сводка основных понятий/свойств языка</span>: название (в оригинале и в переводе), его определение, ссылка на место в стандарте и, возможно, комментарий. В общем, "Краткий курс" С++ :-)<br /><br />- <span style="font-weight:bold;">Синтаксис языка в виде диаграмм</span>, похожих на "железнодорожные" диаграммы, с помощью которых Вирт в свое время представлял синтаксис своих языков. Получается гораздо нагляднее, чем обычные синтаксические правила. Удобно для изучения и полезно в качестве справочника.<br /><br />- <span style="font-weight:bold;">Грамматика С++ в форме входного языка YACC/Bison</span>. Разумеется, корректная (иначе и приложение из нее делать не стоило :-)), то есть, по ней Bison и некоторые известные его аналоги в состоянии сгенерировать правильный распознаватель. В грамматике, правда, сделаны кое-какие допущения (в чистом виде грамматика С++ в "бизонной" нотации непредставима), но что удивительно и замечательно, удалось свести эти допущения к совершенному минимуму. Технические подробности будут там же в комментариях.<br /><br />Похожая грамматика С++ была в свое время опубликована в виде приложения к русскому переводу книги Ахо/Ульмана ("Dragon Book") - но здесь я целиком ее переписал, учтя все новые синтаксические конструкции.<br /><br />- <span style="font-weight:bold;">Пакет маленьких примеров программ на С++</span>, иллюстрирующих наиболее характерные свойства языка. Пакет сделан на основе тестового набора, который используется в Интерстроне для тестирования нашего компилятора.<br /><br />- <span style="font-weight:bold;">Удаленные разделы</span> о концептах. Хотя концепты, по всей видимости, будут радикально переделаны, да и произойдет это только в будущих версиях стандарта, мы все-таки опубликуем эти удаленные разделы, пусть и в виде приложения. Определенная ценность в них есть, да и проделанной работы по переводу жалко. :-) К тому же, многие просят и советуют оставить.<br /><br />Вот как-то так... :-)zouevhttp://www.blogger.com/profile/09163739178551976623noreply@blogger.com11tag:blogger.com,1999:blog-8224163229837394669.post-45190741725067284772010-01-04T17:39:00.003+01:002010-01-04T17:56:20.644+01:00Заспамили...Что-то за последнее время в блогспоте спам повалился просто невиданными темпами. Каждый день по нескольку идиотских "комментариев" появляется, зачастую к очень старым статьям. И ладно бы народ что-то рекламировал, свои фирмы или сервисы: "Разработка сайтов", например. Такое тоже есть, но удивительно, что такие сообщения не составляют большинства! Противно, конечно, когда твой блог используют для продвижения каких-то левых предложений - но я чувствую себя последним идиотом, обнаруживая в блоге такие, например, "комментарии":<br /><br /><span style="font-weight:bold;">"Хорошо пишете. Надеюсь, когда-нибудь увижу нечто подобное и на своем блоге…"<br /><br />"Без особого преувеличения можно точно сказать, что пост тему раскрыл на все 100 процентов"<br /><br />"Да уж… Тут как говорится: Амбар крепок, да углы худы"<br /><br />"Так-так… надо будет присмотреться к этой области"<br /></span><br />Вот скажите мне, какие цели преследуют авторы подобных текстов??? Какая им выгода от подобных сообщений? Никаких ссылок, линков и прочего в них нет, автор - "Анонимный". Зачем они пишут (или пускают "пишущих" роботов)?? Не понимаю...<br /><br />Но нет худа без добра: не выдержал и прошел по всем своим постам, вычищая подобное,- и обнаружил много комментариев по делу, на которые в прежней суете не управился ответить. Друзья, прошу прощения, что не всегда был оперативен, и за то, что, каюсь, просто забывал ответить! Буду исправляться. :-)<br /><br />И хорошо бы, конечно, блог активизирвать. В каждый последующий год число постов (и так небольшое) падает по сравнению с предыдущим - хотя тем для постов меньше не становится. Буду исправляться. :-))<br /><br />А пока - всех с Новым годом!!!<br />(В России, вроде, еще каникулы, а у нас в Европах праздники кончились, настали рабочие будни...)zouevhttp://www.blogger.com/profile/09163739178551976623noreply@blogger.com9tag:blogger.com,1999:blog-8224163229837394669.post-21329040838775769702009-11-16T12:58:00.000+01:002009-11-16T12:59:07.877+01:00Опять хвастаюсь :-))<!-- Результат теста. Shkolazhizni.ru --><div style="border: 1px solid #F0F0F0; padding: 10px; background: white; text-align: left; width: 250px;"><a href="http://shkolazhizni.ru/test/"><img border="0" title="Познавательные тесты" src="http://shkolazhizni.ru/img/logo-tests.gif"/></a><div style="margin: 3px 0pt 0px; background: #F0F0F0; width: 100%; height: 1px;"></div><div style="padding: 5px 0pt; font-family: Georgia,Times; font-size: 16px;">Шпрехен зи руссиш?</div><div style="color:#505050; font-family: Arial,Tahoma; font-size: 12px;"><a href="http://shkolazhizni.ru/test/21/"><img align="left" src="http://shkolazhizni.ru/img/tests/21_small.jpg" style="border: 1px solid #F0F0F0; margin-right: 10px;" alt="Шпрехен зи руссиш?" title="Шпрехен зи руссиш?"/></a>Тест на знание заимствованных слов, имён собственных и других хитростей русского языка. Такой небольшой «диктант», позволяющий проверить вашу грамотность. </div><div style="padding: 5px 0pt; font-family: Georgia,Times; font-size: 16px;" id="res_title"><b>Зуев</b> прошел этот тест с результатом:</div><div style="color: #347c00; font-family: Arial,Tahoma; font-weight: bold; font-size: 12px;">Ни одной ошибки! Столь доскональное знание русского языка выдаёт в вас профессионала.</div><div style="margin: 7px 0pt 5px; background: #F0F0F0; width: 100%; height: 1px;"> </div>→ <a href="http://shkolazhizni.ru/test/21/">Пройти тест "Шпрехен зи руссиш?"</a><br>→ <a href="http://shkolazhizni.ru/test/">Все познавательные тесты на ШколаЖизни.ру</a></div><!-- Результат теста. Shkolazhizni.ru -->zouevhttp://www.blogger.com/profile/09163739178551976623noreply@blogger.com2tag:blogger.com,1999:blog-8224163229837394669.post-3747829780918525952009-10-08T16:24:00.003+02:002009-10-08T16:31:12.801+02:00Хвастаюсь :-)Хотя моей заслуги тут никакой, но все-таки...<div>Опубликован рейтинг<b> двухсот</b> лучших университетов мира за 2009 год.</div><div><br /></div><div><a href="http://www.timeshighereducation.co.uk/Rankings2009-Top200.html">http://www.timeshighereducation.co.uk/Rankings2009-Top200.html</a></div><div><br /></div><div><a href="http://www.timeshighereducation.co.uk/Rankings2009-Top200.html"></a>ETH Zurich, в котором я проработал шесть лет,- <b>на 20-м месте</b>: лучший университет в континентальной Европе (выше только штатовские и английские универы).</div><div><br /></div><div>EPFL Lausanne, где я работаю сейчас,- <b>на 42-месте</b>.</div><div><br /></div><div>Для сравнения: МГУ <b>на 155 месте</b>, питерский универ - <b>на 168-м</b></div><div>(в МГУ, впрочем, я тоже работал :-))</div><div><div><br /></div></div>zouevhttp://www.blogger.com/profile/09163739178551976623noreply@blogger.com2tag:blogger.com,1999:blog-8224163229837394669.post-71001953274668206012009-10-01T15:57:00.006+02:002009-10-01T17:01:54.739+02:00Хорошо забытое староеВот, друзья, подтверждение моей старой идеи насчет полезности двуязычного текста "канонического" описания языка программирования. Недавно откопал у себя такую вот книгу:<div><br /></div><div><b>Пересмотренное сообщение об Алголе-68. Москва, "Мир", 1979 год. Под редакцией А.П.Ершова.</b></div><div><br /></div><div>Вот скан обложки:</div><div><br /></div><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMZuRXOrXiLTntEzDs1mFwxhsUFJDFLpsuhb9F5AQbwLjsgs8OLlAXxe9tHaQ_yxwMy0LZMGxLgf84bJIZ960oycKljqGCTp-d4rmmMSIWhCAu-zYrXDun5mtx2c5FdAf6akohgVAErFiH/s1600-h/IMG_0001.jpg"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMZuRXOrXiLTntEzDs1mFwxhsUFJDFLpsuhb9F5AQbwLjsgs8OLlAXxe9tHaQ_yxwMy0LZMGxLgf84bJIZ960oycKljqGCTp-d4rmmMSIWhCAu-zYrXDun5mtx2c5FdAf6akohgVAErFiH/s320/IMG_0001.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5387632455245528578" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 182px; height: 320px; " /></a><br /><div>А внутри вот что: на левой странице каждого разворота - оригинальный, английский текст описания языка, на правой - перевод, с поабзацным соответствием. Смотрите сами:</div><div><br /></div><div><br /></div><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqU7vwOpj3yb04b3wkSFibgYqSc-N3SUMfQuk_OgL-RVxcAS4tYasZ1MgfYBE00nxS2Y0YRz34zmdkCJjw1uRws-sHBh8NZGRBAhIbM6hysx0a5Xcwx5V26-SBq1Pbvu_hA2JPgmP9O5Tj/s1600-h/CaptureX.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 256px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqU7vwOpj3yb04b3wkSFibgYqSc-N3SUMfQuk_OgL-RVxcAS4tYasZ1MgfYBE00nxS2Y0YRz34zmdkCJjw1uRws-sHBh8NZGRBAhIbM6hysx0a5Xcwx5V26-SBq1Pbvu_hA2JPgmP9O5Tj/s320/CaptureX.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5387633175081119026" /></a><br /><div>Скажут: ну что там, какой-то древний язык, который никому давно уже не нужен... Но ведь дело не в языке - дело в принципе подачи материала. А такой двуязычный текст, на мой взгляд, делает изучение языка на порядок удобнее и быстрее, нежели любые "одноязычные" тексты, пусть даже самые блестящие. Не хочу сейчас повторять свои аргументы...<br /><div><br /></div><div>Замечу только, что в то время выход языка Алгол-68 представлялся (да и был) очень важным, едва ли не эпохальным, событием в программировании. Язык несомненно очень мощный, с хорошим "научным" базисом, с продуманным и элегантным дизайном, систематически и тщательно спроектированный. Да, сложный; да, местами избыточно сложный; да, кое-какие особенности вряд ли были оправданы для языка массового применения, каким он задумывался (в частности, сами принципы построения, с двухуровневой грамматикой, с разделением формальных правил и "особенностей представления")...</div><div><br /></div><div>Но так или иначе, к языку тогда относились очень серьезно, и книга, которую я упоминаю,- тому наглядный пример.</div><div><br /></div><div>Так что ничего я не выдумал - все уже было...</div><div><br /></div><div>И последнее. Весь этот пост на самом деле - плач по несбывшемуся: наш перевод выйдет в <i><b>одно</b></i>язычном формате. Публиковать английский оригинал "от себя" мы не имеем права. Если бы Госстандарт нам помог получить права публикации - может, что-то бы и получилось. Но ребята там сидят какие-то вялые - от них даже ответа по существу не добьешься; только пожелания успехов (это не шутка: таким пожеланием заканчивалась их очередная отписка)...</div></div>zouevhttp://www.blogger.com/profile/09163739178551976623noreply@blogger.com5tag:blogger.com,1999:blog-8224163229837394669.post-72473552212561007942009-07-23T12:30:00.004+02:002009-07-23T12:55:50.840+02:00Концепции или концепты?<span class="Apple-style-span" style="font-size:medium;">Появился комментарий такого рода:</span><div><span class="Apple-style-span" style="font-size:medium;"><br /></span></div><div><span class="Apple-style-span" style=" border-collapse: collapse; font-family:arial;"><span class="Apple-style-span" style="color:#3366FF;"><span class="Apple-style-span" style="font-size:medium;">...давайте концепции не будем обзывать концептами?</span></span></span></div><div><span class="Apple-style-span" style="font-family:arial;"><span class="Apple-style-span" style="border-collapse: collapse; "><span class="Apple-style-span" style="font-size:medium;"><br /></span></span></span></div><div><span class="Apple-style-span" style="font-family:arial;"><span class="Apple-style-span" style="border-collapse: collapse; "><span class="Apple-style-span" style="font-size:medium;">Хотя этих самых концепций-концептов в языке - по крайней мере, в течение ближайших лет - не будет, все-таки имеет смысл сказать пару слов по этому поводу.</span></span></span></div><div><span class="Apple-style-span" style="font-family:arial;"><span class="Apple-style-span" style="border-collapse: collapse;"><span class="Apple-style-span" style="font-size:medium;"><br /></span></span></span></div><div><span class="Apple-style-span" style="font-family:arial;"><span class="Apple-style-span" style="border-collapse: collapse;"><span class="Apple-style-span" style="font-size:medium;">Конечно, английское concept вообще-то переводится на русский как "концепция", "понятие". Но, как мне кажется, было бы неправильно буквально использовать такой вариант перевода. Дело в том, что "прямой" перевод обозначает - по крайней мере, в русском языке - нечто обобщенное, абстрактное. Некую идею, на основе которой строится какая-то теория, система взглядов и т.п. Например, "концепция бесконечности Вселенной" или что-то подобное.</span></span></span></div><div><span class="Apple-style-span" style="font-family:arial;"><span class="Apple-style-span" style="border-collapse: collapse;"><span class="Apple-style-span" style="font-size:medium;"><br /></span></span></span></div><div><span class="Apple-style-span" style="font-family:arial;"><span class="Apple-style-span" style="border-collapse: collapse;"><span class="Apple-style-span" style="font-size:medium;">В нашем же случае речь идет не о какой-либо идее, взгляде, теории - а о </span><b><span class="Apple-style-span" style="font-size:medium;">конкретном механизме конкретного языка</span></b><span class="Apple-style-span" style="font-size:medium;">, введенном в него для решения вполне определенных задач (насколько этот механизм адекватен задачам - другой вопрос). И использовать для обозначения </span><i><span class="Apple-style-span" style="font-size:medium;">языкового м</span></i><i><span class="Apple-style-span" style="font-size:medium;">еханизма</span></i><span class="Apple-style-span" style="font-size:medium;"> слово, традиционно обозначающее нечто "неконкретное", "абстрактное" - было бы неправильным. Тут нужно что-то близкое, но другое. И слово </span><b><span class="Apple-style-span" style="font-size:medium;">концепт</span></b><span class="Apple-style-span" style="font-size:medium;">, на мой взгляд, лучше отражает именно конкретность, предметность того, о чем идет речь: совокупность синтаксических и семантических правил, определяющих некий языковой механизм.</span></span></span></div><div><span class="Apple-style-span" style="font-family:arial;"><span class="Apple-style-span" style="border-collapse: collapse;"><span class="Apple-style-span" style="font-size:medium;"><br /></span></span></span></div><div><span class="Apple-style-span" style="font-family:arial;"><span class="Apple-style-span" style="border-collapse: collapse;"><span class="Apple-style-span" style="font-size:medium;">В английском языке, по-моему, не столь чувствуются подобные тонкие смысловые различия, потому они довольно легко используют для нового понятия любое более-менее подходящее слово. Не сомневаюсь, что они запросто могут выдать что-то вроде </span><i><span class="Apple-style-span" style="font-size:medium;">the concept of concepts</span></i><span class="Apple-style-span" style="font-size:medium;">. Но сказать по-русски "понятие концепции" или "механизм концепций" - как хотите, но это ужасно и выглядит как насилие над языком, и никто не заставит меня это повторить...</span></span></span></div><div><span class="Apple-style-span" style="font-family:arial;"><span class="Apple-style-span" style="border-collapse: collapse;"><span class="Apple-style-span" style="font-size:medium;"><br /></span></span></span></div><div><span class="Apple-style-span" style="font-family:arial;"><span class="Apple-style-span" style="border-collapse: collapse;"><span class="Apple-style-span" style="font-size:medium;">И последнее: пафос комментария словно бы предполагает, что C++ concepts уже широко обсуждаются в русскоязычных источниках и там уже вовсю называются концепциями. Рискну предположить, что это все-таки не совсем так. :-)</span></span></span></div><div><span class="Apple-style-span" style="font-family:arial;"><span class="Apple-style-span" style="border-collapse: collapse;"><span class="Apple-style-span" style="font-size:medium;"><br /></span></span></span></div><div><span class="Apple-style-span" style="font-family:arial;"><span class="Apple-style-span" style="border-collapse: collapse;"><span class="Apple-style-span" style="font-size:medium;">По всему по этому: только </span><b><span class="Apple-style-span" style="font-size:medium;">концепты</span></b><span class="Apple-style-span" style="font-size:medium;">. :-))</span></span></span></div>zouevhttp://www.blogger.com/profile/09163739178551976623noreply@blogger.com6tag:blogger.com,1999:blog-8224163229837394669.post-48147135403321955472009-07-23T11:54:00.004+02:002009-07-23T12:20:58.425+02:00Concepts are gone!!Многие уже знают, но все равно: ошеломляющая новость!<div><br /><div><b><span class="Apple-style-span" style="color:#FF0000;">Комитет по стандартизации C++ проголосовал за удаление механизма концептов из нового Стандарта Си++</span></b><span class="Apple-style-span" style="color:#FF0000;">. </span></div><div><br /></div><div>Вот ссылка, по которой рассказываются детали и обсуждаются причины и последствия:<br /><div><br /></div><div><a href="http://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=441">http://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=441</a></div><div><br /></div><div>Вот на что упал взгляд при первом чтении (перевод вольный):</div><div><br /></div><div><span class="Apple-style-span" style="color:#3366FF;">В понедельник 13 июля на очередном заседании комитета по стандартизации С++ во Франкфурте по результатам голосования концепты были удалены из C++0x. Эта шокирующая новость вызывает множество вопросов и беспокойств... Когда я впервые об этом услышал, я просто не поверил... Концепты представляли собой наиболее существенное добавление в ядро С++ с 1998 года </span>(с момента выпуска первого стандарта - Е.З.)<span class="Apple-style-span" style="color:#3366FF;">. В течение последних <b>пяти лет </b>обсуждение механизма концептов проходило на каждом заседании комитета... После десятков официальных сообщений, описаний и статей, посвященных представлению и продвижению концептов, казалось крайне маловероятным, что непосредственно перед финишной чертой, в результате драматического голосования этот механизм будет выброшен...</span></div><div><br /></div><div><span class="Apple-style-span" style="font-size:medium;">По-моему, это беспрецедентно: на самом последнем этапе стандартизации, когда даже редакторские правки в финальный текст вносятся неохотно, а голосование представляет собой формальность, сделать такое... Надо полагать, были на то весомые причины. Где-то было написано, что, мол, "никто из участников голосования не был счастлив от такого решения"...</span></div><div><span class="Apple-style-span" style="font-size:medium;"><br /></span></div><div><span class="Apple-style-span" style="font-family:'Lucida Grande';"><span class="Apple-style-span" style=" line-height: 19px;"><span class="Apple-style-span" style="font-family:Georgia;"><span class="Apple-style-span" style=" line-height: normal;"><span class="Apple-style-span" style="font-size:medium;">Помимо очевидной важности этого события "вообще", оно непосредственно влияет и на мою работу: простите, ребята, </span><i><span class="Apple-style-span" style="font-size:medium;">я уже перевел почти сто страниц текста</span></i><span class="Apple-style-span" style="font-size:medium;"> - громадный кусок главы 14 драфта!.. И что мне теперь, выкидывать все это? Помимо этого, упоминание концептов и понятий, к ним относящихся, разбросано по всему тексту стандарта - и теперь придется лазить по всему тысячестраничному тексту и все эти упоминания вычищать?..</span></span></span></span></span></div></div></div>zouevhttp://www.blogger.com/profile/09163739178551976623noreply@blogger.com9tag:blogger.com,1999:blog-8224163229837394669.post-73813339293317105112009-07-17T16:19:00.008+02:002009-07-17T16:38:14.258+02:00Примеры комментариев<div><div style="text-align: center; "><span class="Apple-style-span" style="font-size:medium;"><br /><div style="text-align: left;"><span class="Apple-style-span" style="font-size:medium;">По просьбе </span><span class="Apple-style-span" style="border-collapse: collapse; "><a href="http://www.blogger.com/profile/15875277007650610928" target="_blank" style="color: rgb(42, 93, 176); "><span class="Apple-style-span" style="font-size:medium;">Ilya Kulakov</span></a><span class="Apple-style-span" style="font-size:medium;"> привожу два примера того, как могли бы выглядеть комментарии.</span></span></div></span></div><div style="text-align: left;"><span class="Apple-style-span" style="border-collapse: collapse; "><br /></span></div><div><div><span class="Apple-style-span" style="border-collapse: collapse; "><span class="Apple-style-span" style="font-size:medium;">Первый пример (не знаю, хорошо ли будет видно...):</span></span></div><div><span class="Apple-style-span" style="border-collapse: collapse;"><br /></span></div></div></div><div><br /></div><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAFrOjaEdJA6n3D6prJSGbm7AVhwODWikJmsaLPCHeQgdHUhC1foNySFTjos-R1PG10Jjxp_dsog3_bTgCq8WCe0KaaixXa6C1El7OwDra6P4ffWHxp5O08G_VDgwOvoB9fxsZUmQTOHeC/s1600-h/Capture.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 356px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAFrOjaEdJA6n3D6prJSGbm7AVhwODWikJmsaLPCHeQgdHUhC1foNySFTjos-R1PG10Jjxp_dsog3_bTgCq8WCe0KaaixXa6C1El7OwDra6P4ffWHxp5O08G_VDgwOvoB9fxsZUmQTOHeC/s400/Capture.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5359435939073222306" /></a><br /><div style="text-align: center;"><div style="text-align: left;"><span class="Apple-style-span" style="color:#0000EE;"><span class="Apple-style-span" style="text-decoration: underline;"><br /></span></span></div><div style="text-align: left;"><span class="Apple-style-span" style="font-family: arial; border-collapse: collapse; ">(Для особо внимательных: в этом кусочке есть опечатка. Она уже исправлена. Капчу переделывать лень. :-))</span></div><div style="text-align: left;"><span class="Apple-style-span" style="font-family:arial;"><span class="Apple-style-span" style="border-collapse: collapse;"><br /></span></span></div><div style="text-align: left;"><span class="Apple-style-span" style="font-family: arial; border-collapse: collapse; ">Второй пример - даже не комментарий, а как бы просто "маркер": он говорит, что, мол, в этом месте неплохо бы написать комментарий такого-то содержания. Такие маркеры также приветствуются.</span></div></div><div><span class="Apple-style-span" style="font-family:arial;"><span class="Apple-style-span" style="border-collapse: collapse;"><br /></span></span></div><div><span class="Apple-style-span" style="font-family:arial;"><span class="Apple-style-span" style="border-collapse: collapse;"><br /></span></span></div><div><span class="Apple-style-span" style="font-family:arial;"><span class="Apple-style-span" style="border-collapse: collapse;"><span class="Apple-style-span" style="border-collapse: separate; font-family: Georgia; "><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGM6vtA-bww3U-MsBOQLFjsflmyK59QfR6SneAfaYaqPdPy8hRC2VV2xVCJemo_lpTWVI01eNPxfkkX3GZLX0Dj8NdsipznpKhsJQ5gILGAlYNeOHnbom2CWBH9n34OCMX5KXzR1Bk79Fa/s1600-h/Capture_2.jpg"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGM6vtA-bww3U-MsBOQLFjsflmyK59QfR6SneAfaYaqPdPy8hRC2VV2xVCJemo_lpTWVI01eNPxfkkX3GZLX0Dj8NdsipznpKhsJQ5gILGAlYNeOHnbom2CWBH9n34OCMX5KXzR1Bk79Fa/s400/Capture_2.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5359436291675376882" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 282px; " /></a></span></span></span></div><div><span class="Apple-style-span" style="font-family:arial;font-size:7;"><span class="Apple-style-span" style="border-collapse: collapse; font-size: 48px;"><span class="Apple-style-span" style="font-size:130%;"><span class="Apple-style-span" style="font-size: 16px;"><br /></span></span></span></span></div><div><span class="Apple-style-span" style="font-family:arial;"><span class="Apple-style-span" style="border-collapse: collapse;">И последнее замечание. На самом деле, комментарии вовсе не обязаны быть "умными". У меня полно коротеньких комментариев типа "<span class="Apple-style-span" style="color:#3366FF;">об этом подробнее сказано в таком-то разделе</span>", "<span class="Apple-style-span" style="color:#3366FF;">здесь такой-то термин использован неправильно, надо такой-то</span>" и даже "<span class="Apple-style-span" style="color:#3366FF;">простите за буквоедство, но здесь опечатка</span>"...</span></span></div>zouevhttp://www.blogger.com/profile/09163739178551976623noreply@blogger.com3tag:blogger.com,1999:blog-8224163229837394669.post-15395634364698330112009-07-16T17:17:00.004+02:002009-07-16T18:18:11.091+02:00Перевод Стандарта: на распутье...Тут вот какое дело.<div>В последние дни я (в который раз) просмотрел то, что сделал, и пришел к такому неутешительному выводу. Перевод как таковой готов практически полностью - осталось пару-тройку терминов уточнить, да кое-какие стилистические корявости поправить. Работы на неделю. Ну, еще приложения подготовить - еще недели три более-менее спокойной работы. Так что, в принципе, можно (было бы) переходить к к обсуждению технических деталей, связанных с публикацией. Но...</div><div><br /></div><div><b>Комментарии</b>! Проблема в том, что их... не то чтобы мало, но недостаточно для того, чтобы дать всей работе в целом некое новое качество, сделать ее в каком-то смысле уникальной - ну и, конечно, полезной для программистов и вообще всех, так или иначе причастных к разработке программ на Си++.</div><div><br /></div><div>Дело в том, что в одиночку я сейчас никак не тяну написать комментарии в том объеме и качестве, в каком хотелось бы и задумывалось. Коллеги, которые помогали мне в этой работе, по ряду вполне уважительных причин сейчас тоже не в состоянии активно в ней участвовать.</div><div><br /></div><div>Так что сейчас передо мной стоит дилемма: остановить содержательную работу над комментариями и выпускать перевод в том виде, как он есть в данный момент, или... не торопиться и продолжать неспешную работу в расчете на то, что до октября (предполагаемый срок формального опубликования Стандарта Си++) достаточный объем комментариев наберется (но тогда книга выйдет гораздо позже изначально задуманного и, не дай Бог, кто-нибудь опередит :-)).</div><div><br /></div><div>Какой вариант правильный - честно, не знаю. (И немного рассчитываю на "помощь зала" :-)).</div><div><br /></div><div>Есть, правда, еще один вариант, связанный с этой самой "помощью зала"... Что если призвать на помощь добровольцев? Идея может быть такой: те, кто считает себя более-менее сведущим в языке и у кого есть содержательные мысли относительно того или иного языкового свойства, могут поступить так:</div><div><br /></div><div>- Скачать текст предварительного Стандарта.</div><div>- Найти в нем раздел/абзац, относящийся к интересующей теме.</div><div>- Написать к нему комментарий!</div><div>- Прислать его мне. :-)</div><div><br /></div><div>Может, попробовать?</div><div>Если кому-то это предложение покажется интересным, то вот некоторые детали:</div><div><br /></div><div>- Текст предварительного стандарта находится по адресу<br /><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2800.pdf">http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2800.pdf</a></div><div>- Комментарии пишутся по-русски</div><div>- Комментарий должен явно относиться к конкретному абзацу или разделу текста</div><div>- Комментарий должен быть коротким (два-три-четыре абзаца текста), нейтральным по стилистике и нести полезную информацию; при этом допускаются как конкретные соображения ("данное правило введено для того-то и того-то"), так и рассуждения общего характера ("в ранних версиях языка это было по-другому" - и почему изменено).</div><div>- В комментариях могут быть короткие примеры программ, выдержанные в стилистике других примеров, имеющихся в Стандарте.</div><div>- Комментарии могут содержать ссылки на известные публикации, типа книг Страуструпа, Саттера, Александреску, Мейера и т.д., в которых комментируемое свойство объяснено подробнее и понятнее, чем в Стандарте. Допускаются прямые цитаты из подобных источников (разумеется, с указанием этих источников).</div><div>- Присылать свои тексты можно либо в виде комментариев к этому посту (что, между прочим, может способствовать их обсуждению и повышению качества), либо непосредственно на мой электронный адрес из профиля.</div><div><br /></div><div>Со своей стороны, я гарантирую внимательное и доброжелательное рассмотрение всех комментариев без исключения и честную попытку взять из них максимум полезного для целей перевода. В то же время я оставляю за собой право редактирования комментариев, выбора тех вариантов перевода терминов, которые приняты и используются в данном переводе. </div><div><br /></div><div>Кроме того, все добровольцы, чей комментарий (хотя бы один) войдет в окончательный текст, будут упомянуты (если они не будут возражать, конечно) в предисловии. Вдобавок, скажем, трем самым активным комментаторам я буду готов подарить экземпляр книги, когда он выйдет из печати.</div><div><br /></div><div>(Расписался... Начал "заупокой" и в процессе сам увлекся этой идеей. :-))</div><div><br /></div><div>Ну, и последнее. Комментарии принимаются по всему тексту "языковой части" стандарта (<b><span class="Apple-style-span" style="color:#FF0000;">без библиотеки!</span></b>- <b>до главы 16 включительно</b>). Но есть наиболее интересные для меня места, в которых комментариев пока недостаточно:</div><div><br /></div><div>- Лямбда-выражения (раздел 5.1.1) - текст короткий, но важный, и ни одного примера!- вот бы кто-нибудь с "функционально-устроенной головой" высказал свое отношение! :-))</div><div>- Шаблоны в целом (глава 14) и механизм концептов в особенности (разделы 14.9, 14.10)</div><div>- Совместное использования (глава 13)</div><div>- Обработка исключительных ситуаций (глава 15)</div><div><br /></div><div>Вот как-то так. :-)</div><div><br /></div>zouevhttp://www.blogger.com/profile/09163739178551976623noreply@blogger.com12tag:blogger.com,1999:blog-8224163229837394669.post-82588523202366198032009-07-09T13:30:00.005+02:002009-07-16T17:16:17.386+02:00Новое в Си++: концепты<h3 style="margin-top:0cm;margin-right:0cm;margin-bottom:6.0pt;margin-left: 35.4pt"><span lang="EN-US"><span class="Apple-style-span" style=" font-weight: normal; "><span class="Apple-style-span" style="font-size:medium;">Этот текст содержит краткий обзор основных возможностей концептов – нововведения в новый стандарт Си++, позволяющего накладывать ограничения на параметры шаблонов. Показаны преимущества концептов при диагностике ошибок в шаблонах, использование отображений концептов для адаптации конкретных типов к использованию в качестве параметров шаблонов.</span></span></span></h3><h3 style="margin-top:0cm;margin-right:0cm;margin-bottom:6.0pt;margin-left: 35.4pt"><span lang="EN-US"><span class="Apple-style-span" style=" font-weight: normal; "><span class="Apple-style-span"><span><span class="Apple-style-span" style="font-size:medium;">Обзор по моей просьбе написан </span><b><span class="Apple-style-span" style="font-size:medium;">Станиславом Михалковичем</span></b><span class="Apple-style-span" style="font-size:medium;">, доцентом Южного Федерального университета (Ростов-на-Дону), и выкладывается здесь с его любезного разрешения. Я сделал только очень небольшие редакторские правки и добавил немного замечаний (</span><span style="color:blue;"><span class="Apple-style-span" style="font-size:medium;">синим шрифтом</span></span><span class="Apple-style-span" style="font-size:medium;">), иногда эмоционально-окрашенных. </span></span><span style=" font-family:Wingdings;mso-ascii-font-family:"Times New Roman";mso-hansi-font-family: "Times New Roman";mso-char-type:symbol;mso-symbol-font-family:Wingdings;"><span style="font-family:Wingdings;"><span class="Apple-style-span" style="font-size:medium;">J</span></span></span></span></span></span></h3><h3 style="margin-top:0cm;margin-right:0cm;margin-bottom:6.0pt;margin-left: 35.4pt"><span lang="EN-US"><span class="Apple-style-span" style=" font-weight: normal; "><span class="Apple-style-span"><span style=" font-family:Wingdings;mso-ascii-font-family:"Times New Roman";mso-hansi-font-family: "Times New Roman";mso-char-type:symbol;mso-symbol-font-family:Wingdings;"><span style="font-family:Wingdings;"><span class="Apple-style-span" style="font-family:Georgia;"><span style="color:blue;"><span class="Apple-style-span" style="font-size:medium;">В обзор вошли не все аспекты механизма концептов; в частности, ничего не сказано об </span><b><span class="Apple-style-span" style="font-size:medium;">архетипах</span></b><span class="Apple-style-span" style="font-size:medium;"> и </span><b><span class="Apple-style-span" style="font-size:medium;">аксиомах</span></b><span class="Apple-style-span" style="font-size:medium;">. Но не все же сразу. </span></span><span style="font-family:Wingdings; mso-ascii-font-family:"Times New Roman";mso-hansi-font-family:"Times New Roman"; mso-char-type:symbol;mso-symbol-font-family:Wingdings;color:blue;"><span style="font-family:Wingdings;"><span class="Apple-style-span" style="font-size:medium;">J</span></span></span><span style="color:blue;"><span class="Apple-style-span" style="font-size:medium;"> От обсуждений типа «зачем это нужно», «нужно ли вообще» давайте пока воздержимся. В том или ином виде ограничения на параметры шаблона можно задавать почти во всех современных языках, содержащих подобные средства: в Аде, в </span></span><span lang="EN-US" style="color:blue;"><span class="Apple-style-span" style="font-size:medium;">Java</span></span><span style="color:blue;"><span class="Apple-style-span" style="font-size:medium;">/</span></span><span lang="EN-US" style="color:blue;"><span class="Apple-style-span" style="font-size:medium;">C</span></span><span style="color:blue;"><span class="Apple-style-span" style="font-size:medium;">#, в </span></span><span lang="EN-US" style="color:blue;"><span class="Apple-style-span" style="font-size:medium;">Scala</span></span><span style="color:blue;"><span class="Apple-style-span" style="font-size:medium;">.</span></span></span></span></span></span></span></span></h3> <p class="MsoNormal" style="margin-bottom:6.0pt;text-align:justify;text-indent: 36.0pt"><span style="color:blue;"><span class="Apple-style-span" style="font-size:medium;">Итак, </span></span><span><span class="Apple-style-span" style="font-size:medium;">концепты в новом </span></span><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;">C</span></span><span><span class="Apple-style-span" style="font-size:medium;">++ – это средства задания ограничений на параметры шаблонов. Они представляют собой специальным образом оформленный набор объявлений, которые параметр шаблона должен реализовывать.</span><span class="Apple-style-span" style="font-size:medium;"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-bottom:6.0pt;text-align:justify;text-indent: 36.0pt"><span><span class="Apple-style-span" style="font-size:medium;">Рассмотрим вначале пример шаблона стандартного алгоритма </span></span><span lang="EN-US" style="font-family:";"><span class="Apple-style-span" style="font-size:medium;">find</span></span><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"> </span></span><span><span class="Apple-style-span" style="font-size:medium;">без использования концептов:</span><span class="Apple-style-span" style="font-size:medium;"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-top:0cm;margin-right:0cm;margin-bottom:6.0pt; margin-left:35.4pt"><b><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">template</span></span></span></b><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"><</span></span><b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">typename</span></span></b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> Iter, </span></span><b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">typename</span></span></b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> V><br />Iter find(Iter first, Iter last, V v) {<br /></span></span><span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"></span></span></span><b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> while</span></span></b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> (first != last && *first != v)<br /></span></span><span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"></span></span></span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> ++first;<br /></span></span><span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"></span></span></span><b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> return</span></span></b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> first;<br />}</span></span><span class="Apple-style-span" style="font-size:medium;"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-bottom:6.0pt;text-align:justify"><span><span class="Apple-style-span" style="font-size:medium;">Очевидно, что тип </span></span><span lang="EN-US" style="font-family:";"><span class="Apple-style-span" style="font-size:medium;">Iter</span></span><span><span class="Apple-style-span" style="font-size:medium;"> должен удовлетворять следующим условиям:</span><span class="Apple-style-span" style="font-size:medium;"><o:p></o:p></span></span></p> <ol style="margin-top:0cm" start="1" type="1"> <li class="MsoNormal" style="margin-bottom:6.0pt;text-align:justify;mso-list: l0 level1 lfo1;tab-stops:list 36.0pt"><span><span class="Apple-style-span" style="font-size:medium;">Объекты типа </span></span><span lang="EN-US" style="font-family:";"><span class="Apple-style-span" style="font-size:medium;">Iter</span></span><span><span class="Apple-style-span" style="font-size:medium;"> должны быть сравнимы на </span></span><span style="font-family:";"><span class="Apple-style-span" style="font-size:medium;">!=</span></span><span><span class="Apple-style-span" style="font-size:medium;">.</span><span class="Apple-style-span" style="font-size:medium;"><o:p></o:p></span></span></li> <li class="MsoNormal" style="margin-bottom:6.0pt;text-align:justify;mso-list: l0 level1 lfo1;tab-stops:list 36.0pt"><span><span class="Apple-style-span" style="font-size:medium;">К объектам типа </span></span><span lang="EN-US" style="font-family:";"><span class="Apple-style-span" style="font-size:medium;">Iter</span></span><span><span class="Apple-style-span" style="font-size:medium;"> можно применять префиксную операцию </span></span><span lang="EN-US" style="font-family:";"><span class="Apple-style-span" style="font-size:medium;">++</span></span><span><span class="Apple-style-span" style="font-size:medium;">.</span><span class="Apple-style-span" style="font-size:medium;"><o:p></o:p></span></span></li> <li class="MsoNormal" style="margin-bottom:6.0pt;text-align:justify;mso-list: l0 level1 lfo1;tab-stops:list 36.0pt"><span><span class="Apple-style-span" style="font-size:medium;">Объекты типа </span></span><span lang="EN-US" style="font-family:";"><span class="Apple-style-span" style="font-size:medium;">Iter</span></span><span><span class="Apple-style-span" style="font-size:medium;"> можно разыменовывать.</span><span class="Apple-style-span" style="font-size:medium;"><o:p></o:p></span></span></li> </ol> <p class="MsoNormal" style="margin-bottom:6.0pt;text-align:justify"><span><span class="Apple-style-span" style="font-size:medium;">Кроме того, имеется условие, связывающее типы </span></span><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">Iter</span></span></span><span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> </span>и </span></span><span lang="EN-US" style="font-family:";"><span class="Apple-style-span" style="font-size:medium;">V</span></span><span><span class="Apple-style-span" style="font-size:medium;">: </span><span class="Apple-style-span" style="font-size:medium;"><o:p></o:p></span></span></p> <ol style="margin-top:0cm" start="4" type="1"> <li class="MsoNormal" style="margin-bottom:6.0pt;text-align:justify;mso-list: l0 level1 lfo1;tab-stops:list 36.0pt"><span><span class="Apple-style-span" style="font-size:medium;">Разыменованные объекты типа </span></span><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">Iter</span></span></span><span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> </span>можно сравнивать с объектами типа </span></span><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">V</span></span></span><span><span class="Apple-style-span" style="font-size:medium;"> на </span></span><span style="font-family:";"><span class="Apple-style-span" style="font-size:medium;">!=</span></span><span><span class="Apple-style-span" style="font-size:medium;">.</span><span class="Apple-style-span" style="font-size:medium;"><o:p></o:p></span></span></li> </ol> <p class="MsoNormal" style="margin-bottom:6.0pt;text-align:justify;text-indent: 36.0pt"><span><span class="Apple-style-span" style="font-size:medium;">В C++ стандарта 1998/2003 гг. проверка данных условий осуществляется при настройке шаблона. Например, при компиляции вызова<span class="Apple-style-span" style="font-family:'courier new';"> </span></span></span><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">find</span></span></span><span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">(1,5,0)</span></span></span><span><span class="Apple-style-span" style="font-size:medium;"> в результате выведения получим: </span></span><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">Iter</span></span></span><span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">=</span></span></span><b><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">int</span></span></span></b><span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">, </span></span></span><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">V</span></span></span><span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">=</span></span></span><b><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">int</span></span></span></b><span><span class="Apple-style-span" style="font-size:medium;">. При попытке компиляции тела функции </span></span><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">find</span></span></span><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> </span></span></span><span><span class="Apple-style-span" style="font-size:medium;">с указанными типами возникнет ошибка: условие 3 не выполняется. Таким образом, ошибка компиляции возникнет на достаточно позднем этапе – при попытке компиляции тела настроенной версии </span></span><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">find</span></span></span><span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"><</span></span></span><b><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">int</span></span></span></b><span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">,</span></span></span><b><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">int</span></span></span></b><span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">></span></span></span><span><span class="Apple-style-span" style="font-size:medium;">. </span><span style="color:blue;"><span class="Apple-style-span" style="font-size:medium;">На практике это приводит к неадекватным по существу и совершенно безумным по форме диагностическим сообщениям, в которых фигурируют длиннейшие абсолютно нечитаемые имена настроенных шаблонов (в которых уже сделаны подстановки).</span></span><span class="Apple-style-span" style="font-size:medium;"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-bottom:6.0pt;text-align:justify;text-indent: 36.0pt"><span><span class="Apple-style-span" style="font-size:medium;">Рассмотрим теперь версию того же алгоритма </span></span><span lang="EN-US" style="font-family:";"><span class="Apple-style-span" style="font-size:medium;">find</span></span><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"> </span></span><span><span class="Apple-style-span" style="font-size:medium;">с использованием концептов:</span><span class="Apple-style-span" style="font-size:medium;"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-top:0cm;margin-right:0cm;margin-bottom:6.0pt; margin-left:35.4pt"><b><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">template<</span></span></span></b><span lang="EN-US"><inputiterator><span class="Apple-style-span" style="font-size:medium;"><b><span class="Apple-style-span" style="font-family:'courier new';">typename </span></b><span class="Apple-style-span" style="font-family:'courier new';">V><br /></span></span><b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">requires</span></span></b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> EqualityComparable</span></span><iter::value_type,><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"><br />Iter find(Iter first, Iter last, V v) { ... }</span></span><span class="Apple-style-span" style="font-size:medium;"><o:p></o:p></span></iter::value_type,></inputiterator></span></p> <p class="MsoNormal" style="margin-bottom:6.0pt;text-align:justify"><span><span class="Apple-style-span" style="font-size:medium;">Здесь</span></span><span><span class="Apple-style-span" style="font-size:medium;"> </span></span><span><span class="Apple-style-span" style="font-size:medium;">тип</span></span><span><span class="Apple-style-span" style="font-size:medium;"> </span></span><span lang="EN-US" style="font-family:";"><span class="Apple-style-span" style="font-size:medium;">Iter</span></span><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"> </span></span><span><span class="Apple-style-span" style="font-size:medium;">удовлетворяет</span></span><span><span class="Apple-style-span" style="font-size:medium;"> </span></span><span><span class="Apple-style-span" style="font-size:medium;">концепту</span></span><span><span class="Apple-style-span" style="font-size:medium;"> </span></span><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">InputIterator</span></span></span><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;">, </span></span><span><span class="Apple-style-span" style="font-size:medium;">содержащему</span></span><span><span class="Apple-style-span" style="font-size:medium;"> </span></span><span><span class="Apple-style-span" style="font-size:medium;">требования</span></span><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"> 1, 2 </span></span><span><span class="Apple-style-span" style="font-size:medium;">и</span></span><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"> 3, </span></span><span><span class="Apple-style-span" style="font-size:medium;">а</span></span><span><span class="Apple-style-span" style="font-size:medium;"> </span></span><span><span class="Apple-style-span" style="font-size:medium;">также</span></span><span><span class="Apple-style-span" style="font-size:medium;"> </span></span><span><span class="Apple-style-span" style="font-size:medium;">типы</span></span><span><span class="Apple-style-span" style="font-size:medium;"> </span></span><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">Iter::value_type</span></span></span><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"> </span></span><span><span class="Apple-style-span" style="font-size:medium;">и</span></span><span><span class="Apple-style-span" style="font-size:medium;"> </span></span><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">V</span></span></span><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"> </span></span><span><span class="Apple-style-span" style="font-size:medium;">связаны</span></span><span><span class="Apple-style-span" style="font-size:medium;"> </span></span><span><span class="Apple-style-span" style="font-size:medium;">концептом</span></span><span><span class="Apple-style-span" style="font-size:medium;"> </span></span><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">EqualityComparable</span></span></span><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;">, </span></span><span><span class="Apple-style-span" style="font-size:medium;">содержащим</span></span><span><span class="Apple-style-span" style="font-size:medium;"> </span></span><span><span class="Apple-style-span" style="font-size:medium;">требование</span></span><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"> 4. </span></span><span><span class="Apple-style-span" style="font-size:medium;">Теперь при вызове </span></span><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">find(1,5,0)</span></span></span><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"> </span></span><span><span class="Apple-style-span" style="font-size:medium;">компилятор осуществит проверку типов </span></span><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">Iter</span></span></span><span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">=</span></span></span><b><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">int</span></span></span></b><span><span class="Apple-style-span" style="font-size:medium;"> и </span></span><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">V</span></span></span><span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">=</span></span></span><b><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">int</span></span></span></b><span><span class="Apple-style-span" style="font-size:medium;"> на соответствие концептам </span></span><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">InputIterator</span></span></span><span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> </span>и </span></span><span lang="EN-US" style="font-family:";"><span class="Apple-style-span" style="font-size:medium;">EqualityComparable</span></span><span><span class="Apple-style-span" style="font-size:medium;">, и мы получим сообщение об ошибке вида «Тип </span></span><b><span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">int</span></span></span></b><span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> </span>не удовлетворяет концепту </span></span><span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">InputIterator</span></span></span><span><span class="Apple-style-span" style="font-size:medium;">». При этом в отличие от предыдущего примера тело функции </span></span><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">find</span></span></span><span><span class="Apple-style-span" style="font-size:medium;"> не будет компилироваться вообще, т.е. ошибка компиляции обнаружится на более раннем этапе.</span><span class="Apple-style-span" style="font-size:medium;"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-bottom:6.0pt;text-align:justify;text-indent: 36.0pt"><span><span class="Apple-style-span" style="font-size:medium;">Заметим, что условие удовлетворения типов концепту может записываться как в секции </span></span><b><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">requires</span></span></span></b><span><span class="Apple-style-span" style="font-size:medium;">, так и в угловых скобках; в последнем случае ключевое слово </span></span><b><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">typename</span></span></span></b><span><span class="Apple-style-span" style="font-size:medium;"> заменяется на имя концепта, которому должен удовлетворять тип. Задание имени концепта в угловых скобках – более простой способ, он позволяет наложить на тип ограничения одного концепта. Для типов, удовлетворяющих нескольким концептам, а также для концептов, затрагивающих несколько типов, следует использовать вариант с </span></span><b><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">requires</span></span></span></b><span><span class="Apple-style-span" style="font-size:medium;">, разделяя различные требования символом </span></span><span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">&&</span></span></span><span><span class="Apple-style-span" style="font-size:medium;">. Так, последний пример можно записать следующим образом:</span><span class="Apple-style-span" style="font-size:medium;"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-top:0cm;margin-right:0cm;margin-bottom:6.0pt; margin-left:35.4pt"><b><span lang="EN-US" style="font-family:";"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">t</span><span class="Apple-style-span" style="font-family:'courier new';">emplate</span></span></span></b><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"><</span></span><b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">typename</span></span></b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> Iter, </span></span><b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">typename</span></span></b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> V><br /></span></span><b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">requires</span></span></b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> InputIterator</span></span><iter><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> && EqualityComparable</span></span><iter::value_type,><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"><br />Iter find(Iter first, Iter last, V v) { ... }</span></span><span class="Apple-style-span" style="font-size:medium;"><o:p></o:p></span></iter::value_type,></iter></span></p> <p class="MsoNormal" style="margin-bottom:6.0pt;text-align:justify;text-indent: 36.0pt"><span><span class="Apple-style-span" style="font-size:medium;">Концепты позволяют обеспечить раннюю проверку типов не только при настройке шаблона, но и при его описании. Предположим, мы совершили ошибку в теле шаблона, неверно используя операцию </span></span><span lang="EN-US" style="font-family:";"><span class="Apple-style-span" style="font-size:medium;"><</span></span><span><span class="Apple-style-span" style="font-size:medium;">:</span><span class="Apple-style-span" style="font-size:medium;"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-top:0cm;margin-right:0cm;margin-bottom:6.0pt; margin-left:35.4pt"><b><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">template<</span></span></span></b><span lang="EN-US"><inputiterator><span class="Apple-style-span" style="font-size:medium;"><b><span class="Apple-style-span" style="font-family:'courier new';">typename </span></b><span class="Apple-style-span" style="font-family:'courier new';">V><br /></span></span><b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">requires</span></span></b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> EqualityComparable</span></span><iter::value_type,><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"><br />Iter find(Iter first, Iter last, V v) {<br /></span></span><span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"></span></span></span><b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> while</span></span></b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> (first </span></span><b><span style="color:red;"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"><</span></span></span></b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> last && *first != v)<br /></span></span><span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"></span></span></span><span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"></span></span></span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> ++first;<br /></span></span><span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"></span></span></span><b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> return</span></span></b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> first;<br />}</span></span><span class="Apple-style-span" style="font-size:medium;"><o:p></o:p></span></iter::value_type,></inputiterator></span></p> <p class="MsoNormal" style="margin-bottom:6.0pt;text-align:justify"><span><span class="Apple-style-span" style="font-size:medium;">Такое описание </span></span><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">find</span></span></span><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> </span></span></span><span><span class="Apple-style-span" style="font-size:medium;">не позволяет использовать его для списков: в итераторе списка отсутствует операция <span class="Apple-style-span" style="font-family:'courier new';"><</span>. Без использования концептов ошибка будет обнаружена только при попытке компиляции тела настроенного шаблона </span></span><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">find</span></span></span><span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"><</span></span></span><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">list</span></span></span><span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"><</span></span></span><b><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">int</span></span></span></b><span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">>::</span></span></span><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">iterator</span></span></span><span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">,</span></span></span><b><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">int</span></span></span></b><span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">></span></span></span><span><span class="Apple-style-span" style="font-size:medium;">, т.е. на позднем этапе. При использовании концептов ошибка компиляции будет получена при первой компиляции тела шаблона и проверке входящих в него типов на соответствие концептам </span></span><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">InputIterator</span></span></span><span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> </span><span class="Apple-style-span" style="font-family:'courier new';">и </span></span></span><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">EqualityComparable</span></span></span><span><span class="Apple-style-span" style="font-size:medium;">, т.е. на существенно более раннем этапе.</span><span class="Apple-style-span" style="font-size:medium;"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-bottom:6.0pt;text-align:justify;text-indent: 36.0pt"><span><span class="Apple-style-span" style="font-size:medium;">Приведем определение концепта </span></span><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">EqualityComparable</span></span></span><span><span class="Apple-style-span" style="font-size:medium;">:</span><span class="Apple-style-span" style="font-size:medium;"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-top:0cm;margin-right:0cm;margin-bottom:6.0pt; margin-left:35.4pt"><b><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">template</span></span></span></b><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"><</span></span><b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">typename</span></span></b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> T><br /></span></span><b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">concept</span></span></b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> EqualityComparable {<br /></span></span><span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"></span></span></span><b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> bool</span></span></b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> </span></span><b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">operator</span></span></b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">==(T, T);<br /></span></span><span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"></span></span></span><b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> bool</span></span></b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> </span></span><b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">operator</span></span></b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">!=(T, T);<br />}; </span></span><span class="Apple-style-span" style="font-size:medium;"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-bottom:6.0pt;text-align:justify"><span><span class="Apple-style-span" style="font-size:medium;">Оно напоминает определение интерфейса в таких языках программирования как Java и C#. Однако, в </span></span><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;">Java</span></span><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"> </span></span><span><span class="Apple-style-span" style="font-size:medium;">и </span></span><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;">C</span></span><span><span class="Apple-style-span" style="font-size:medium;"># уже при определении типа </span></span><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">T</span></span></span><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"> </span></span><span><span class="Apple-style-span" style="font-size:medium;">надо описать все возможные интерфейсы, которым он удовлетворяет. Концепты позволяют, не затрагивая определение типа </span></span><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">T</span></span></span><span><span class="Apple-style-span" style="font-size:medium;">, наложить на него ограничения позже. Такой способ является значительно более гибким, поскольку невозможно заранее предугадать все требования, накладываемые на тип </span></span><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">T</span></span></span><span><span class="Apple-style-span" style="font-size:medium;"> при его определении. </span><span class="Apple-style-span" style="font-size:medium;"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-bottom:6.0pt;text-align:justify;text-indent: 36.0pt"><span><span class="Apple-style-span" style="font-size:medium;">Функции, определенные внутри концепта, называются </span><i><span class="Apple-style-span" style="font-size:medium;">ассоциированными функциями</span></i><span class="Apple-style-span" style="font-size:medium;">. Так, в предыдущем объявлении </span></span><b><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">bool</span></span></span></b><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> </span></span></span><b><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">operator</span></span></span></b><span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">==(</span></span></span><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">T</span></span></span><span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">, </span></span></span><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">T</span></span></span><span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">)</span></span></span><span><span class="Apple-style-span" style="font-size:medium;"> является ассоциированной функцией. Кроме этого, внутри концепта могут определяться так называемые </span><i><span class="Apple-style-span" style="font-size:medium;">ассоциированные типы</span></i><span class="Apple-style-span" style="font-size:medium;">. Ассоциированные типы, как правило, используются для представления типов параметров и типов возвращаемых значений ассоциированных функций. Например, операция </span></span><b><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">operator</span></span></span></b><span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">*</span></span></span><span><span class="Apple-style-span" style="font-size:medium;">, определенная в концепте </span></span><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">InputIterator</span></span></span><span><span class="Apple-style-span" style="font-size:medium;">, возвращает некий тип </span></span><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">value</span></span></span><span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">_</span></span></span><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">type</span></span></span><span><span class="Apple-style-span" style="font-size:medium;">, который следует определить в концепте </span></span><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">InputIterator</span></span></span><span><span class="Apple-style-span" style="font-size:medium;"> следующим образом:</span><span class="Apple-style-span" style="font-size:medium;"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-top:0cm;margin-right:0cm;margin-bottom:6.0pt; margin-left:35.4pt"><b><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">concept</span></span></span></b><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> InputIterator<</span></span><b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">typename</span></span></b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> Iter> {<br /></span></span><span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"></span></span></span><b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> typename</span></span></b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> value_type;<br /></span></span><span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"></span></span></span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> value_type </span></span><b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">operator</span></span></b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">*(Iter);<br /></span></span><span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"></span></span></span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> ...<br />};</span></span><span class="Apple-style-span" style="font-size:medium;"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-bottom:6.0pt;text-align:justify"><span><span class="Apple-style-span" style="font-size:medium;">Все типы, удовлетворяющие концепту </span></span><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">InputIterator</span></span></span><span><span class="Apple-style-span" style="font-size:medium;">, должны определять тип </span></span><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">InputIterator</span></span></span><span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">::</span></span></span><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">value</span></span></span><span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">_</span></span></span><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">type</span></span></span><span><span class="Apple-style-span" style="font-size:medium;">, а ссылка на этот тип может фигурировать, например, при наложении ограничений в секции </span></span><b><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">requires</span></span></span></b><span><span class="Apple-style-span" style="font-size:medium;">, как в примере с алгоритмом </span></span><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">find</span></span></span><span><span class="Apple-style-span" style="font-size:medium;">:</span><span class="Apple-style-span" style="font-size:medium;"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-bottom:6.0pt;text-align:justify;text-indent: 36.0pt"><b><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">requires</span></span></span></b><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> EqualityComparable</span></span><span class="Apple-style-span" style="font-size:medium;"><iter::value_type,></iter::value_type,></span></span></p> <p class="MsoNormal" style="margin-bottom:6.0pt;text-align:justify;text-indent: 36.0pt"><span><span class="Apple-style-span" style="font-size:medium;">Обычно концепты определяются со служебным словом </span></span><b><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">auto</span></span></span></b><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> </span></span></span><span><span class="Apple-style-span" style="font-size:medium;">(такие концепты называются автоматическими):</span><span class="Apple-style-span" style="font-size:medium;"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-top:0cm;margin-right:0cm;margin-bottom:6.0pt; margin-left:35.4pt"><b><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">auto</span></span></span></b><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> </span></span><b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">template</span></span></b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"><</span></span><b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">typename</span></span></b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> T><br /></span></span><b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">concept</span></span></b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> EqualityComparable {<br /></span></span><span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"></span></span></span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> <b>bool </b></span></span><b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">operator</span></span></b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">==(T, T);<br /></span></span><span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"></span></span></span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> <b>bool </b></span></span><b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">operator</span></span></b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">!=(T, T);<br />}; </span></span><span class="Apple-style-span" style="font-size:medium;"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-bottom:6.0pt;text-align:justify"><span><span class="Apple-style-span" style="font-size:medium;">В этом случае любой тип, имеющий операции </span></span><span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">==</span></span></span><span><span class="Apple-style-span" style="font-size:medium;"> и </span></span><span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">!=</span></span></span><span><span class="Apple-style-span" style="font-size:medium;">, удовлетворяет концепту. В частности, таковыми являются все стандартные числовые типы, тип </span></span><span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">string</span></span></span><span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> </span>и пр. Если концепт определен без служебного слова </span></span><b><span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">auto</span></span></span></b><span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> </span>или если в типе отсутствуют функции или операции с такими именами, то для того, чтобы тип удовлетворял концепту, необходимо объявить для него так называемое </span><i><span class="Apple-style-span" style="font-size:medium;">отображение концепта</span></i><span class="Apple-style-span" style="font-size:medium;"> (</span></span><b><span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">concept_map</span></span></span></b><span><span class="Apple-style-span" style="font-size:medium;">). Отображение концепта для данного типа должно удовлетворять каждой ассоциированной функции и реализовывать каждый ассоциированный тип из концепта. Например, чтобы тип </span><span class="Apple-style-span" style="font-size:medium;"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-top:0cm;margin-right:0cm;margin-bottom:6.0pt; margin-left:36.0pt"><b><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">struct</span></span></span></b><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> Person {<br /></span></span><span><span class="Apple-style-span" style="font-family:'courier new';"><span class="Apple-style-span" style="font-size:medium;"></span></span></span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> string name;<br /></span></span><span><span class="Apple-style-span" style="font-family:'courier new';"><span class="Apple-style-span" style="font-size:medium;"></span></span></span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> int age;<br />};</span></span><span class="Apple-style-span" style="font-size:medium;"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-bottom:6.0pt;text-align:justify"><span><span class="Apple-style-span" style="font-size:medium;">удовлетворял концепту </span></span><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">EqualityComparable</span></span></span><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> </span></span></span><span><span class="Apple-style-span" style="font-size:medium;">в смысле равенства только полей </span></span><span lang="EN-US" style="font-family:";"><span class="Apple-style-span" style="font-size:medium;">name</span></span><span><span class="Apple-style-span" style="font-size:medium;">, необходимо объявить следующее отображение концепта:</span><span class="Apple-style-span" style="font-size:medium;"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-top:0cm;margin-right:0cm;margin-bottom:6.0pt; margin-left:36.0pt"><b><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">concept</span></span></span></b><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">_</span></span><b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">map </span></span></b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">EqualityComparable</span></span><person><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> {<br /></span></span><span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> </span></span></span><b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">bool</span></span></b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> </span></span><b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">operator</span></span></b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">==(</span></span><b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">const</span></span></b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> Person& p1, </span></span><b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">const</span></span></b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> Person& p2)<br /></span></span><span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> </span></span></span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">{ return p1.name == p2.name; }<br /></span></span><span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> </span></span></span><b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">bool</span></span></b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> </span></span><b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">operator</span></span></b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">!=(</span></span><b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">const</span></span></b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> Person& p1, </span></span><b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">const</span></span></b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> Person& p2);<br /></span></span><span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> </span></span></span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">{ </span></span><b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">return</span></span></b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> !(p1 == p2); }<br />};</span></span><span class="Apple-style-span" style="font-size:medium;"><o:p></o:p></span></person></span></p> <p class="MsoNormal" style="margin-bottom:6.0pt;text-align:justify;text-indent: 36.0pt"><span><span class="Apple-style-span" style="font-size:medium;">Чтобы не повторять очевидную реализацию </span></span><b><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">operator</span></span></span></b><span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">!=</span></span></span><span><span class="Apple-style-span" style="font-size:medium;">, в концепте </span></span><span lang="EN-US" style="font-family:";"><span class="Apple-style-span" style="font-size:medium;">EqualityComparable</span></span><span><span class="Apple-style-span" style="font-size:medium;"> следует задать для </span></span><b><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">operator</span></span></span></b><span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">!=</span></span></span><span><span class="Apple-style-span" style="font-size:medium;"> реализацию по умолчанию:</span><span class="Apple-style-span" style="font-size:medium;"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-top:0cm;margin-right:0cm;margin-bottom:6.0pt; margin-left:35.4pt"><b><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">auto</span></span></span></b><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> </span></span></span><b><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">template</span></span></span></b><span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"><</span></span></span><b><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">typename</span></span></span></b><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> </span></span></span><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">T</span></span></span><span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">><br /></span></span></span><b><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">concept</span></span></span></b><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> </span></span></span><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">EqualityComparable</span></span></span><span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> {<br /></span></span><span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"></span></span></span></span><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> <b>bool</b></span></span></span><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"><b> </b></span></span></span><b><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">operator</span></span></span></b><span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">==(</span></span></span><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">T</span></span></span><span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">, </span></span></span><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">T</span></span></span><span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">);<br /></span></span><span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"></span></span></span></span><span lang="FR"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> <b>bool</b></span></span></span><span lang="FR"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"><b> </b></span></span></span><b><span lang="FR"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">operator</span></span></span></b><span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">!=(</span></span></span><span lang="FR"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">T</span></span></span><span lang="FR"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> </span></span></span><span lang="FR"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">t</span></span></span><span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">1, </span></span></span><span lang="FR"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">T</span></span></span><span lang="FR"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> </span></span></span><span lang="FR"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">t</span></span></span><span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">2) { </span></span></span><b><span lang="FR"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">return</span></span></span></b><span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> !(</span></span></span><span lang="FR"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">t</span></span></span><span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">1 == </span></span></span><span lang="FR"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">t</span></span></span><span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">2); }<br />}; </span></span><span class="Apple-style-span" style="font-size:medium;"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-bottom:6.0pt;text-align:justify"><span><span class="Apple-style-span" style="font-size:medium;">В этом случае если объявление операции </span></span><span style="font-family:";"><span class="Apple-style-span" style="font-size:medium;">!=</span></span><span><span class="Apple-style-span" style="font-size:medium;"> в типе или его отображении концепта отсутствует, то берется реализация по умолчанию.</span><span class="Apple-style-span" style="font-size:medium;"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-bottom:6.0pt;text-align:justify;text-indent: 36.0pt"><span><span class="Apple-style-span" style="font-size:medium;">Отображение концепта само может быть шаблонным. Например, чтобы тип </span></span><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">vector</span></span></span><span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"><</span></span></span><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">T</span></span></span><span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">></span></span></span><span><span class="Apple-style-span" style="font-size:medium;"> удовлетворял концепту </span><span class="Apple-style-span" style="font-size:medium;"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-top:0cm;margin-right:0cm;margin-bottom:6.0pt; margin-left:35.4pt"><b><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">concept</span></span></span></b><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> </span></span></span><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">Stack</span></span></span><span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"><</span></span></span><b><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">typename</span></span></span></b><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> </span></span></span><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">X> {<br /></span></span><span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"></span></span></span><b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> typename</span></span></b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> value_type;<br /></span></span><span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"></span></span></span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> <b>void </b>push(X&, value_type);<br /></span></span><span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"></span></span></span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> <b>void </b>pop(X&);<br />};</span></span><span class="Apple-style-span" style="font-size:medium;"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-bottom:6.0pt;text-align:justify"><span><span class="Apple-style-span" style="font-size:medium;">следует</span></span><span><span class="Apple-style-span" style="font-size:medium;"> </span></span><span><span class="Apple-style-span" style="font-size:medium;">определить</span></span><span><span class="Apple-style-span" style="font-size:medium;"> </span></span><span><span class="Apple-style-span" style="font-size:medium;">шаблон</span></span><span><span class="Apple-style-span" style="font-size:medium;"> </span></span><span><span class="Apple-style-span" style="font-size:medium;">отображения</span></span><span><span class="Apple-style-span" style="font-size:medium;"> </span></span><span><span class="Apple-style-span" style="font-size:medium;">концепта</span></span><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-top:0cm;margin-right:0cm;margin-bottom:6.0pt; margin-left:35.4pt"><b><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">template</span></span></span></b><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"><</span></span><b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">typename</span></span></b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> T><br /></span></span><b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">concept</span></span></b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">_</span></span><b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">map</span></span></b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> Stack</span></span><std::vector><t><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> > {<br /></span></span><span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"></span></span></span><b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> typedef</span></span></b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> T value_type;<br /></span></span><span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"></span></span></span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> <b>void </b>push(std::vector</span></span><t><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">& v, </span></span><b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">const</span></span></b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> T& x) { v.push_back(x); }<br /></span></span><span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"></span></span></span><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> <b>void </b>pop(std::vector</span></span><t><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">& v) { v.pop_back(); }<br />};</span></span><span class="Apple-style-span" style="font-size:medium;"><o:p></o:p></span></t></t></t></std::vector></span></p> <p class="MsoNormal" style="margin-bottom:6.0pt;text-align:justify"><span><span class="Apple-style-span" style="font-size:medium;">Обратим внимание, что отображение ассоциированного типа выполняется с помощью директивы </span></span><b><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">typedef</span></span></span></b><span><span class="Apple-style-span" style="font-size:medium;">.</span><span class="Apple-style-span" style="font-size:medium;"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-bottom:6.0pt;text-align:justify;text-indent: 36.0pt"><span><span class="Apple-style-span" style="font-size:medium;">Концепты могут наследоваться (уточняться). Например</span></span><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;">:</span><span class="Apple-style-span" style="font-size:medium;"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-top:0cm;margin-right:0cm;margin-bottom:6.0pt; margin-left:35.4pt"><b><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">concept</span></span></span></b><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> ForwardIterator<</span></span><b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">typename</span></span></b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> Iter> { ... };<br /></span></span><b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">concept</span></span></b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> RandomAccessIterator<</span></span><b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">typename</span></span></b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> Iter>: ForwardIterator<br /></span></span><iter><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> { ... };</span></span><span class="Apple-style-span" style="font-size:medium;"><o:p></o:p></span></iter></span></p> <p class="MsoNormal" style="margin-bottom:6.0pt;text-align:justify"><span><span class="Apple-style-span" style="font-size:medium;">При этом при наличии нескольких совместно используемых версий функции, на типы которой наложены ограничения концептов, выбирается наиболее специализированная версия концепта. Так, при наличии следующих совместно используемых объявлений</span><span class="Apple-style-span" style="font-size:medium;"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-top:0cm;margin-right:0cm;margin-bottom:6.0pt; margin-left:36.0pt"><b><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">template</span></span></span></b><span lang="EN-US"><forwarditerator><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"><br /></span></span><b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">void</span></span></b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> advance(Iter& p, int n) { </span></span><b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">while</span></span></b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> (n--) ++p; }<br /></span></span><b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">template</span></span></b><randomaccessiterator><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"><br /></span></span><b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">void</span></span></b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';"> advance(Iter& p, int n) { p += n; }</span></span><span class="Apple-style-span" style="font-size:medium;"><o:p></o:p></span></randomaccessiterator></forwarditerator></span></p> <p class="MsoNormal" style="margin-bottom:6.0pt;text-align:justify"><span><span class="Apple-style-span" style="font-size:medium;">при вызове</span></span><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-top:0cm;margin-right:0cm;margin-bottom:6.0pt; margin-left:36.0pt"><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">vector<</span></span><b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">int</span></span></b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">> v(10);<br />vector<</span></span><b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">int</span></span></b><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">>::iterator vi = v.begin();<br />advance(vi,5);</span></span><span class="Apple-style-span" style="font-size:medium;"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-bottom:6.0pt;text-align:justify"><span><span class="Apple-style-span" style="font-size:medium;">предпочтение отдается более специализированной версии </span></span><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">advance</span></span></span><span><span class="Apple-style-span" style="font-size:medium;">, в которой тип </span></span><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">Iter</span></span></span><span><span class="Apple-style-span" style="font-size:medium;"> удовлетворяет концепту </span></span><span lang="EN-US"><span class="Apple-style-span" style="font-size:medium;"><span class="Apple-style-span" style="font-family:'courier new';">RandomAccessIterator</span></span></span><span><span class="Apple-style-span" style="font-size:medium;">.</span><span class="Apple-style-span" style="font-size:medium;"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-bottom:6.0pt;text-align:justify;text-indent: 36.0pt"><span style="color:blue;"><span class="Apple-style-span" style="font-size:medium;">В качестве завершения нужно сказать, что концепты – весьма мощное средство, которое по своим возможностям и гибкости явно превосходит аналогичные механизмы в других языках. При том, что идея задания ограничений на параметры шаблонов представляется совершенно ясной, конкретная ее реализация в «новом» Си++, прямо скажем, выглядит весьма непростой, громоздкой и неочевидной. В этом смысле новый механизм идет в русле «философии» Си++: совершенно ясные, мощные и полезные идеи, лежащие в основе концептуального базиса языка, сопровождаются реализацией, которая как будто специально спроектирована так, чтобы программистам и разработчикам компиляторов «жизнь медом не казалась»...</span></span><span style="font-size:10.0pt;"><o:p></o:p></span></p> <p class="MsoNormal" style="margin-bottom:6.0pt;text-align:justify"><span style="font-size:10.0pt;"><o:p> </o:p></span></p>zouevhttp://www.blogger.com/profile/09163739178551976623noreply@blogger.com10tag:blogger.com,1999:blog-8224163229837394669.post-14557127015903909802009-07-09T13:11:00.003+02:002009-07-10T15:30:49.102+02:00Комментированный перевод Стандарта Си++: текущее состояние<p class="MsoNormal">Вот... Давно не писал, много дел было, много всяких событий произошло... Но чтобы не отвлекаться от главного: работа по переводу стандарта очень близка к завершению. Фактически, остаются приложения, которых задумано штук пять (это «собственные» приложения, не те, которые есть в оригинальном тексте). Некоторые из них кажутся довольно трудоемкими (зато подобного для Си++ еще никто, кажется, не делал <span style="font-family:Wingdings;mso-ascii-font-family:"Times New Roman"; mso-hansi-font-family:"Times New Roman";mso-char-type:symbol;mso-symbol-font-family:Wingdings;"><span style="mso-char-type:symbol;mso-symbol-font-family:Wingdings;">J</span></span>).</p> <p class="MsoNormal"><o:p>Ну, а пока – просто для памяти: краткий список основных нововведений в стандарт Си++. Там есть много по мелочам, но эти вроде как наиболее значимые.</o:p></p> <p class="MsoNormal"></p><ul><li><b>Пакеты </b>параметров</li><li><b>Атрибуты </b>сущностей</li><li>Новая семанттика спецификатора <b><span class="Apple-style-span" style="font-family:'courier new';">auto</span></b></li><li><b>Лямбда-выражения</b> (<span lang="EN-US" style="mso-ansi-language: EN-US">closures, </span>«замыкания»)</li><li><b>Концепты </b>для задания ограничений на параметры шаблонов</li><li>Спецификатор <b><span class="Apple-style-span" style="font-family:'courier new';">constexpr</span></b></li><li>Спецификатор <b><span class="Apple-style-span" style="font-family:'courier new';">decltype</span></b></li><li>Спецификатор выравнивания <b><span class="Apple-style-span" style="font-family:'courier new';">alignas</span></b></li><li><b>Литералы</b>, определяемые пользователем</li><li>Делегирование между конструкторами (<b>наследование конструкторов</b>)</li><li>Подставляемые пространства имен (inline namespaces)</li><li><b>Алиасы </b>(псевдонимы) шаблонов</li></ul><p></p> <p class="MsoNormal"><o:p> Может, что-то забыл впопыхах. Если вспомню, добавлю.</o:p></p>zouevhttp://www.blogger.com/profile/09163739178551976623noreply@blogger.com1tag:blogger.com,1999:blog-8224163229837394669.post-66020370809712429852008-11-18T22:38:00.004+01:002008-11-18T22:46:01.567+01:00Интерстрон: ближайшие планыЭтот текст (см. ниже) на днях появится на сайте компании <span class="Apple-style-span" style="font-weight: bold;">Интерстрон</span> (www.interstron.ru). Возможно, он окажется интересен и тем, кто время от времени меня читает. Там, в частности, говорится и о состоянии дел с переводом нового стандарта Си++.<div><br /></div><div><p class="MsoNormal" style="margin-bottom:6.0pt"><span style="font-family:Arial;"><span class="Apple-style-span" style="color: rgb(51, 51, 255);">Коллеги и друзья!</span><span class="Apple-style-span" style="color: rgb(51, 51, 255);"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-bottom:6.0pt"><span style="font-family:Arial;"><span class="Apple-style-span" style="color: rgb(51, 51, 255);">В последнее время в фирме проводилась довольно серьезная «скрытая» работа, связанная с нашим флагманским продуктом – компилятором переднего плана Си++. Эта работа – а она полным ходом продолжается и сейчас – направлена на то, чтобы адекватно и на высоком уровне соответствовать современной и динамичной ситуации в сфере инструментов разработки.</span><span class="Apple-style-span" style="color: rgb(51, 51, 255);"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-bottom:6.0pt"><span style="font-family:Arial;"><span class="Apple-style-span" style="color: rgb(51, 51, 255);">Сейчас пришла пора немного подробнее рассказать о первых результатах наших усилий и о ближайших планах компании. Если говорить в целом, речь идет о достижении существенных новых результатов в таких направлениях:</span><span class="Apple-style-span" style="color: rgb(51, 51, 255);"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-bottom:6.0pt"><span style="font-family:Arial;"><span class="Apple-style-span" style="color: rgb(51, 51, 255);">- Развитие языка Си++ и его реализация<br />- Создание новых инструментов разработки</span><span class="Apple-style-span" style="color: rgb(51, 51, 255);"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-bottom:6.0pt"><span style="font-family:Arial;"><span class="Apple-style-span" style="color: rgb(51, 51, 255);">А теперь чуть подробнее.</span><span class="Apple-style-span" style="color: rgb(51, 51, 255);"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-bottom:6.0pt"><b style="mso-bidi-font-weight: normal"><span style="font-family:Arial;"><span class="Apple-style-span" style="color: rgb(51, 51, 255);">Новый стандарт Си++ и его реализация</span><span class="Apple-style-span" style="color: rgb(51, 51, 255);"><o:p></o:p></span></span></b></p> <p class="MsoNormal" style="margin-bottom:6.0pt"><span style="font-family:Arial;"><span class="Apple-style-span" style="color: rgb(51, 51, 255);">Многие знают, что совсем недавно была опубликована «бета-версия» нового Международного Стандарта Си++ (октябрьский драфт). Формального принятия этого стандарта можно ожидать примерно через полтора года, однако по правилам ISO нынешняя версия уже не должна претерпеть существенных изменений (кроме стилистических и редакторских), так что ее можно рассматривать как практически окончательную.</span><span class="Apple-style-span" style="color: rgb(51, 51, 255);"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-bottom:6.0pt"><span style="font-family:Arial;"><span class="Apple-style-span" style="color: rgb(51, 51, 255);">В новом стандарте – очень много нового. Помимо многочисленных модификаций и уточнений уже имеющихся языковых понятий и конструкций, появилось большое количество совершенно новых механизмов, зачастую меняющих сам взгляд на этот язык. Поддержка функционального стиля программирования, механизм шаблонов с ограничениями, основанный на новом понятии концептов (</span></span><span lang="EN-US" style="mso-ansi-language:EN-US;font-family:Arial;"><span class="Apple-style-span" style="color: rgb(51, 51, 255);">concepts</span></span><span style="font-family:Arial;"><span class="Apple-style-span" style="color: rgb(51, 51, 255);">), наследование конструкторов – только некоторые примеры.</span><span class="Apple-style-span" style="color: rgb(51, 51, 255);"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-bottom:6.0pt"><span style="font-family:Arial;"><span class="Apple-style-span" style="color: rgb(51, 51, 255);">Для компании Интерстрон это означает, что впереди большая работа по приведению компилятора Си++ в соответствие новому стандарту. Эта работа уже началась, и мы надеемся, что наш </span><b style="mso-bidi-font-weight:normal"><span class="Apple-style-span" style="color: rgb(51, 51, 255);">компилятор</span></b><span class="Apple-style-span" style="color: rgb(51, 51, 255);"> будет одним из первых в мире, поддерживающих новый стандарт в полном объеме – так же, как десять лет назад этот компилятор обгонял многие западные реализации по полноте поддержки тогдашнего стандарта 1998 года.</span><span class="Apple-style-span" style="color: rgb(51, 51, 255);"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-bottom:6.0pt"><span style="font-family:Arial;"><span class="Apple-style-span" style="color: rgb(51, 51, 255);">Но это не все. Помимо реализации нового стандарта, мы решили выпустить его </span><b style="mso-bidi-font-weight:normal"><span class="Apple-style-span" style="color: rgb(51, 51, 255);">перевод</span></b><span class="Apple-style-span" style="color: rgb(51, 51, 255);">. Мы считаем, что строгое, полное и недвусмысленное определение языка, каким является стандарт, по своей сути является первичным и наиболее авторитетным источником информации о нем. Конечно, стандарт – это чтение не из легких, но его безусловное достоинство по сравнению с более популярными и неизбежно облегченными описаниями языка состоит в том, что программист при возникновении каких-либо проблем с этим большим и сложным языком может гарантированно найти в стандарте ответ на свои вопросы. </span><span class="Apple-style-span" style="color: rgb(51, 51, 255);"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-bottom:6.0pt"><span style="font-family:Arial;"><span class="Apple-style-span" style="color: rgb(51, 51, 255);">Мы уверены, что если такое «настоящее» определение языка выйдет на родном языке, то оно наверняка будет востребовано большой армией серьезных отечественных разработчиков – да и вообще, всех программистов, говорящих и понимающих по-русски. Пусть даже многие наши специалисты неплохо знают английский и способны читать написанные на нем технические тексты – все равно наличие русского перевода снимет хотя бы часть проблем с чтением и без того очень непростого текста.</span><span class="Apple-style-span" style="color: rgb(51, 51, 255);"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-bottom:6.0pt"><span style="font-family:Arial;"><span class="Apple-style-span" style="color: rgb(51, 51, 255);">Наш перевод мы собираемся снабдить комментариями, которые будут пояснять некоторые не слишком ясно написанные или просто важные моменты определения языка. Идейным вдохновителем и образцом для нас послужил в первую очередь текст книги Страуструпа, который написал такое комментированное описание языка в 1990 году, к началу процесса стандартизации. Для стандарта языка Ада выпущена отдельная книга с обоснованием всего дизайна языка и его конструкций («</span></span><span lang="EN-US" style="mso-ansi-language:EN-US;font-family:Arial;"><span class="Apple-style-span" style="color: rgb(51, 51, 255);">Rationale</span></span><span style="font-family:Arial;"><span class="Apple-style-span" style="color: rgb(51, 51, 255);">»). Похожая книга имеется и для C# (</span></span><span lang="EN-US" style="mso-ansi-language:EN-US;font-family:Arial;"><span class="Apple-style-span" style="color: rgb(51, 51, 255);">C</span></span><span style="font-family:Arial;"><span class="Apple-style-span" style="color: rgb(51, 51, 255);"># </span></span><span lang="EN-US" style=" mso-ansi-language:EN-US;font-family:Arial;"><span class="Apple-style-span" style="color: rgb(51, 51, 255);">Annotated</span></span><span lang="EN-US" style="font-family:Arial;"><span class="Apple-style-span" style="color: rgb(51, 51, 255);"> </span></span><span lang="EN-US" style="mso-ansi-language: EN-US;font-family:Arial;"><span class="Apple-style-span" style="color: rgb(51, 51, 255);">Standard</span></span><span style="font-family:Arial;"><span class="Apple-style-span" style="color: rgb(51, 51, 255);">, </span></span><span lang="EN-US" style="mso-ansi-language:EN-US;font-family:Arial;"><span class="Apple-style-span" style="color: rgb(51, 51, 255);">Morgan</span></span><span lang="EN-US" style="font-family:Arial;"><span class="Apple-style-span" style="color: rgb(51, 51, 255);"> </span></span><span lang="EN-US" style="mso-ansi-language:EN-US;font-family:Arial;"><span class="Apple-style-span" style="color: rgb(51, 51, 255);">Kaufmann</span></span><span style="font-family:Arial;"><span class="Apple-style-span" style="color: rgb(51, 51, 255);">, 2007), так что полезность комментариев подтверждается реальной практикой.</span><span class="Apple-style-span" style="color: rgb(51, 51, 255);"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-bottom:6.0pt"><span style="font-family:Arial;"><span class="Apple-style-span" style="color: rgb(51, 51, 255);">Признаюсь, наши планы подразумевали выпуск не просто перевода, но </span><b style="mso-bidi-font-weight: normal"><span class="Apple-style-span" style="color: rgb(51, 51, 255);">двуязычного</span></b><span class="Apple-style-span" style="color: rgb(51, 51, 255);"> текста: на одной стороне книжного разворота – оригинальный текст, на другой – соответствующий перевод. Такой формат был бы оптимальным для многих категорий читателей и специалистов. К сожалению, по некоторым причинам юридического характера мы лишены такой возможности и вынуждены публиковать только русский перевод.</span><span class="Apple-style-span" style="color: rgb(51, 51, 255);"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-bottom:6.0pt"><span style="font-family:Arial;"><span class="Apple-style-span" style="color: rgb(51, 51, 255);">Помимо выпуска печатной версии перевода, мы обсуждаем перспективы и online-версии текста. Идея заключается в том, чтобы программист, зайдя на наш сайт, немедленно получил бы в свое распоряжение гипертекстовую версию перевода, со всем необходимым справочным аппаратом, включая примеры, комментарии и ссылки на соответствующие места оригинального текста.</span><span class="Apple-style-span" style="color: rgb(51, 51, 255);"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-bottom:6.0pt"><b style="mso-bidi-font-weight: normal"><span style="font-family:Arial;"><span class="Apple-style-span" style="color: rgb(51, 51, 255);">Новые инструменты проектирования и разработки</span><span class="Apple-style-span" style="color: rgb(51, 51, 255);"><o:p></o:p></span></span></b></p> <p class="MsoNormal" style="margin-bottom:6.0pt"><span style="font-family:Arial;"><span class="Apple-style-span" style="color: rgb(51, 51, 255);">Компании Интерстрон уже больше десяти лет, и мы не новички в области создания сложных инструментов и систем разработки. Попробуем кратко объяснить наше видение современных потребностей разработчиков – как отдельных программистов, так и их коллективов.</span><span class="Apple-style-span" style="color: rgb(51, 51, 255);"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-bottom:6.0pt"><span style="font-family:Arial;"><span class="Apple-style-span" style="color: rgb(51, 51, 255);">Средства разработки программ за последние годы проделали существенную эволюцию и сейчас представляют собой, как правило, весьма мощные и развитые комплексы, позволяющие создавать высокоэффективные программы. Попросту говоря, создатели компиляторов и систем программирования научились уверенно разбирать сложный синтаксис современных языков и генерировать качественный код; более того, можно сказать, что создание компиляторов из некоторой «магической» деятельности, требующей высочайшей программистской квалификации и владения теорией, доступной немногим «избранным», превратилось в обычную программистскую работу, вполне сравнимую по сложности с созданием, например, графических редакторов или систем распределенной обработки информации.</span><span class="Apple-style-span" style="color: rgb(51, 51, 255);"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-bottom:6.0pt"><span style="font-family:Arial;"><span class="Apple-style-span" style="color: rgb(51, 51, 255);">Однако и объективные потребности индустрии ПО претерпели к настоящему времени определенную эволюцию. Теперь «просто компиляторов» или даже мощных сред программирования в традиционном понимании явно недостаточно. Центр внимания смещается от средств генерации качественного кода к многофункциональным системам, реализующим широкий спектр самых разных операций над программами, и в этом спектре генерация кода – далеко не единственный и иногда даже не самый важный аспект.</span><span class="Apple-style-span" style="color: rgb(51, 51, 255);"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-bottom:6.0pt"><span style="font-family:Arial;"><span class="Apple-style-span" style="color: rgb(51, 51, 255);">Можно сказать, что научившись генерировать хороший код, индустрия пока еще не достигла сравнимого прогресса в сфере </span><i style="mso-bidi-font-style:normal"><span class="Apple-style-span" style="color: rgb(51, 51, 255);">понимания</span></i><span class="Apple-style-span" style="color: rgb(51, 51, 255);"> программ – как создаваемых, так и уже существующих. Налицо явный дефицит доступных, мощных и вместе с тем удобных в работе средств моделирования, систем статического анализа программ различной направленности (поиск потенциальных ошибок, оценка сложности ПО и т.д.), систем прямого и обратного инжиниринга, генерации тестовых покрытий с заданной степенью полноты, рефакторинга и подобных им.</span><span class="Apple-style-span" style="color: rgb(51, 51, 255);"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-bottom:6.0pt"><span style="font-family:Arial;"><span class="Apple-style-span" style="color: rgb(51, 51, 255);">И вот в этой сравнительно новой области у компании достаточно выигрышные и перспективные позиции. Дело в том, что ядро наших средств разработки – компилятор переднего плана Си++ – обладает уникальными свойствами, основное из которых – наличие развитого семантического представления с мощным и удобным программным интерфейсом (</span></span><span lang="EN-US" style="mso-ansi-language: EN-US;font-family:Arial;"><span class="Apple-style-span" style="color: rgb(51, 51, 255);">API</span></span><span style="font-family:Arial;"><span class="Apple-style-span" style="color: rgb(51, 51, 255);">). Существо дела заключается в том, что семантическое представление Интерстрона содержит всю информацию из исходной программы, необходимую практически для любых манипуляций с ней. Можно сказать, что это та же исходная программа, но представленная в регулярном единообразном виде (с выявленной скрытой семантикой, полностью разрешенными именами и явно представленными структурными отношениями между программными сущностями), удобном для создания на ее основе того самого широкого спектра операций, потребность в которых ощущаются все более отчетливо.</span><span class="Apple-style-span" style="color: rgb(51, 51, 255);"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-bottom:6.0pt"><span style="font-family:Arial;"><span class="Apple-style-span" style="color: rgb(51, 51, 255);">До недавнего времени – скажем откровенно – эти возможности компилятора использовались далеко не полностью. Потребности индустрии диктовали спрос на традиционные системы программирования с генерацией кода для различных процессоров специального назначения, и мы делали (и делаем) такие системы для отечественных и зарубежных производителей аппаратных средств. В таких системах заказчику, как правило, необходим «обычный» качественный и надежный компилятор, дополненный удобной средой со стандартным набором средств (визуальный редактор, отладчик, учитывающий специфику процессора, и т.п.).</span><span class="Apple-style-span" style="color: rgb(51, 51, 255);"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-bottom:6.0pt"><span style="font-family:Arial;"><span class="Apple-style-span" style="color: rgb(51, 51, 255);">И вот сейчас, наряду с описанной сферой нашей деятельности, мы собираемся открыть новое для нас стратегическое направление, направленное на создание серии </span><b style="mso-bidi-font-weight:normal"><span class="Apple-style-span" style="color: rgb(51, 51, 255);">инструментов моделирования, анализа и синтеза программ</span></b><span class="Apple-style-span" style="color: rgb(51, 51, 255);">. Ядром всех этих инструментов будет служить наш компилятор, стабильность, надежность и высокое качество которого гарантирует десятилетний опыт его практического использования. Профильная функциональность продуктов будет реализована на основе использования семантического представления, порождаемого компилятором. При этом сам компилятор будет упрятан глубоко «под капот» этих продуктов, так что пользователю будет «видна» только нужная ему функциональность, и ему не придется даже гадать о том, что находится внутри инструмента…</span><span class="Apple-style-span" style="color: rgb(51, 51, 255);"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-bottom:6.0pt"><span style="font-family:Arial;"><span class="Apple-style-span" style="color: rgb(51, 51, 255);">Первым продуктом из этой серии будет инструмент моделирования и инжиниринга программ, реализующий широкое подмножество графической нотации UML и использующий Си++ в качестве входного и целевого языка. Рабочее название инструмента – </span><b style="mso-bidi-font-weight:normal"><span class="Apple-style-span" style="color: rgb(51, 51, 255);">Визуализатор</span></b><span class="Apple-style-span" style="color: rgb(51, 51, 255);">, однако собственно «визуализация» программ, то есть представление их в наглядном структурном виде – только очень небольшая часть его функциональных возможностей. Если говорить коротко, то этот продукт обеспечивает достаточно полный спектр типичных операций по моделированию ПО согласно методике, поддерживаемой графическим языком UML (</span></span><span lang="EN-US" style="mso-ansi-language:EN-US;font-family:Arial;"><span class="Apple-style-span" style="color: rgb(51, 51, 255);">Unified</span></span><span lang="EN-US" style="font-family:Arial;"><span class="Apple-style-span" style="color: rgb(51, 51, 255);"> </span></span><span lang="EN-US" style="mso-ansi-language:EN-US;font-family:Arial;"><span class="Apple-style-span" style="color: rgb(51, 51, 255);">Modeling</span></span><span lang="EN-US" style="font-family:Arial;"><span class="Apple-style-span" style="color: rgb(51, 51, 255);"> </span></span><span lang="EN-US" style=" mso-ansi-language:EN-US;font-family:Arial;"><span class="Apple-style-span" style="color: rgb(51, 51, 255);">Language</span></span><span style="font-family:Arial;"><span class="Apple-style-span" style="color: rgb(51, 51, 255);">). К числу таких операций относятся обратный и прямой инжиниринг, а также средства документирования и визуализации. Язык UML, реализованный в продукте, соответствует последней на настоящий момент версии 2.1.</span><span class="Apple-style-span" style="color: rgb(51, 51, 255);"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-bottom:6.0pt"><span style="font-family:Arial;"><span class="Apple-style-span" style="color: rgb(51, 51, 255);">Конечно, наш Визуализатор – не первая система подобной направленности. Хорошо известны, в частности, изделия фирмы Ration</span></span><span lang="EN-US" style="mso-ansi-language:EN-US;font-family:Arial;"><span class="Apple-style-span" style="color: rgb(51, 51, 255);">a</span></span><span style="font-family:Arial;"><span class="Apple-style-span" style="color: rgb(51, 51, 255);">l Rose, которые реализуют сходную функциональность. Однако, мы уверены, что наш продукт будет выгодно отличаться от изделий уважаемых конкурентов – прежде всего, более низким «порогом вхождения», обусловленным его удачным дизайном, простотой и русскоязычностью. Кроме того, он будет попросту существенно дешевле.</span><span class="Apple-style-span" style="color: rgb(51, 51, 255);"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-bottom:6.0pt"><span style="font-family:Arial;"><span class="Apple-style-span" style="color: rgb(51, 51, 255);">Визуализатор – отдельный «коробочный» продукт, который, как мы надеемся, будет интересен и полезен как разработчикам, так и всем, изучающим программирование и моделирование ПО. Однако мы не собираемся ограничиваться выпуском отдельного инструмента. В наших планах – создание мощной среды проектирования программ, которая будет включать большой ассортимент операций, поддерживающих все этапы жизненного цикла ПО. В этой системе, ориентированной прежде всего на платформу Intel, будет и наш компилятор, и полная поддержка UML, и много других полезных свойств.</span><span class="Apple-style-span" style="color: rgb(51, 51, 255);"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-bottom:6.0pt"><span style="font-family:Arial;"><span class="Apple-style-span" style="color: rgb(51, 51, 255);">Но и это еще не все. Мы хорошо понимаем, что несмотря на несомненную востребованность подобных систем, практическая работа с ней может вызвать трудности ввиду отсутствия у потенциальных пользователей соответствующего опыта. Чтобы преодолеть эту проблему для нашего Визуализатора, мы решили предварить его выход на рынок выпуском </span><b style="mso-bidi-font-weight:normal"><span class="Apple-style-span" style="color: rgb(51, 51, 255);">книги</span></b><span class="Apple-style-span" style="color: rgb(51, 51, 255);">, которая будет служить одновременно и введением в тему, и практическим руководством по использованию продукта. Предварительное название книги - </span><span class="apple-style-span"><b><span class="Apple-style-span" style="color: rgb(51, 51, 255);">Простое введение в Си++ и UML: пособие по практическому освоению</span></b></span><span class="Apple-style-span" style="color: rgb(51, 51, 255);">.</span><span class="Apple-style-span" style="color: rgb(51, 51, 255);"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-bottom:6.0pt"><span style="font-family:Arial;"><span class="Apple-style-span" style="color: rgb(51, 51, 255);">Книга рассчитана на тех, кто хотя бы немного знаком с Си++ и хочет освоить принципы и методы работы с UML. Во второй части книги будут детально описаны последовательности шагов типичных операций моделирования, реализованных в нашем продукте. Вообще, мы стараемся писать эту книгу очень простым и ясным языком, сознательно оставляя за ее рамками некоторые сложные аспекты языка Си++ и нотации UML.</span><span class="Apple-style-span" style="color: rgb(51, 51, 255);"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-bottom:6.0pt"><span style="font-family:Arial;"><span class="Apple-style-span" style="color: rgb(51, 51, 255);">Ориентировочный срок выпуска книги и Визуализатора – <span class="Apple-style-span" style="font-weight: bold;">весна-лето будущего года</span>.</span><span class="Apple-style-span" style="color: rgb(51, 51, 255);"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-bottom:6.0pt"><span style="font-family:Arial;"><span class="Apple-style-span" style="color: rgb(51, 51, 255);">В заключение нужно сказать, что в планах компании – ряд других языко-ориентированных инструментов, а также еще более амбициозные и нестандартные проекты.</span><span class="Apple-style-span" style="color: rgb(51, 51, 255);"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-bottom:6.0pt"><span style="font-family:Arial;"><span class="Apple-style-span" style="color: rgb(51, 51, 255);">Следите за новостями!</span><span class="Apple-style-span" style="color: rgb(51, 51, 255);"><o:p></o:p></span></span></p> <p class="MsoNormal"><span style="font-family:Arial;"><o:p><span class="Apple-style-span" style="color: rgb(51, 51, 255);"> </span></o:p></span></p></div>zouevhttp://www.blogger.com/profile/09163739178551976623noreply@blogger.com10tag:blogger.com,1999:blog-8224163229837394669.post-30958274406179441882008-11-01T01:50:00.007+01:002008-11-01T02:02:17.003+01:00Стандарт С++0x: финальная фаза<span class="Apple-style-span" style=" ;font-family:'times new roman';"><span class="Apple-style-span" style="font-size:large;">Внизу текст сообщения из OpenNET (</span><a href="http://www.opennet.ru/opennews/art.shtml?num=18665"><span class="Apple-style-span" style="font-size:large;">прямая ссылка</span></a><span class="Apple-style-span" style="font-size:large;">).</span></span><div><span class="Apple-style-span" style="font-family:'times new roman';"><span class="Apple-style-span" style="font-size:large;">От себя добавлю: скачав октябрьский драфт (сентябрьский пропустил, каюсь), скорее побежал смотреть главу 14.</span></span></div><div><span class="Apple-style-span" style="font-family:'times new roman';"><span class="Apple-style-span" style="font-size:large;">И вот: </span><span class="Apple-style-span" style="font-weight: bold; "><span class="Apple-style-span" style="font-size:large;">концепты появились!</span></span></span></div><div><span class="Apple-style-span" style="font-family:'times new roman';"><br /></span></div><div><span class="Apple-style-span" style="font-family:'times new roman';"><br /></span><div><span class="Apple-style-span" style=" ;font-family:'times new roman';"><table border="0" cellspacing="0" cellpadding="5" bg="" width="100%" style="color:#E9EAD6;"><tbody><tr bg="" style="color:#C7CBB1;"><td width="100%" style=" ;font-size:12pt;"><b><span style="color:#3399FF;">30.10.2008 19:45</span> <span id="r_title"><a href="http://herbsutter.wordpress.com/2008/10/28/september-2008-iso-c-standards-meeting-the-draft-has-landed-and-a-new-convener/" style="text-decoration: none; color: rgb(0, 0, 173); ">Принятие стандарта языка C++0x вошло в финальную фазу</a></span></b></td></tr><tr bgcolor="#E9EAD6"><td style="font-size: 12pt; "></td></tr><tr valign="top"><td class="chtext" bg="" id="r_memo" style=" padding-right: 5px; text-align: justify; text-indent: 10px; font-size:12pt;color:E9EAD6;"><p><span class="Apple-style-span" style="color: rgb(51, 51, 255);">На очередной сессии комитета ISO по C++, проходившей в Сан-Франциско с 15 по 20 сентября, на общем голосовании был принят проект стандарта языка программирования C++0x. По </span><a href="http://herbsutter.wordpress.com/2008/10/28/september-2008-iso-c-standards-meeting-the-draft-has-landed-and-a-new-convener/" style="text-decoration: none; "><span class="Apple-style-span" style="color: rgb(51, 51, 255);">словам</span></a><span class="Apple-style-span" style="color: rgb(51, 51, 255);"> Герба Саттера, председательствовавшего на заседании, результат голосования был достаточно предсказуем - финальная редакция документа практически ни чем не отличается от его сентябрьской рабочей копии.</span></p><p><span class="Apple-style-span" style="color: rgb(51, 51, 255);">Перед окончательным принятием C++0x в качестве официального стандарта ISO должно пройти еще два раунда согласований в национальных комитетах. На первом этапе, который уже начался, национальные комитеты должны изложить свои комментарии по поводу полученного проекта и подать необходимые усовершенствования. Следующий этап, который начнется приблизительно через год, будет нацелен на исправление неточностей формулировок и общего стиля документа. Внесение кардинальных изменений по сути принимаемого стандарта на этом этапе не предусматривается. Текущую стадию документа можно рассматривать как функционально законченную бета-версию. </span></p></td></tr></tbody></table></span><br /></div></div>zouevhttp://www.blogger.com/profile/09163739178551976623noreply@blogger.com4tag:blogger.com,1999:blog-8224163229837394669.post-69754078675788269312008-09-07T19:38:00.007+02:002008-09-07T23:20:34.177+02:00Семантическое представление: ответ Анониму<span class="Apple-style-span" style="color: rgb(51, 51, 51); font-size: 13px; line-height: 20px; "><div>Уважаемый Аноним, спасибо за развернутый комментарий.</div><div>Только "спорить"-то не о чем - у нас ведь не спор, а дискуссия...</div><div>Вот мои соображения в ответ на Ваши (писать их в виде комментария неудобно, лучше уж новый пост сделать).</div><div><br /></div><span class="Apple-style-span" style="color: rgb(51, 51, 255);">На мой взгляд, то, что писал Страуструп в "Дизайне и эволюции", в значительной степени сделано во многих компиляторах и средах программирования для различных языков. Писал-то он давно.</span></span><div><span class="Apple-style-span" style="color: rgb(51, 51, 255); font-size: 13px; line-height: 20px;"><br /></span></div><div><span class="Apple-style-span" style="color: rgb(51, 51, 51); font-size: 13px; line-height: 20px; "><span class="Apple-style-span" style="color: rgb(51, 51, 255);"><span class="Apple-style-span" style="color: rgb(0, 0, 0);">В том-то и дело, что практически ничего из предложенного не сделано!- потому и мой пост. Ну, если что-то и сделано (см. ниже), то частично и - самое главное - для несколько иных целей, нежели кажутся мне действительно актуальными.</span><br /><br />Ну действительно, Intellisense есть и в Visual Studio, и в Java-средах программированя, и в Dephi - да где только нет... </span></span></div><div><span class="Apple-style-span" style="color: rgb(51, 51, 255); font-size: 13px; line-height: 20px;"><br /></span></div><div><span class="Apple-style-span" style="font-size: 13px; line-height: 20px; ">Какие-то средства более продвинутого "понимания" семантики программ, конечно, есть, никто с этим не спорит, и Intellisense - замечательная вещь, которая реально помогает при программировании. Но подобные механизмы, сколь они ни будь удобными, носят частичный характер, то есть служат отдельным конкретным целям. Возьмите вопросы о программе, ответы на которые Страуструп хотел бы получить (первый абзац того раздела, который я цитировал в предыдущем постинге),- никакой Intellisense не в состоянии на них ответить, он просто для этого не предназначен. А количество подобных вопросов можно в разы и десятки раз умножить. Причем, уверяю Вас, эти вопросы - не праздные, а наоборот, крайне актуальные, они возникают в большом количестве в реальных и важных случаях. </span></div><div><span class="Apple-style-span" style="font-size: 13px; line-height: 20px;"><br /></span></div><div><span class="Apple-style-span" style="font-size: 13px; line-height: 20px; ">Мне уже приходилось как-то писать, что разработчики компиляторов за двадцать последних лет научились генерировать выполняемый код приличного (часто - очень хорошего) качества. Так что компиляция в "узком" смысле - как генерация кода - в целом уже перестала быть актуальной задачей (исключения бывают, конечно, я говорю о тенденции). С другой стороны, весьма актуальные проблемы, связанные с <span class="Apple-style-span" style="font-weight: bold;">пониманием</span> программ - их устройства, их сильных и слабых сторон, потенциальных проблем, скрытых дефектов (в частности, пресловутых "закладок"), возможностей и направлений их развития - если и решаются, но явно недостаточными темпами. </span></div><div><br /></div><div><span class="Apple-style-span" style="color: rgb(51, 51, 51); font-size: 13px; line-height: 20px; "><span class="Apple-style-span" style="color: rgb(51, 51, 255);">Откуда берется эта информация? По моим понятиям, из некоторой формы внутреннего представления.</span></span></div><div><span class="Apple-style-span" style="color: rgb(51, 51, 255); font-size: 13px; line-height: 20px;"><br /></span></div><div><span class="Apple-style-span" style="color: rgb(51, 51, 51); font-size: 13px; line-height: 20px; "><span class="Apple-style-span" style="color: rgb(51, 51, 255);"><span class="Apple-style-span" style="color: rgb(0, 0, 0);">А тут и гадать не надо: код, генерируемый для .NET, по определению несет в себе метаданные - некоторую информацию об исходной программе, которой и пользуется Intellisense. Более того, доступ к этой информаици можно производить кому угодно (программным путем) - из самой программы, из другой программы...</span><br /><br />Внутреннее семантическое представление есть во всех компиляторах. </span></span></div><div><span class="Apple-style-span" style="color: rgb(51, 51, 255); font-size: 13px; line-height: 20px;"><br /></span></div><div><span class="Apple-style-span" style="font-size: 13px; line-height: 20px; ">Это конечно, так, и на первый взгляд выглядит очевидным: внутренние таблицы компилятора, синтаксическое дерево программы - можно считать тем самым семантическим представлением. Однако чуть более глубокий взгляд на ситуацию говорит, что не все так просто. Во-первых, эта информация - сугубо внутренняя, она недоступна извне. Во-вторых, эта информация предназначена исключительно для нужд компилятора (а именно, для контроля ошибок и генерации кода) и потому не слишком удобна для любых менее "стандартных" операций. В-третьих, зачастую эти внутренние структуры данных просто невозможно использовать, так как они практически никогда не существуют как единое целое. Например, внутреннее представление компилятора С++ из Visual Studio создается по частям (для отдельных функций, например) и по частям же удаляется (после генерации кода для это функции). Проделать какую-либо содержательную процедуру, связанную с глобальным анализом программы, пользуясь таким фрагментарным представлением, невозможно. В-четвертых, даже если авторы компилятора дают возможность доступиться к внутренним структурам (например, Ада-компилятор GNAT может сбросить целиком дерево программы на файл), они принципиально не дают никакой гарантии, что в следующей версии формат этого дерева не изменится...</span></div><div><span class="Apple-style-span" style="color: rgb(51, 51, 255); font-size: 13px; line-height: 20px;"><br /></span></div><div><span class="Apple-style-span" style="color: rgb(51, 51, 51); font-size: 13px; line-height: 20px; "><span class="Apple-style-span" style="color: rgb(51, 51, 255);">Многие системы используют единое внутреннее представление для нескольких языков (на ум приходят Visual Works и gcc, есть и в VS наверняка).</span></span></div><div><span class="Apple-style-span" style="color: rgb(51, 51, 255); font-size: 13px; line-height: 20px;"><br /></span></div><div><span class="Apple-style-span" style="font-size: 13px; line-height: 20px; ">С промежуточным представлением gcc большие проблемы. Фактически, это низкоуровневая структура данных (к тому же, говорят, плохо задокументированная), "заточенная" только и исключительно на генерацию кода для различных платформ. В этом представлении не осталось практически ничего от семантики исходной программы, поэтому воспользоваться им для содержательного анализа невозможно.</span></div><div><span class="Apple-style-span" style="font-size: 13px; line-height: 20px;"><br /></span></div><div><span class="Apple-style-span" style="font-size: 13px; line-height: 20px;">У VS нет единого внутреннего представления. Все языки, представленные в VS, создавались в различных условиях, с разными задачами, в разное время и различными командами. Вообще, VS скрывает в себе немало неожиданностей. Например, там, как говорят инсайдеры, на самом деле <span class="Apple-style-span" style="font-style: italic;">два</span> компилятора C# - один обычный, подобный тому, который из командной строки (он запускается по команде Build), а второй - "умный", который находит синтаксические ошибки на лету (в процессе наборра программы в редакторе) и обеспечивает Intellisense. Компилятор VB - один на все виды работ. Что касается плюсового компилятора, то с ним вообще непонятно. Он совсем старый, подкрученный на "живую нитку". Говорят, они собираются его капитально переделывать (якобы, уже начали...)</span></div><div><span class="Apple-style-span" style="color: rgb(51, 51, 255); font-size: 13px; line-height: 20px;"><br /></span></div><div><span class="Apple-style-span" style="color: rgb(51, 51, 51); font-size: 13px; line-height: 20px; "><span class="Apple-style-span" style="color: rgb(51, 51, 255);"> Только оно у коммерческих фирм либо закрыто вовсе, либо продается за отдельные деньги. Кстати, Интерстрон тоже небесплатно его предлагает.</span></span></div><div><span class="Apple-style-span" style="color: rgb(51, 51, 255); font-size: 13px; line-height: 20px;"><br /></span></div><div><span class="Apple-style-span" style="font-size: 13px; line-height: 20px; ">Честно говоря, вопросы "свободно/за деньги" мне параллельны, поскольку они не имеют отношения к тому, что мы обсуждаем. Интерес представляет проблемы, связанные собственно с разработкой и реализацией семантического представления, а не с тем, как оно распространяется. Вот сделаем, тогда и решать будем. :-)</span></div><div><span class="Apple-style-span" style="color: rgb(51, 51, 255); font-size: 13px; line-height: 20px;"><br /></span></div><div><span class="Apple-style-span" style="color: rgb(51, 51, 51); font-size: 13px; line-height: 20px; "><span class="Apple-style-span" style="color: rgb(51, 51, 255);"> Понятно, что из семантического представления можно "выуживать" практически все факты о программе программным же образом, а не только те, которые предоставляются средой. </span></span></div><div><span class="Apple-style-span" style="color: rgb(51, 51, 255); font-size: 13px; line-height: 20px;"><br /></span></div><div><span class="Apple-style-span" style="font-size: 13px; line-height: 20px; ">Суть в том, чтобы не "выуживать" из семантического представления нужную информацию, а спроектировать это представление таким образом, чтобы эта информация извлекалась оттуда достаточно просто, очевидным и единообразным способом.</span></div><div><span class="Apple-style-span" style="color: rgb(51, 51, 255); font-size: 13px; line-height: 20px;"><br /></span></div><div><span class="Apple-style-span" style="color: rgb(51, 51, 51); font-size: 13px; line-height: 20px; "><span class="Apple-style-span" style="color: rgb(51, 51, 255);">То есть, непонятно, что нового - в использовании какого-то особого внутреннего представления C++.</span></span></div><div><span class="Apple-style-span" style="color: rgb(51, 51, 255); font-size: 13px; line-height: 20px;"><br /></span></div><div><span class="Apple-style-span" style="color: rgb(51, 51, 51); font-size: 13px; line-height: 20px; "><span class="Apple-style-span" style="color: rgb(51, 51, 255);"><span class="Apple-style-span" style="color: rgb(0, 0, 0);">Новое заключается в том, чтобы придумать целостное, полное, независимое от конкретного компилятора представление семантики языка Си++, а также программный интерфейс к такому представлению, и, конечно, реализовать этот интерфейс. <span class="Apple-style-span" style="font-weight: bold;">Этого до сих пор никто не сделал</span>, хотя пара проектов с подобными целями известна (но они либо умерли лет пять назад, либо несколько "сменили ориентацию" в пользу более простых задач). Правда, можно двигаться несколько другим путем: начать с того, чтобы специфицировать интерфейс доступа к семантическому представлению, а потом заниматься реализацией этого интерфейса. Именно так сделано в Ада-мире: был принят стандарт на интерфейс доступа к Ада-программам - ASIS (Ada Semantic Interface Specification), и он был реализован для нескольких Ада-компиляторов.</span><br /><br />Дальше. Представим себе, что сем. представление есть, и его все могут использовать. Какие варианты использования для "реальной жизни" можно предложить? Мне кажется, их не так много. Ну, визуализация, ну, создание метрик программы. Из неперечисленных - рефакторинг (от замены имени с последующей реконструкцией кода до реорганизации кусков кода). Распараллеливание - наверное (это наверняка делается). Для C++ представляется важным использовать семантическое представление для хранения кода шаблонов с последующим инстанцированием - а то - безобразие - все хдранить в заголовочном файле и парсить каждый раз. Но о стандартах - не договорятся...</span></span></div><div><span class="Apple-style-span" style="color: rgb(51, 51, 255); font-size: 13px; line-height: 20px;"><br /></span></div><div><span class="Apple-style-span" style="color: rgb(51, 51, 51); font-size: 13px; line-height: 20px; "><span class="Apple-style-span" style="color: rgb(51, 51, 255);"><span class="Apple-style-span" style="color: rgb(0, 0, 0);">Уверяю Вас, реальных и насущных задач подобного рода очень много - даже в России, не говоря об остальном мире. Есть насущная потребность в разного рода анализе исходных кодов громадных программ. Да и актуальность даже тех задач, которые вы перечислили (добавьте еще оптимизацию), будучи помноженной на гигантские размеры иных программ, дает весьма высокую потребность в программах анализа. Тривиальный проимер. Несколько лет назад Боинг был, якобы, крайне заинтересован (и готов был платить большие деньги) в том, чтобы кто-то проанализировал сотни миллионов строк их авиационного софта на предмет (всего лишь!) "мертвого" кода.</span></span></span></div><div><span class="Apple-style-span" style="color: rgb(51, 51, 51); font-size: 13px; line-height: 20px; "><span class="Apple-style-span" style="color: rgb(51, 51, 255);"><br />По поводу линковки по семантическому представлению. Идея для C++ - правильная и хорошая. Только - его основные проблемы - отсутствие толковой метаинформации в откомпилированных модулях, да и отсутствие приличной модульности вообще.</span></span></div><div><span class="Apple-style-span" style="color: rgb(51, 51, 255); font-size: 13px; line-height: 20px;"><br /></span></div><div><span class="Apple-style-span" style="font-size: 13px; line-height: 20px; ">Ну и я о том же самом писал: нет семантической информации. Где спор-то? :-)</span></div><div><span class="Apple-style-span" style="color: rgb(51, 51, 255); font-size: 13px; line-height: 20px;"><br /></span></div><div><span class="Apple-style-span" style="color: rgb(51, 51, 51); font-size: 13px; line-height: 20px; "><span class="Apple-style-span" style="color: rgb(51, 51, 255);"> Даже в устаревающем Delphi уже давно есть откомпилированные модули dcu с кучей метаинформации в заголовке. И линковщик только заглядывает в нее и сразу разрешает внешние ссылки. А в C++ линковщик проделывает гигантскую работу - известно же про скорость линковки проектов на C++...</span></span></div><div><span class="Apple-style-span" style="color: rgb(51, 51, 255); font-size: 13px; line-height: 20px;"><br /></span></div><div><span class="Apple-style-span" style="font-size: 13px; line-height: 20px; ">Как пишет Страуструп в той же книге, одним из основных требований при проектировании С++ было обспечить совместимость с существующими инструментами (с линкерами, заточенными под Си, в частности). Именно отсюда проблемы - какой ни будь С++ продвинутый, но вынь и положь возможность плюсовые программы линковать с сишными.</span></div><div><span class="Apple-style-span" style="color: rgb(51, 51, 255); font-size: 13px; line-height: 20px;"><br /></span></div><div><span class="Apple-style-span" style="color: rgb(51, 51, 51); font-size: 13px; line-height: 20px; "><span class="Apple-style-span" style="color: rgb(51, 51, 255);"> Я уж не говорю про .NET и Java, где этап линковки ну почти отсутствует - в байт-коде уже хранится нужная информация.</span></span></div><div><span class="Apple-style-span" style="color: rgb(51, 51, 255); font-size: 13px; line-height: 20px;"><br /></span></div><div><span class="Apple-style-span" style="font-size: 13px; line-height: 20px; ">В .NET линковки нет по другой причине - сама архитектура спроектирована таким образом, что исключает статическую линковку. Динамическое связывание - да, возможно, и, кстати, на основе тех же метаданных.</span></div><div><span class="Apple-style-span" style="color: rgb(51, 51, 255); font-size: 13px; line-height: 20px;"><br /></span></div><div><span class="Apple-style-span" style="color: rgb(51, 51, 51); font-size: 13px; line-height: 20px; "><span class="Apple-style-span" style="color: rgb(51, 51, 255);"> Кстати, интересен вопрос, насколько лучше делать линковку по семантическому представлению, чем по байт-коду - мне кажется, что преимущества в большинстве сомнительны. </span></span></div><div><span class="Apple-style-span" style="color: rgb(51, 51, 255); font-size: 13px; line-height: 20px;"><br /></span></div><div><span class="Apple-style-span" style="color: rgb(51, 51, 51); font-size: 13px; line-height: 20px; "><span class="Apple-style-span" style="color: rgb(51, 51, 255);"><span class="Apple-style-span" style="color: rgb(0, 0, 0);">С байт-кодом (или с MSIL-кодом) проблемы те же: там нет семантической информации об исходной программе. Есть метаданные, но их недостаточно для реализации "умной" линковки. Да и нет метаданных для кода из-под "обычного" С++ (не для Managed C++). А нужда в умной линковке, помимо борьбы с code bloat для шаблонов, заключается еще и в возможности делать </span><span class="Apple-style-span" style="font-weight: bold;"><span class="Apple-style-span" style="color: rgb(0, 0, 0);">глобальную оптимизацию</span></span><span class="Apple-style-span" style="color: rgb(0, 0, 0);"> программы, и в возможности ее "умной" и безопасной <span class="Apple-style-span" style="font-weight: bold;">интерпретации </span>(в частности, для режима отладки). Именно по этим причинам линковка семантического представления предпочтительна.</span><br /><br />Мне кажется, что сейчас нужно ставить более прогрессивные вопросы, чем ставил Страуструп 15 лет назад: создание единого семантического представления для группы языков программирования</span></span></div><div><span class="Apple-style-span" style="color: rgb(51, 51, 255); font-size: 13px; line-height: 20px;"><br /></span></div><div><span class="Apple-style-span" style="font-size: 13px; line-height: 20px; ">"Прогресс" - понятие диалектическое. :-) На мой-то взгляд, прогресс в решении даже тех задач, которые Страуструп сформулировл в том разделе, довольно относителен. С другой стороны,</span></div><div><span class="Apple-style-span" style="font-size: 13px; line-height: 20px; ">реальный прогресс в той сфере, которую мы обсуждаем, возможен только при наличии соответствующих потребностей со стороны пользователей. Спроси сейчас кого угодно: тебе нужно единое семантическое представление для двух (трех и т.д.) языков? Ответ будет отрицательный. Это не означает, разумеется, что работы в этой области не имеют смысла. Но надо понимать, что это требует довольно фундаментальных исследований. Речь идет, по существу, о том, чтобы спроектировать и обосновать <span class="Apple-style-span" style="font-weight: bold;">универсальный семантический базис</span> для различных ЯП. Можно запросто (знаю, что говорю :-)) объединить семантические представления, например, для С/С++, Джавы и C# (просто свалить все в одну кучу) и объявить "революцию" свершившейся. Выделить же общие семантические свойства хотя бы двух языков, построить минимальный понятийный базис для них и определить механизм расширения этого базиса - это задача, поверьте, очень-очень нетривиальная...</span></div><div><span class="Apple-style-span" style="color: rgb(51, 51, 255); font-size: 13px; line-height: 20px;"><br /></span></div><div><span class="Apple-style-span" style="color: rgb(51, 51, 51); font-size: 13px; line-height: 20px; "><span class="Apple-style-span" style="color: rgb(51, 51, 255);"> и преобразования "во все стороны".</span></span></div><div><span class="Apple-style-span" style="color: rgb(51, 51, 255); font-size: 13px; line-height: 20px;"><br /></span></div><div><span class="Apple-style-span" style="font-size: 13px; line-height: 20px; ">Преобразовапние во все стороны - это как раз несложно. "Одна сторона" (например, текстовое представление) генерируется по "другой стороне" довольно просто. Исходный текст по UML-представлению, например,- сколько угодно.</span></div><div><span class="Apple-style-span" style="color: rgb(51, 51, 255); font-size: 13px; line-height: 20px;"><br /></span></div><div><span class="Apple-style-span" style="color: rgb(51, 51, 51); font-size: 13px; line-height: 20px; "><span class="Apple-style-span" style="color: rgb(51, 51, 255);"> Можно также говорить о стандарте внутреннего представления только для C++ и о стандарте хранения его на диске - иначе каждая фирма будет разрабатывать свое и тщательно скрывать от конкурентов.</span></span></div><div><span class="Apple-style-span" style="color: rgb(51, 51, 255); font-size: 13px; line-height: 20px;"><br /></span></div><div><span class="Apple-style-span" style="color: rgb(51, 51, 51); font-size: 13px; line-height: 20px; "><span class="Apple-style-span" style="color: rgb(51, 51, 255);"><span class="Apple-style-span" style="color: rgb(0, 0, 0);">Стандарт - это почти всегда хорошо (я уже говорил о стандарте сем.интерфейса для Ады). И, наверное, какой-нибудь уважаемый профессор из мира языков программирования такую задачу мог бы поставить. Но не мы, простые смертные... Кроме того, стандарт никогда не создается на пустом месте: нужна хотя бы одна разработка, наглядно демонстрирующая, как такое стандартное представление могло бы выглядеть. </span></span></span></div><div><span class="Apple-style-span" style="font-size: 13px; line-height: 20px;"><br /></span></div><div><span class="Apple-style-span" style="color: rgb(51, 51, 51); font-size: 13px; line-height: 20px; "><span class="Apple-style-span" style="color: rgb(51, 51, 255);"><span class="Apple-style-span" style="color: rgb(0, 0, 0);">А насчет "скрывать" - мне, честно говоря, не очень интересно, как та или иная фирма будет поступать со своими разработками. Все равно эффект от семантического представления будет виден в продуктах фирмы...</span><br /><br />Ну и - что касается C++ - хорошо бы хранить в каком-то стандартном бинарном виде заголовочные файлы - а то они каждый раз перекомпилируются - пещерный век!</span></span></div><div><span class="Apple-style-span" style="color: rgb(51, 51, 255); font-size: 13px; line-height: 20px;"><br /></span></div><div><span class="Apple-style-span" style="font-size: 13px; line-height: 20px; ">Ну, тут Вы ломитесь в открытую дверь, простите - у Микрософта уже много лет имеется механизм "предкомпилированных" заголовочных файлов, и они действительно экономят много времени при повторных сборках. Это даже на глаз заметно и даже в небольших проектах.</span></div><div><span class="Apple-style-span" style="font-size: 13px; line-height: 20px;"><br /></span></div>zouevhttp://www.blogger.com/profile/09163739178551976623noreply@blogger.com14tag:blogger.com,1999:blog-8224163229837394669.post-23734865301334723062008-09-05T19:04:00.016+02:002008-09-05T22:49:57.984+02:00Страуструп о будущих средах программированияВ августе позволил себе короткий отпуск и взял с собой книгу Страуструпа <span class="Apple-style-span" style="color: rgb(51, 51, 255);">Дизайн и эволюция языка C++</span>. Вроде, в свое время читал ее (просматривал), но в этот раз обнаружил совершенно замечательный раздел, который раньше как-то прошел мимо меня. Он пишет в точности о том, что сейчас занимает все мои "профессиональные" мысли!<div><br /></div><div>Не поленюсь и выпишу раздел целиком, выделяя курсивом и жирным шрифтом некоторые "ударные" с моей точки зрения места. А мои комментарии - красным.<div><br /></div><div><span class="Apple-style-span" style="color: rgb(51, 51, 255);"><span class="Apple-style-span" style="font-weight: bold;">9.4.4 За пределами файлов и синтаксиса</span></span></div><div><span class="Apple-style-span" style="color: rgb(51, 51, 255);"><br /></span></div><div><span class="Apple-style-span" style="color: rgb(51, 51, 255);">Как я вижу среду для разработки программ на С++? Прежде всего - инкрементная компиляция. Если вносится небольшое изменение, то система "понимает", что оно небольшое, и генерирует новую версию программы мгновенно. <span class="Apple-style-span" style="font-weight: bold;">Моментальные ответы хотелось бы получать также на простые вопросы и указания типа: "Показать объявление </span><span class="Apple-style-span" style="font-family:'courier new';"><span class="Apple-style-span" style="font-weight: bold;">f</span></span><span class="Apple-style-span" style="font-weight: bold;">", "Какие еще </span><span class="Apple-style-span" style="font-family:'courier new';"><span class="Apple-style-span" style="font-weight: bold;">f</span></span><span class="Apple-style-span" style="font-weight: bold;"> есть в области действия", "Как разрешен этот вызов оператора </span><span class="Apple-style-span" style="font-family:'courier new';"><span class="Apple-style-span" style="font-weight: bold;">+</span></span><span class="Apple-style-span" style="font-weight: bold;">?", "Какие классы произведены от </span><span class="Apple-style-span" style="font-family:'courier new';"><span class="Apple-style-span" style="font-weight: bold;">Shape</span></span><span class="Apple-style-span" style="font-weight: bold;">?" и "Какие деструкторы вызываются в конце этого блока?"</span></span></div><div><span class="Apple-style-span" style="color: rgb(51, 51, 255);"><br /></span></div><div><span class="Apple-style-span" style="color: rgb(255, 0, 0);"> Инструмент, который давал бы возможность получать ответы на<br /> подобные вопросы,- это в точности то, над чем я сейчас работаю.<br /> Основой такой системы должно быть то самое промежуточное<br /> представление программ на С++ (я предпочитаю говорить<br /> о <span class="Apple-style-span" style="font-weight: bold;">семантическом представлении</span>), о котором он пишет далее.</span></div><div><span class="Apple-style-span" style="color: rgb(51, 51, 255);"><br /></span></div><div><span class="Apple-style-span" style="color: rgb(51, 51, 255);">В программе на С++ есть много информации, которая в типичной среде доступна только компилятору. Уверен, что <span class="Apple-style-span" style="font-weight: bold;">она должна быть предоставлена программисту</span>.</span></div><div><span class="Apple-style-span" style="color: rgb(51, 51, 255);"><br /></span></div><div><span class="Apple-style-span" style="color: rgb(51, 51, 255);"><span class="Apple-style-span" style="color: rgb(255, 0, 0);"> Не хочу, чтобы подумали о (само)рекламе, но <a href="http://www.blogger.com/www.interstron.ru">наш компилятор</a><br /> переднего плана</span><span class="Apple-style-span" style="color: rgb(255, 0, 0);"> устроен именно таким образом: он генерирует<br /> промежуточное представление,<span class="Apple-style-span" style="white-space: pre;"> </span></span><span class="Apple-style-span" style="color: rgb(255, 0, 0);">в котором содержится вся семантика<br /> исходной программы. Для этого<span class="Apple-style-span" style="white-space: pre;"> </span></span><span class="Apple-style-span" style="color: rgb(255, 0, 0);">промежуточного представления<br /> имеется программный интерфейс.</span><span class="Apple-tab-span" style="white-space:pre"><span class="Apple-style-span" style="color: rgb(255, 0, 0);"> </span></span><span class="Apple-style-span" style="color: rgb(255, 0, 0);">С помощью этого интерфейса -<br /> не скажу, что так уж легко, но, в общем,<span class="Apple-style-span" style="white-space: pre;"> </span></span><span class="Apple-style-span" style="color: rgb(255, 0, 0);">нормальному программисту<br /> вполне по силам - можно сделать, скажем,<span class="Apple-style-span" style="white-space: pre;"> </span></span><span class="Apple-style-span" style="color: rgb(255, 0, 0);">инструмент, отвечающий<br /> на "смысловые" вопросы о программе вроде тех,<span class="Apple-style-span" style="white-space: pre;"> </span></span><span class="Apple-style-span" style="color: rgb(255, 0, 0);">которые<br /> Страуструп приводит в первом абзаце. </span></span></div><div><span class="Apple-style-span" style="color: rgb(51, 51, 255);"><br /></span></div><div><span class="Apple-style-span" style="color: rgb(51, 51, 255);">Однако люди в большинстве своем смотрят на С++-программу как на набор исходных файлов или строк символов. </span><span class="Apple-style-span" style="font-weight: bold;"><span class="Apple-style-span" style="color: rgb(51, 51, 255);">Программа - это набор типов, функций, предложений и т.д.</span></span><span class="Apple-style-span" style="color: rgb(51, 51, 255);"> Данные понятия представляются в виде символов в файлах только для удобства изображения в традиционных средах программирования.</span></div><div><span class="Apple-style-span" style="color: rgb(51, 51, 255);"><br /></span></div><div><span class="Apple-style-span" style="color: rgb(51, 51, 255);"><span class="Apple-style-span" style="color: rgb(0, 0, 0); "><div><span class="Apple-style-span" style="color: rgb(51, 51, 255); "><span class="Apple-style-span" style="color: rgb(255, 0, 0); "> Прекрасно! Это в чистом виде <span class="Apple-style-span" style="font-style: italic;">семантический взгляд</span> на программу!<br /> Если появится система, которая в полной мере воплотит такой<br /> подход к работе с С++, это будет весьма существенным прогрессом,<br /> если не сказать прорывом... Продолжая тему "семантического"<br /> подхода к С++, эксплуатируемому Интерстроном, могу сказать, что<br /> у нас есть и реальное средство, работающее с семантическим<br /> представлением: это <span class="Apple-style-span" style="font-style: italic;">визуализатор</span>, который показывает исходную<br /> программу в виде дерева семантических элементов - именно как <br /> "набор типов, функций, предложений..." и/или в нотации UML.</span></span></div></span></span></div><div><span class="Apple-style-span" style="color: rgb(51, 51, 255);"><br /></span></div><div><span class="Apple-style-span" style="font-weight: bold;"><span class="Apple-style-span" style="color: rgb(51, 51, 255);">То, что в основе реализаций С++ лежат символьно-ориентированные инструменты, всегда было главным препятствием на пути развития языка.</span></span><span class="Apple-style-span" style="color: rgb(51, 51, 255);"> Если нужно препроцессировать и перекомпилировать каждый заголовочный файл, прямо или косвенно включенный в файл, где находится слегка измененная функция, то для этого требовалось определенное, пусть и небольшое время. Существует несколько методов, позволяющих избежать ненужных перекомпиляций, но, по-моему, наиболее перспективный и интересный подход - </span><span class="Apple-style-span" style="font-weight: bold;"><span class="Apple-style-span" style="color: rgb(51, 51, 255);">отказаться от традиционного исходного текста и положить в основу инструментов абстрактное внутреннее представление</span></span><span class="Apple-style-span" style="color: rgb(51, 51, 255);">. Ранний вариант такого представления можно найти в работах [Murray, 1992], [Koenig, 1992]. </span><span class="Apple-style-span" style="font-style: italic;"><span class="Apple-style-span" style="color: rgb(51, 51, 255);">Естественно, текст все равно необходим - его вводят и читают пользователи</span></span><span class="Apple-style-span" style="color: rgb(51, 51, 255);"> - но он </span><span class="Apple-style-span" style="font-style: italic;"><span class="Apple-style-span" style="color: rgb(51, 51, 255);">легко</span></span><span class="Apple-style-span" style="color: rgb(51, 51, 255);"> преобразуется системой во внутреннюю форму</span></div><div><br /></div><div><span class="Apple-style-span" style="color: rgb(255, 0, 0);"> Ну, насчет "легко" - это он погорячился. :-) Если то абстрактное<br /> внутреннее<span class="Apple-style-span" style="white-space: pre;"> </span></span><span class="Apple-style-span" style="color: rgb(255, 0, 0);">представление, о котором он говорит выше, содержит<br /> семантическую информацию<span class="Apple-style-span" style="white-space: pre;"> </span></span><span class="Apple-style-span" style="color: rgb(255, 0, 0);">об исходной программе, введенной<br /> в текстовом виде, то построение </span><span class="Apple-style-span" style="font-style: italic;"><span class="Apple-style-span" style="color: rgb(255, 0, 0);">такого<span class="Apple-style-span" style="white-space: pre;"> </span></span></span><span class="Apple-style-span" style="color: rgb(255, 0, 0);">представления - весьма<br /> нетривиальнная задача. Но крайне... <span class="Apple-style-span" style="font-style: italic;">challenging</span>, как<span class="Apple-style-span" style="white-space: pre;"> </span></span><span class="Apple-style-span" style="color: rgb(255, 0, 0);">говорят у них.</span><br /></div><div><br /></div><div><span class="Apple-style-span" style="color: rgb(51, 51, 255);">и реконструируется по запросу.</span><br /></div><div><br /></div><div><span class="Apple-style-span" style="color: rgb(255, 0, 0);"> А вот реконструкция текста - это действительно несложно.</span><br /></div><div><br /></div><div><span class="Apple-style-span" style="color: rgb(51, 51, 255);">Форматирование текста с соблюдением некоторых правил отступа - лишь один из многих возможных взглядов на программу. Простейшее применение этого замечания: текст программы, который каждый из пользователей видит отформатированным в своем любимом стиле, а вы - в вашем.</span></div><div><span class="Apple-style-span" style="color: rgb(51, 51, 255);"><br /></span></div><div><span class="Apple-style-span" style="color: rgb(51, 51, 255);">Нетекстовое представление могло бы быть создано языками более высокого уровня, генераторами программ, инструментами визуального программирования и т.д.</span></div><div><br /></div><div><span class="Apple-style-span" style="color: rgb(255, 0, 0);"> Ну, и обычными компиляторами переднего плана, разумеется.</span></div><div><br /></div><div><span class="Apple-style-span" style="color: rgb(51, 51, 255);">Это позволило бы таким инструментам работать в обход обычного синтаксиса С++ и даже помогло бы избавить язык от некоторых неудачных особенностей его синтаксиса. </span><span class="Apple-style-span" style="font-weight: bold;"><span class="Apple-style-span" style="color: rgb(51, 51, 255);">Я утверждаю, что система типов и семантика С++ чище, чем его синтаксис.</span></span></div><div><span class="Apple-style-span" style="color: rgb(51, 51, 255); font-weight: bold;"><br /></span></div><div><span class="Apple-style-span" style="color: rgb(255, 0, 0);"> Из этого пассажа можно сделать такой вывод: <span class="Apple-style-span" style="font-style: italic;">семантику С++<br /><span class="Apple-style-span" style="font-style: normal; "> </span>можно представить<span class="Apple-style-span" style="white-space: pre;"> </span></span></span><span class="Apple-style-span" style="color: rgb(255, 0, 0);"><span class="Apple-style-span" style="font-style: italic;">в виде, не зависящем от конкретного<br /><span class="Apple-style-span" style="font-style: normal; "> </span>синтаксиса</span>, который несет тяжелый груз<span class="Apple-style-span" style="white-space: pre;"> </span></span><span class="Apple-style-span" style="color: rgb(255, 0, 0);"><span class="Apple-tab-span" style="white-space:pre"> </span>языка-<br /> предшественника, неудачного дизайна, за которым шлейф<br /> философии и привычек миллионов<span class="Apple-style-span" style="white-space: pre;"> </span></span><span class="Apple-style-span" style="color: rgb(255, 0, 0);">программистов. Если для этого<br /> использовать какую-нибудь систематическую<span class="Apple-style-span" style="white-space: pre;"> </span></span><span class="Apple-style-span" style="color: rgb(255, 0, 0);">общеупотребитель-<br /> ную нотацию (например, XML), то может получиться нечто,<br /></span><span class="Apple-style-span" style="color: rgb(255, 0, 0);"> что можно назвать </span><span class="Apple-style-span" style="font-weight: bold;"><span class="Apple-style-span" style="color: rgb(255, 0, 0);">семантическим синтаксисом С++</span></span><span class="Apple-style-span" style="color: rgb(255, 0, 0);">.<br /></span></div><div><span class="Apple-style-span" style="color: rgb(255, 0, 0);"><br /></span></div><div><span class="Apple-style-span" style="color: rgb(51, 51, 255);"><span class="Apple-style-span" style="color: rgb(255, 0, 0);"> Более того: такое описание я как раз сейчас делаю. И должен сказать,<br /> что<span class="Apple-style-span" style="white-space: pre;"> </span></span><span class="Apple-style-span" style="color: rgb(255, 0, 0);">получаю громадное удовольствие, на каждом шаге наглядно<br /> наблюдая,<span class="Apple-style-span" style="white-space: pre;"> </span></span><span class="Apple-style-span" style="color: rgb(255, 0, 0);">как обсыпаются многочисленные корявые и громоздкие<br /> синтаксические<span class="Apple-style-span" style="white-space: pre;"> </span></span><span class="Apple-style-span" style="color: rgb(255, 0, 0);">конструкции языка, обнажая естественное и стройное<br /> здание<span class="Apple-style-span" style="white-space: pre;"> </span></span><span class="Apple-style-span" style="font-style: italic;"><span class="Apple-style-span" style="color: rgb(255, 0, 0);">семантики С++</span></span><span class="Apple-style-span" style="color: rgb(255, 0, 0);">...</span><br /></span></div><div><span class="Apple-style-span" style="color: rgb(255, 0, 0);"><br /></span></div><div><span class="Apple-style-span" style="color: rgb(255, 0, 0);"> Я пока не знаю точно, каково может быть практическое применение<br /> этого семантического синтаксиса. Впрочем, его можно<br /> рассматривать, как формальную запись семантического представле-<br /> ния С++, которое сейчас используется в продуктах Интерстрона.<br /> Кроме того, на основе этой нотации разрабатывается <span class="Apple-style-span" style="font-style: italic;">новое<br /></span> семантическое представление, которое будет использоваться<br /> в системе программирования следующего поколения. :-)<br /></span></div><div><span class="Apple-style-span" style="color: rgb(51, 51, 255);"><br /></span></div><div><span class="Apple-style-span" style="color: rgb(51, 51, 255);">Из представления о синтаксисе как об интерфейсе между языком и пользователем следует, что </span><span class="Apple-style-span" style="font-weight: bold;"><span class="Apple-style-span" style="color: rgb(51, 51, 255);">возможны и другие интерфейсы</span></span><span class="Apple-style-span" style="color: rgb(51, 51, 255);">.</span></div><div><br /></div><div><span class="Apple-style-span" style="color: rgb(255, 0, 0);"> Например, графический интерфейс: программа "рисуется" -<br /> с помощью ли<span class="Apple-style-span" style="white-space: pre;"> </span></span><span class="Apple-style-span" style="color: rgb(255, 0, 0);">нотации UML или как-то еще, а "рисовальный"<br /> инструмент переводит картинку во внутреннее представление. <br /> Или </span><span class="Apple-style-span" style="font-style: italic;"><span class="Apple-style-span" style="color: rgb(255, 0, 0);"><span class="Apple-style-span" style="font-weight: bold;">программный</span></span></span><span class="Apple-style-span" style="color: rgb(255, 0, 0);"> интерфейс: пытливый<span class="Apple-style-span" style="white-space: pre;"> </span></span><span class="Apple-style-span" style="color: rgb(255, 0, 0);">пользователь легко<br /> и быстро пишет некий скрипт, который бы просмотрел<span class="Apple-style-span" style="white-space: pre;"> </span></span><span class="Apple-style-span" style="color: rgb(255, 0, 0);">программу<br /> на предмет ее структуры, каких-либо свойств, особенностей или<br /></span><span class="Apple-style-span" style="color: rgb(255, 0, 0);"> метрик, и выдал бы отчет...</span><br /></div><div><br /></div><div><span class="Apple-style-span" style="color: rgb(51, 51, 255);"><span class="Apple-style-span" style="font-weight: bold;">Единственная фудаментальная константа - это базовая семантика языка.</span> Она не должна меняться ни при каких обстоятельствах, и, учитывая это, вполне можно выдать С++-код в обычной текстовой форме по запросу.</span></div><div><span class="Apple-style-span" style="color: rgb(51, 51, 255);"><br /></span></div><div><span class="Apple-style-span" style="color: rgb(51, 51, 255);">В среде, основанной на абстрактном представлении С++, можно было бы предоставлять альтернативные способы создания и просмотра программ, а равно и </span><span class="Apple-style-span" style="font-weight: bold;"><span class="Apple-style-span" style="color: rgb(51, 51, 255);">другие пути компоновки, компиляции и исполнения кода</span></span><span class="Apple-style-span" style="color: rgb(51, 51, 255);">. Например, </span><span class="Apple-style-span" style="font-weight: bold;"><span class="Apple-style-span" style="color: rgb(51, 51, 255);">компоновка выполнялась бы до генерации кода</span></span><span class="Apple-style-span" style="color: rgb(51, 51, 255);">, поскольку наличие объектного кода не являлось бы обязательным для доступа к информации о связях.</span></div><div><span class="Apple-style-span" style="color: rgb(51, 51, 255);"><br /></span></div><div><span class="Apple-style-span" style="color: rgb(51, 51, 255);"><span class="Apple-style-span" style="color: rgb(255, 0, 0);"> У Интерстрона есть </span><span class="Apple-style-span" style="font-style: italic;"><span class="Apple-style-span" style="color: rgb(255, 0, 0);">линкер промежуточного представления</span></span><span class="Apple-style-span" style="color: rgb(255, 0, 0);">,<br /> который делает<span class="Apple-style-span" style="white-space: pre;"> </span></span><span class="Apple-style-span" style="color: rgb(255, 0, 0);">именно это: компоновку программы на этапе,<br /> предшествующем генерации кода. </span><span class="Apple-style-span" style="color: rgb(255, 0, 0);">Более того, согласно нашей<br /> философии, генерация кода - это частный случай,<span class="Apple-style-span" style="white-space: pre;"> </span></span><span class="Apple-style-span" style="color: rgb(255, 0, 0);">одна из многих<br /> операций, возможных над промежуточным представлением.<br /></span><span class="Apple-style-span" style="color: rgb(255, 0, 0);"> Можно это представление визуализировать, можно подвергнуть<br /> его статическому </span><span class="Apple-style-span" style="color: rgb(255, 0, 0);">анализу или оптимизировать, наконец, можно<br /> его... исполнить (см. далее)!</span><br /><span class="Apple-tab-span" style="white-space:pre"> </span></span></div><div><span class="Apple-style-span" style="color: rgb(51, 51, 255);">Различие между интерпретатором и компилятором в значительной мере сгладилось бы, поскольку </span><span class="Apple-style-span" style="font-weight: bold;"><span class="Apple-style-span" style="color: rgb(51, 51, 255);">их работа была бы основана на одной и той же информации</span></span><span class="Apple-style-span" style="color: rgb(51, 51, 255);"> примерно в одном и том же формате.</span></div><div><span class="Apple-style-span" style="color: rgb(51, 51, 255);"><br /></span></div><div><span class="Apple-style-span" style="color: rgb(51, 51, 255);"><span class="Apple-style-span" style="color: rgb(255, 0, 0);"> В точности так! </span><span class="Apple-style-span" style="font-style: italic;"><span class="Apple-style-span" style="color: rgb(255, 0, 0);">Виртуальная машина С++</span></span><span class="Apple-style-span" style="color: rgb(255, 0, 0);"> (еще одна разработка<br /> Интерстрона)<span class="Apple-style-span" style="white-space: pre;"> </span></span><span class="Apple-style-span" style="color: rgb(255, 0, 0);">непосредственно исполняет программу, <br /> представленную в промежуточном </span><span class="Apple-tab-span" style="white-space:pre"><span class="Apple-style-span" style="color: rgb(255, 0, 0);"> </span></span><span class="Apple-style-span" style="color: rgb(255, 0, 0);">представлении. Конечно,<br /> это гораздо медленнее, чем выполнение сгенерированного<br /></span><span class="Apple-tab-span" style="white-space:pre"><span class="Apple-style-span" style="color: rgb(255, 0, 0);"><span class="Apple-style-span" style="white-space: normal; "> </span>целевого </span></span><span class="Apple-style-span" style="color: rgb(255, 0, 0);">кода, но в очень многих реальных и важных случаях<br /> этой скорости бывает<span class="Apple-style-span" style="white-space: pre;"> вполне </span></span><span class="Apple-style-span" style="color: rgb(255, 0, 0);">достаточно (очевидный пример - <br /></span><span class="Apple-style-span" style="color: rgb(255, 0, 0);"> пошаговая отладка программы).</span><br /></span></div></div>zouevhttp://www.blogger.com/profile/09163739178551976623noreply@blogger.com22tag:blogger.com,1999:blog-8224163229837394669.post-66430626515783560182008-09-05T18:39:00.007+02:002008-09-05T18:56:33.808+02:00Комментированный стандарт: current stateПоследние два месяца я буквально головы не поднимал от работы по комментированному стандарту (см. сообщение от 17 мая). Перевод, чистка перевода (включая аккуратный перевод терминологии), форматирование, сверка сначала с февральским, а потом с июньским выпуском драфта... Комментарии опять же... Потому и не писал ничего сюда. Прошу прощения, что оставлял ваши вопросы и сообщения без ответа.<div><br /></div><div>В какой-то момент казалось, что работа никогда не будет закончена. Но сейчас ситуация более-менее выправляется, в конце туннеля забрезжил свет :-). До конца года комментированный стандарт выйдет. Точные сроки, опять же, называть не буду - из тех же суеверных соображений :-). Пока не все еще ясно, как книга будет распространяться, так что на многочисленные вопросы насчет того, где ее можно будет приобрести, ответа у меня пока нет. Очень надеюсь, что с этим все прояснится довольно скоро.</div><div><br /></div><div>В стандарте появилось (появится, так как формально он еще не вышел) довольно много нововведений, и некоторые из них очень интересные. Я собираюсь постепенно выкладывать сюда фрагменты нового текста в своем переводе, описывающие эти нововведения. Пока без комментариев.</div>zouevhttp://www.blogger.com/profile/09163739178551976623noreply@blogger.com1tag:blogger.com,1999:blog-8224163229837394669.post-23861746291140518772008-06-17T17:30:00.004+02:002008-06-17T17:35:31.157+02:00Шутка, конечно, но приятно :-)Давно уже встречал этот тест у разных блоггеров, но сам не заходил: боялся опозориться :-). А тут вот взял и... прошел:<br /><br /><table style="FONT-SIZE: 11pt; BACKGROUND: #ffe493 0% 50%; WIDTH: 510px; TEXT-ALIGN: justify"><tbody><tr><td>Я проверил свои знания русского языка и получил пятерку.<br /><br /><img height="164" src="http://www.rb.ru/poll/7/img/5.gif" width="500" align="center" /><br /><br /><b><a href="http://www.rb.ru/poll/7/">Сходи, проверься?</a></b></td></tr></tbody></table><br /><br />Там еще такие слова были:<br /><br /><span style="color:#3366ff;"><strong>Результаты тестирования</strong><br />8 из 8 - Поздравляем, вы - вымирающий вид россиянина, отлично знающего свой родной русский язык. Вы один из немногих носителей элитарного знания, доступного в наше время единицам (4% от общего числа опрошенных). Второй вариант: вы - выпускник, которого хорошо натаскали на сдачу экзамена по русскому языку. Третий вариант: вы – репетитор. Или просто закончили филологический факультет и пошли работать не по специальности.</span>zouevhttp://www.blogger.com/profile/09163739178551976623noreply@blogger.com4