<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8224163229837394669</id><updated>2012-02-18T08:20:53.136+01:00</updated><category term='Ada'/><category term='Standardization'/><category term='Oberon'/><category term='Language Tools'/><category term='XSLT'/><category term='Zeppelin'/><category term='C'/><category term='&quot;Эльбрус&quot;'/><category term='Идеи'/><category term='UML'/><category term='XML'/><category term='Сколково'/><category term='Lisp'/><category term='Source Code'/><category term='Static Analysis'/><category term='C#'/><category term='C++'/><category term='Zonnon'/><category term='Compilers'/><category term='Operating Systems'/><category term='Публикации'/><category term='Проекты'/><category term='Прочее'/><category term='.NET'/><category term='Companies'/><title type='text'>The lonely compiler</title><subtitle type='html'>Когда созданная тобой программа сама (!) разбирается в большом и сложном тексте, выясняет все синтаксические и семантические взаимосвязи его элементов... Как описать свои чувства, когда наблюдаешь это?.. А когда эта программа начинает анализировать &lt;i&gt;&lt;b&gt;саму себя&lt;/b&gt;&lt;/i&gt;!..</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://zouev.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8224163229837394669/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://zouev.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>zouev</name><uri>http://www.blogger.com/profile/09163739178551976623</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>48</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8224163229837394669.post-7846911198069187081</id><published>2011-01-19T12:13:00.010+01:00</published><updated>2011-01-19T15:34:52.080+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Сколково'/><title type='text'>Зачем Сколкову Микрософт?</title><content type='html'>В предыдущем посте я призывал молодые команды посмотреть на перспективу Сколково не с высоты "птичьего полета", а с точки зрения собственных задач и потребностей. При таком смещении фокуса может оказаться, что дело это вполне выгодное - несмотря на сомнительность всей инициативы в целом.&lt;br /&gt;&lt;br /&gt;Закончил я тот пост такими словами: "Это все, наверное, правильно, если бы была уверенность, что Сколково и создается, собственно, для подобных компактных коллективов из талантливых и упорных молодых людей, пытающихся сделать что-то, чего до них не было".&lt;br /&gt;&lt;br /&gt;Так вот, что-то у меня возникли сомнения: действительно ли Сколково создается для таких коллективов? Эти сомнения появились, когда я прочитал, что в Сколково приглашаются... Микрософт, Cisco, Интел и (кажется) IBM. Причем, сообщения о (только даже предварительном!) согласии этих монстров сопровождались напыщенной просто-таки до неприличия городостью: смотрите, какие гиганты поддерживают и одобряют нашу инициативу и готовы, так сказать, влиться!..&lt;br /&gt;&lt;br /&gt;Вот это мне как раз решительно непонятно! В самом деле, объясните мне, уважаемые авторы идеи: &lt;span style="font-weight:bold;"&gt;каким именно образом&lt;/span&gt; наличие в Сколково Микрософта может послужить делу модернизации/инновации???? (Дело, конечно, не в Микрософте как таковом: вместо него можно подставить любого гиганта из приведенных выше.)&lt;br /&gt;&lt;br /&gt;В одном из сообщений говорилось: в исследовательском центре Cisco будет занято до 1000 российских инженеров. Ну так прекрасно, я только за: тысяча наших специалистов будет заниматься интересной работой и получать за нее, наверное, адекватные деньги. Только вот причем здесь российские инновации, ну объясните хоть кто-нибудь!! В этой фирме они будут разрабатывать новые умные и мощные устройства (и софт для них), которые поставляются по всему миру - прекрасно! Но... работать-то они будут на Cisco! И созданная ими интеллектуальная собственность будет принадлежать этой уважаемой компании!&lt;br /&gt;&lt;br /&gt;Я хочу быть правильно понятым: я вовсе не против того, чтобы Cisco работала в России, и не призываю гнать "проклятых капиталистов" из страны "потенциального противника" каленой метлой. Чем больше таких "исследовательских центров" западных компаний будет, тем лучше. (Они, собственно, и сейчас возникают, и далеко не только в Москве/Питере.) Я только не понимаю одного: почему их так активно тянут именно в Сколково, которое, судя по заявлениям авторов инициативы, создается все-таки для поддержки перспективных разработок отечественных коллективов???&lt;br /&gt;&lt;br /&gt;Ну давайте порассуждаем. Может, они нужны там для создания некоей "инновационной среды", креативной атмосферы, которая послужила бы питательной средой для инноваций? Сомневаюсь: вряд ли коммерческая фирма заинтересована в обмене идеями (что, естественно, подразумевает необходимость делиться &lt;span style="font-style:italic;"&gt;своими&lt;/span&gt;) - им, скорее, интересно получить некую инновацию в свою собственность, а получив ее, сделать продукт на ее основе - и уж конечно, не "делиться" ей.&lt;br /&gt;&lt;br /&gt;Дальше. Может быть, гигантов пускают в Сколково, чтобы они там на свои средства что-нибудь организовали? Ну там, "компьютерный класс" обрудовали? :-) Наверное, такое может быть, но, ей-Богу, это как-то несерьезно. Кроме того, объявлено ведь, что государственных денег в Сколково вбухивается немерено - может, и не нужны дополнительные вливания от того же Cisco?&lt;br /&gt;&lt;br /&gt;В общем, не могу представить, каковы были мотивы у решения настойчиво зазывать этих монстров в "инновационную" Сколковскую долину - но само решение выглядит, право же, идущим вразрез с базовыми принципами всей инициативы. Или, наоборот, представляется вполне "в духе" обычной бюрократической логики: давайте позовем монстра, он нам там все как надо организует...&lt;br /&gt;&lt;br /&gt;Ну правда же, получается удивительно и странно: отмена налогов, бюрократических препон и закорючек, доступные инвестиции, помощь в продвижении и коммерциализации - все, что сулят нам в Сколково - и нужно в первую очередь как раз молодым начинающим командам! А Микрософт прекрасно проживет и без этих преференций, они много лет по всему миру работают и прекрасно умеют бороться со всякими проблемами, которые, наоборот, могут стать непреодолимыми и смертельными для начинающих...&lt;br /&gt;&lt;br /&gt;И в заключение. Микрософт, IBM и т.д., кто бы что ни говорил,- очень хорошие компании, сделавшие много достойных и полезных продуктов, некоторые из которых изменили лицо нашего мира к лучшему. Такие организации, как, например, Microsoft Research, и сейчас являются весьма продвинутыми исследовательскими центрами, в которых работают выдающиеся специалисты (знаю это по собственному опыту общения с ними - как в Редмонде, так и в Кембридже). Отделения MR есть во многих странах, даже в Китае. И было бы просто замечательно, если в один прекрасный день отделение MR возникло в России - я бы посчитал честью работать там рядовым сотрудником (и не обиделся бы, если бы меня не взяли :-)). &lt;br /&gt;&lt;br /&gt;В России - но &lt;span style="font-weight:bold;"&gt;не в Сколково&lt;/span&gt;! Оно для другого задумано.&lt;br /&gt;&lt;br /&gt;Или... &lt;span style="font-style:italic;"&gt;для того самого&lt;/span&gt;?..&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8224163229837394669-7846911198069187081?l=zouev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zouev.blogspot.com/feeds/7846911198069187081/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8224163229837394669&amp;postID=7846911198069187081' title='Комментарии: 11'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8224163229837394669/posts/default/7846911198069187081'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8224163229837394669/posts/default/7846911198069187081'/><link rel='alternate' type='text/html' href='http://zouev.blogspot.com/2011/01/blog-post_19.html' title='Зачем Сколкову Микрософт?'/><author><name>zouev</name><uri>http://www.blogger.com/profile/09163739178551976623</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8224163229837394669.post-2500367780830408362</id><published>2011-01-13T14:23:00.005+01:00</published><updated>2011-01-13T14:38:16.493+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Compilers'/><category scheme='http://www.blogger.com/atom/ns#' term='Standardization'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>Интерстрон: реализация нового стандарта Си++</title><content type='html'>С публикацией перевода нового стандарта ясность еще не наступила - но это не означает, что мы "зациклились" на этой проблеме. Реализация нового стандарта идет своим чередом. Сейчас наш компилятор Си++ уже поддерживает такие возможности "нового" Си++:&lt;br /&gt;&lt;br /&gt;1. Спецификатор типа &lt;span style="font-weight:bold;"&gt;auto&lt;/span&gt; для переменных.&lt;br /&gt;2. Спецификатор &lt;span style="font-weight:bold;"&gt;decltype&lt;/span&gt;.&lt;br /&gt;3. Подряд идущие закрывающие угловые скобки &lt;span style="font-weight:bold;"&gt;&gt;&gt;&lt;/span&gt; в списках параметров шаблонов.&lt;br /&gt;4. Конструкция &lt;span style="font-weight:bold;"&gt;static_assert&lt;/span&gt;.&lt;br /&gt;5. Спецификатор extern для шаблонов: &lt;span style="font-weight:bold;"&gt;extern template&lt;/span&gt;.&lt;br /&gt;6. Расширенное friend-объявление вида &lt;span style="font-weight:bold;"&gt;friend T&lt;/span&gt;, где &lt;span style="font-weight:bold;"&gt;T&lt;/span&gt; - параметр шаблона.&lt;br /&gt;7. Предопределенная переменная &lt;span style="font-weight:bold;"&gt;__func__&lt;/span&gt; для функций.&lt;br /&gt;8. Обобщённые константные выражения.&lt;br /&gt;9. R-ссылки и ref-квалификаторы.&lt;br /&gt;10. Константа &lt;span style="font-weight:bold;"&gt;nullptr&lt;/span&gt;.&lt;br /&gt;11. Шаблоны с переменным числом параметров (variadic templates).&lt;br /&gt;12. Расширенные enum'ы.&lt;br /&gt;13. Списки инициализаторов.&lt;br /&gt;14. Спецификатор inline для пространств имен: &lt;span style="font-weight:bold;"&gt;inline namespace&lt;/span&gt;.&lt;br /&gt;15. Шаблонные алиасы (&lt;span style="font-weight:bold;"&gt;template&lt;...&gt; using &lt;новый тип&gt; = ...&lt;/span&gt;)&lt;br /&gt;16. Задание &lt;span style="font-weight:bold;"&gt;=delete&lt;/span&gt; и &lt;span style="font-weight:bold;"&gt;=default&lt;/span&gt; для функций.&lt;br /&gt;17. Описатель &lt;span style="font-weight:bold;"&gt;explicit&lt;/span&gt; для функций преобразования типа.&lt;br /&gt;18. Ослабление требований к union'ам.&lt;br /&gt;19. Делегирование конструкторов.&lt;br /&gt;20. Наследование конструкторов.&lt;br /&gt;&lt;br /&gt;- ну и довольно много мелких усовершенствований.&lt;br /&gt;&lt;br /&gt;В процессе реализации находятся такие свойства, как инициализаторы для нестатических членов класса и - конечно же!- лямбда-выражения и альтернативный синтаксис объявления функций (с типом возврата в конце после "стрелочки" &lt;span style="font-weight:bold;"&gt;-&gt;&lt;/span&gt;). По нашим планам это будет ближе к концу февраля.&lt;br /&gt;&lt;br /&gt;За такие вещи, как пользовательские литералы, циклы с range, атрибуты и конструкторы перемещения (move-конструкторы) пока не брались.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8224163229837394669-2500367780830408362?l=zouev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zouev.blogspot.com/feeds/2500367780830408362/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8224163229837394669&amp;postID=2500367780830408362' title='Комментарии: 10'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8224163229837394669/posts/default/2500367780830408362'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8224163229837394669/posts/default/2500367780830408362'/><link rel='alternate' type='text/html' href='http://zouev.blogspot.com/2011/01/blog-post_13.html' title='Интерстрон: реализация нового стандарта Си++'/><author><name>zouev</name><uri>http://www.blogger.com/profile/09163739178551976623</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8224163229837394669.post-1656591339735556799</id><published>2011-01-11T17:14:00.011+01:00</published><updated>2011-01-19T21:06:14.396+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Сколково'/><title type='text'>Сколково: угол зрения</title><content type='html'>Ажиотаж в электронной (другой не читаю) печати насчет сколковской инициативы прошел, интенсивность обсуждений спадает, а я только спохватился. :-) Вот такое нехитрое соображение насчет всего этого.&lt;br /&gt;&lt;br /&gt;Я вполне разделяю практически повсеместный скептицизм по поводу проекта Сколково. Пусть даже этот проект и начинался с вполне благими целями, в чем я, в общем, уверен (но и здесь несколько наивным выглядит желание скопировать сугубо внешние признаки успешных аналогов - прямо как Петр, начавший свои реформы с бритья боярам бород и натягивания на них камзолов; умные люди пишут об "обратном культе карго", что кажется мне очень точным и остроумным наблюдением).&lt;br /&gt;&lt;br /&gt;Однако, какими бы ни были благими побудительные мотивы инициаторов, имеется очень большая вероятность, что в итоге все сведется к банальному "попилу бабла", бюрократическим играм, созданию теплых мест "для своих", и всего прочего подобного, что мы ежедневно и повсеместно наблюдаем. Будут, конечно, победные реляции, репортажи по ТВ; но постепенно общественное внимание будет ослабевать, обычные российские реалии просочатся в Сколково сквозь построенные антибюрократические преграды, и проект тихо загнется, превратившись в еще один "технопарк", которых и сейчас достаточно.&lt;br /&gt;&lt;br /&gt;Но если бы этим мои ощущения и ограничивались - не стоило тратить время на написание этого поста. Так вот, мне кажется, что не все так плохо; все зависит от того, &lt;span style="font-style:italic;"&gt;под каким углом зрения&lt;/span&gt; смотреть на Сколково.&lt;br /&gt;&lt;br /&gt;Действительно, если исходить из глобального подхода "за державу обидно" - абсолютный скептицизм выглядит вполне оправданным: еще один надутый пузырь, в который вбухивается чертова уйма государственных средств и к которому немедленно присосутся сотни нахлебников в лице "своих" участников, "своих" бюрократов и прочих управителей...&lt;br /&gt;&lt;br /&gt;Но... &lt;span style="font-weight:bold;"&gt;давайте сменим угол зрения&lt;/span&gt;: посмотрим на Сколково не с высоты полета "государственного орла", а с &lt;span style="font-style:italic;"&gt;локальной&lt;/span&gt; точки зрения - со стороны небольших команд, разрабатывающих что-то действительно крутое и перспективное (а самый завзятый скептик все-таки не сможет отрицать, что по части креативности у нас пока еще неплохо...). В самом деле, что там обещают: полное отсутствие бюрократии, освобождение от налогов, минимум бумажной волокиты, своя таможня, своя милиция (!), отдельная территория, рентное жилье по разумным ценам, маркетинговая и инвесторская поддержка, творческая среда,- идеальные условия для работы! Да, знаю, знаю: все это, даже если и будет поначалу, в дальнейшем неизбежно "рассосется": и жилье начнут продавать нуворишам, и своя бюрократия просто не может не самозародиться, и милиция с таможней коррумпируются...&lt;br /&gt;&lt;br /&gt;Но ведь энтропия наступит &lt;span style="font-weight:bold;"&gt;не сразу&lt;/span&gt;, вот в чем все дело!! И вот пока извечные российские реалии не опутали своими щупальцами Сколково (года три минимум будет, как мне кажется) - этот "золотой" период и может оказаться тем, чего не хватает молодым командам. По моему мнению, для подобных стартапов действительно продуктивной была бы такая логика: "Что произойдет со Сколково потом - мы не знаем, и повлиять на это не можем. Но пока здесь есть хорошие условия, которые создали как раз для таких, как мы - странно было бы ими не воспользоваться. Пусть это ненадолго, но нам и нужно два-три года, чтобы раскрутиться".&lt;br /&gt;&lt;br /&gt;...Это все, наверное, правильно, если бы была уверенность, что Сколково и создается, собственно, для подобных компактных коллективов из талантливых и упорных молодых людей, пытающихся сделать что-то, чего до них не было. А вот такой уверенности у меня что-то все меньше и меньше... Об этом - следующий пост про Сколково.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8224163229837394669-1656591339735556799?l=zouev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zouev.blogspot.com/feeds/1656591339735556799/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8224163229837394669&amp;postID=1656591339735556799' title='Комментарии: 5'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8224163229837394669/posts/default/1656591339735556799'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8224163229837394669/posts/default/1656591339735556799'/><link rel='alternate' type='text/html' href='http://zouev.blogspot.com/2011/01/blog-post_11.html' title='Сколково: угол зрения'/><author><name>zouev</name><uri>http://www.blogger.com/profile/09163739178551976623</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8224163229837394669.post-8988007800292322313</id><published>2011-01-03T17:57:00.003+01:00</published><updated>2011-01-03T18:05:39.789+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Публикации'/><category scheme='http://www.blogger.com/atom/ns#' term='Проекты'/><category scheme='http://www.blogger.com/atom/ns#' term='Прочее'/><title type='text'>Веб-сайт</title><content type='html'>Как-то так невольно и неожиданно для меня самого получилось, что какая-то информация обо мне, о моих прошлых и нынешних проектах, публикациях и т.п. вдруг взяла и скомпоновалась в виде кое-как структурированного набора веб-страничек. :-))&lt;br /&gt;&lt;br /&gt;Вот, прошу любить и жаловать:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;eugene.zouev.name&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;(обратите внимание, без www!)&lt;br /&gt;&lt;br /&gt;Там на самом деле больше половины страниц пустые, и, наверное, нет ни одной, содержимое которой меня полностью устраивает. Так что периодически буду туда писать, дописывать, подправлять, изменять. Но вот дизайн вряд ли изменится: нет ни времени, ни желания самому красивые картинки придумывать и ваять. Гугл за меня все придумал, и спасибо ему за это.&lt;br /&gt;&lt;br /&gt;В общем, не судите строго. :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8224163229837394669-8988007800292322313?l=zouev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zouev.blogspot.com/feeds/8988007800292322313/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8224163229837394669&amp;postID=8988007800292322313' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8224163229837394669/posts/default/8988007800292322313'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8224163229837394669/posts/default/8988007800292322313'/><link rel='alternate' type='text/html' href='http://zouev.blogspot.com/2011/01/blog-post_03.html' title='Веб-сайт'/><author><name>zouev</name><uri>http://www.blogger.com/profile/09163739178551976623</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8224163229837394669.post-2140510124133349767</id><published>2011-01-03T17:50:00.002+01:00</published><updated>2011-01-03T17:57:07.552+01:00</updated><title type='text'>Перевод Стандарта Си++</title><content type='html'>Да, друзья и коллеги, я вас, наверное, задолбал уже своими "новостями" насчет перевода... Искренне прошу прощения - и сам хотел бы порадовать "конкретной" новостью, да все не получается.&lt;br /&gt;&lt;br /&gt;В общем, так: перевод выйдет в печатной версии точно. Сейчас ведутся (ну, если честно, после новогодних каникул возобновятся :-)) переговоры с издательствами, которые могли бы выполнить печать.&lt;br /&gt;&lt;br /&gt;Я очень хочу выпустить также и электронную версию; переговоры об этом тоже ведутся.&lt;br /&gt;&lt;br /&gt;Ну что же делать?- не все бывает так, как планировалось. Еще раз прошу извинить за отсутствие реальных новостей. Самому обидно, тем более, что текст-то полностью готов уже довольно давно...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8224163229837394669-2140510124133349767?l=zouev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zouev.blogspot.com/feeds/2140510124133349767/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8224163229837394669&amp;postID=2140510124133349767' title='Комментарии: 7'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8224163229837394669/posts/default/2140510124133349767'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8224163229837394669/posts/default/2140510124133349767'/><link rel='alternate' type='text/html' href='http://zouev.blogspot.com/2011/01/blog-post.html' title='Перевод Стандарта Си++'/><author><name>zouev</name><uri>http://www.blogger.com/profile/09163739178551976623</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8224163229837394669.post-3207682392804636263</id><published>2010-10-15T11:38:00.005+02:00</published><updated>2010-10-15T11:54:06.144+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Публикации'/><category scheme='http://www.blogger.com/atom/ns#' term='Standardization'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>Перевод стандарта: последние новости</title><content type='html'>Вот самая свежая информация.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Первое&lt;/span&gt;. Перевод &lt;span style="font-weight:bold;"&gt;полностью готов&lt;/span&gt;: написан (включая все запланированные приложения), отформатирован для печати, и все такое прочее. Больше 700 страниц текста формата А4. Более того, уже была договоренность с типографией о выпуске пробного тиража в 1000 экземпляров. И еще более того: была запланирована презентация книги на выставке CHIPEXPO в конце этого месяца... &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Второе&lt;/span&gt;. Вся эта активность была в самый последний момент (вчера вечером) &lt;span style="font-style:italic;"&gt;остановлена&lt;/span&gt;. Тиража не будет, не будет и презентации. Не спрашивайте, кто остановил и почему; скажем так: лица, уполномоченные принимать такие решения...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Третье&lt;/span&gt;: что будет. А будет (сначала, по крайней мере) &lt;span style="font-weight:bold;"&gt;электронная версия перевода&lt;/span&gt;. В отличие от печатного варианта, она будет, во-первых, цветная (различные по характеру и смыслу фрагменты текста представлены различными цветами и шрифтами) и, во-вторых, пронизана перекрестными ссылками - на синтаксические правила, на разделы стандарта и так далее. Так что: просто читать с экрана, перескакивая при желании по перекрестным ссылкам. Будет ли возможность печати фрагментов или теста в целом, пока не знаю - ведутся переговоры с теми, кто будет такой продукт непосредственно производить.&lt;br /&gt;&lt;br /&gt;В общем, ничего в жизни просто и быстро не бывает, к сожалению... Обо всех дальнейших планах и новостях буду стараться оперативно сообщать.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8224163229837394669-3207682392804636263?l=zouev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zouev.blogspot.com/feeds/3207682392804636263/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8224163229837394669&amp;postID=3207682392804636263' title='Комментарии: 12'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8224163229837394669/posts/default/3207682392804636263'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8224163229837394669/posts/default/3207682392804636263'/><link rel='alternate' type='text/html' href='http://zouev.blogspot.com/2010/10/blog-post.html' title='Перевод стандарта: последние новости'/><author><name>zouev</name><uri>http://www.blogger.com/profile/09163739178551976623</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8224163229837394669.post-2811319629999461567</id><published>2010-10-13T16:40:00.003+02:00</published><updated>2010-10-13T16:51:15.035+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Публикации'/><category scheme='http://www.blogger.com/atom/ns#' term='Language Tools'/><category scheme='http://www.blogger.com/atom/ns#' term='Standardization'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>Конференция "Разработка ПО 2010"</title><content type='html'>В пятницу 15 октября выступаю на конференции "Разработка ПО 2010". Вот &lt;a href="http://cee-secr.org/lang/ru-ru/"&gt;сайт конференции&lt;/a&gt;. Мое выступление (если организаторы в очередной раз не изменят расписание :-)) в 11.15 в комнате С, в самой маленькой из имеющихся аудиторий. Я не в претензии: мой доклад &lt;span style="font-weight:bold;"&gt;"Семантические интерфейсы языков программирования"&lt;/span&gt; вряд ли вызовет большой приток публики. :-)&lt;br /&gt;&lt;br /&gt;Вроде бы, туда можно прийти даже без регистрации, просто послушать. Надо только иметь с собой паспорт. Адрес (где-то в районе Курского вокзала) и полное расписание есть на указанном сайте. Кстати, в ту же пятницу, в 16.30 там выступает Страуструп: &lt;span style="font-weight:bold;"&gt;"Введение в С++0x"&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;(Это я рекламирую конференцию по просьбе организаторов. :-))&lt;br /&gt;&lt;br /&gt;Новости (важные!) о выходе перевода Стандарта С++ последуют завтра.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8224163229837394669-2811319629999461567?l=zouev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zouev.blogspot.com/feeds/2811319629999461567/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8224163229837394669&amp;postID=2811319629999461567' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8224163229837394669/posts/default/2811319629999461567'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8224163229837394669/posts/default/2811319629999461567'/><link rel='alternate' type='text/html' href='http://zouev.blogspot.com/2010/10/2010.html' title='Конференция &quot;Разработка ПО 2010&quot;'/><author><name>zouev</name><uri>http://www.blogger.com/profile/09163739178551976623</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8224163229837394669.post-8768064448727384048</id><published>2010-03-28T17:49:00.024+02:00</published><updated>2010-03-28T20:14:30.058+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Code Contracts в .NET и монополия C#</title><content type='html'>В последней (четвертой) версии .NET и, соответственно, в VS2010, появились средства спецификации параметров, пред- и постусловий, инвариантов классов и всего того, что с подачи Бертрана Майера называется Code Contracts или Design by Contract.&lt;br /&gt;&lt;br /&gt;Вот пара ссылок:&lt;br /&gt;- &lt;a href="http://msdn.microsoft.com/en-us/devlabs/dd491992.aspx"&gt;Объява из Микрософта&lt;/a&gt;;&lt;br /&gt;- &lt;a href="http://progg.ru/Tags/code-contracts"&gt;Список статей по теме&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Неутомимый и вездесущий Дино Эспозито уже, конечно, отозвался на это новшество несколькими постами:&lt;br /&gt;&lt;br /&gt;- &lt;a href="http://dotnetslackers.com/articles/net/Code-Contracts-Preview-Assert-Assume.aspx"&gt;Assert/Assume&lt;/a&gt;&lt;br /&gt;- &lt;a href="http://dotnetslackers.com/articles/net/Code-Contracts-Preview-Invariants.aspx"&gt;Invariants&lt;/a&gt;&lt;br /&gt;- &lt;a href="http://dotnetslackers.com/articles/net/Code-Contracts-Preview-Preconditions.aspx"&gt;Preconditions&lt;/a&gt;&lt;br /&gt;- &lt;a href="http://dotnetslackers.com/articles/net/Code-Contracts-Preview-PostConditions.aspx"&gt;Postconditions&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Документ с полным описанием новых средств .NET, помеченный этим январем, лежит у Микрософта &lt;a href="http://download.microsoft.com/download/C/2/7/C2715F76-F56C-4D37-9231-EF8076B7EC13/userdoc.pdf"&gt;здесь&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Многие интересующиеся об этом уже знают, но вот что интересно заметить. Возникает ощущение (и чем дальше, тем больше это ощущение крепнет), что Микрософт стремится втиснуть в .NET поддержку всего, &lt;span style="font-style:italic;"&gt;что вообще есть в программировании&lt;/span&gt;. Начав с введения в виртуальную машину и MSIL нормальной системы типов и стековой модели выполнения, адекватной императивным языкам (и, естественно, отразив все это в базовом языке C#), они постепенно начали добавлять - и в систему, и в язык - все новые и новые возможности, иногда даже приниципиально отличающиеся от императивной парадигмы. Типов&lt;span style="font-weight:bold;"&gt;а&lt;/span&gt;я параметризация, технология LINQ, динамическая типизация, теперь вот - контрактное программирование.&lt;br /&gt;&lt;br /&gt;Каждое отдельное нововведение объясняется вполне понятными причинами: и обобщенное программирование нужно и полезно (кто спорит?), и работа с БД непосредственно из программ, и поддержка функциональной парадигмы ("функциональная мафия" из Кембриджского отделения Microsoft Research активность не снижает :-)), и динамическая типизация нужна, чтобы поддерживать скриптовые языки...&lt;br /&gt;&lt;br /&gt;Принципиально важно в контексте моих рассуждений то, что все эти новшества &lt;span style="font-style:italic;"&gt;получают свою поддержку в базовом языке&lt;/span&gt;. И вот в один прекрасный день обнаружится, что программировать под .NET имеет смысл только в этом базовом языке - &lt;span style="font-weight:bold;"&gt;в C# есть все&lt;/span&gt;, и это "все" адекватно поддерживается платформой .NET!&lt;br /&gt;&lt;br /&gt;Наверное, я несколько сгущаю краски, и всегда останутся энтузиасты, предпочитающие и в .NET программировать на F#, Nemerle, Хаскелле, Питоне. Просто ниша для использования этих языков в рамках .NET сузится до совершенно микроскопических размеров.&lt;br /&gt;&lt;br /&gt;Но вот как быть с такими промышленными языками, как Eiffel и Scala? С введением поддержки контрактного программирования C# практически полностью "покроет" почти все преимущества Эйфеля, а то немногое особенное, что еще есть в этом языке, вряд ли окажется причиной выбора этого языка для реальных проектов. И сейчас не очень понятно, какова популярность Эйфеля как такового (в &lt;a href="http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html"&gt;индексе TIOBE&lt;/a&gt; он сильно ниже первых пятидесяти языков), а его присутствие в мире .NET кажется совершенно эфемерным...&lt;br /&gt;&lt;br /&gt;Проект портирования Скалы на .NET все еще, вроде бы, имеет некоторый смысл (уж больно мощный и привлекательный язык, и даже после появления в C# "функциональных" черт в Скале все еще остаются вполне уникальные и очень удобные для программирования свойства), но все равно, потенциальная пользовательская база для этого языка наверняка существенно сократится...&lt;br /&gt;&lt;br /&gt;Повторяю: я не говорю, что происходит катастрофа,- видна &lt;span style="font-style:italic;"&gt;тенденция&lt;/span&gt;: мы все дальше и дальше отодвигаемся от идиллической картины, десять лет назад нарисованной нам маркетологами из Микрософта: мол, неважно, на каком языке программировать, выбирай любой, лишь бы компилятор генерировал CIL-совместимый код.&lt;br /&gt;&lt;br /&gt;"Пусть расцветает тысяча цветов" (или как это китайцы говорили)...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8224163229837394669-8768064448727384048?l=zouev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zouev.blogspot.com/feeds/8768064448727384048/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8224163229837394669&amp;postID=8768064448727384048' title='Комментарии: 12'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8224163229837394669/posts/default/8768064448727384048'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8224163229837394669/posts/default/8768064448727384048'/><link rel='alternate' type='text/html' href='http://zouev.blogspot.com/2010/03/code-contracts-net-c.html' title='Code Contracts в .NET и монополия C#'/><author><name>zouev</name><uri>http://www.blogger.com/profile/09163739178551976623</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8224163229837394669.post-3713450787918746371</id><published>2010-01-07T13:41:00.004+01:00</published><updated>2010-01-07T14:55:13.904+01:00</updated><title type='text'>Перевод Стандарта С++: финиш близок</title><content type='html'>В конце ноября появились сразу две очередные версии черновика стандарта (драфта): документы с номерами &lt;span style="font-weight:bold;"&gt;n2960&lt;/span&gt; и &lt;span style="font-weight:bold;"&gt;n3000&lt;/span&gt;. Пришлось заново проходить весь перевод, вносить правки и переводить новые фрагменты.&lt;br /&gt;&lt;br /&gt;С одной стороны, модификации в документах сделаны по-человечески: красным выделяются удаляемые фрагменты, зеленым - добавляемые. Удобно.&lt;br /&gt;&lt;br /&gt;Но, с другой стороны, эти модификации делаются строго относительно предыдущей версии драфта; правки, внесенные ранее, уже никак не выделяются. А в данном случае для меня это означает, что пришлось проходить свой перевод &lt;span style="font-style:italic;"&gt;дважды&lt;/span&gt;, последовательно внося в него правки из двух версий драфта, так как появились они на сайте комитета одновременно. Не самая творческая работа, как вы понимаете...&lt;br /&gt;&lt;br /&gt;В чем существо модификаций:&lt;br /&gt;&lt;br /&gt;- Разделы 14.10 и 14.11 &lt;span style="font-weight:bold;"&gt;о концептах&lt;/span&gt; удалены полностью. Также удалены все ссылки на него и на его подразделы, а эти ссылки были разбросаны по всему тексту.&lt;br /&gt;&lt;br /&gt;- Раздел 5.1 (он превратился в подраздел 5.1.2) &lt;span style="font-weight:bold;"&gt;о лямбда-выражениях&lt;/span&gt; полностью переписан. Слава Богу, в нем появились примеры, так что самому не нужно теперь их придумывать (а уж собрался было). Однако, переводить пришлось все заново.&lt;br /&gt;&lt;br /&gt;- Очень много мелких правок по всему тексту. Где опечатка исправлена, где уточнение сделано... Вносить их нетрудно, но все равно, занятие это на редкость занудное.&lt;br /&gt;&lt;br /&gt;В общем, итог к настоящему моменту такой: &lt;span style="font-weight:bold;"&gt;перевод полностью готов, осталось сформировать приложения&lt;/span&gt; (ну, и предисловие написать :-)).&lt;br /&gt;&lt;br /&gt;Приложения - это отдельная песня. :-) Из приложений самого драфта в дело пойдет, видимо, только сводка синтаксиса, большинство остальных не столь уж важны (с учетом того, что перевод будет только ядра языка, без стандартных библиотек).&lt;br /&gt;&lt;br /&gt;Зато будет несколько собственных приложений, и вот их-то я сейчас и готовлю. Очень коротко, что там будет:&lt;br /&gt;&lt;br /&gt;- &lt;span style="font-weight:bold;"&gt;Сводка основных понятий/свойств языка&lt;/span&gt;: название (в оригинале и в переводе), его определение, ссылка на место в стандарте и, возможно, комментарий. В общем, "Краткий курс" С++ :-)&lt;br /&gt;&lt;br /&gt;- &lt;span style="font-weight:bold;"&gt;Синтаксис языка в виде диаграмм&lt;/span&gt;, похожих на "железнодорожные" диаграммы, с помощью которых Вирт в свое время представлял синтаксис своих языков. Получается гораздо нагляднее, чем обычные синтаксические правила. Удобно для изучения и полезно в качестве справочника.&lt;br /&gt;&lt;br /&gt;- &lt;span style="font-weight:bold;"&gt;Грамматика С++ в форме входного языка YACC/Bison&lt;/span&gt;. Разумеется, корректная (иначе и приложение из нее делать не стоило :-)), то есть, по ней Bison и некоторые известные его аналоги в состоянии сгенерировать правильный распознаватель. В грамматике, правда, сделаны кое-какие допущения (в чистом виде грамматика С++ в "бизонной" нотации непредставима), но что удивительно и замечательно, удалось свести эти допущения к совершенному минимуму. Технические подробности будут там же в комментариях.&lt;br /&gt;&lt;br /&gt;Похожая грамматика С++ была в свое время опубликована в виде приложения к русскому переводу книги Ахо/Ульмана ("Dragon Book") - но здесь я целиком ее переписал, учтя все новые синтаксические конструкции.&lt;br /&gt;&lt;br /&gt;- &lt;span style="font-weight:bold;"&gt;Пакет маленьких примеров программ на С++&lt;/span&gt;, иллюстрирующих наиболее характерные свойства языка. Пакет сделан на основе тестового набора, который используется в Интерстроне для тестирования нашего компилятора.&lt;br /&gt;&lt;br /&gt;- &lt;span style="font-weight:bold;"&gt;Удаленные разделы&lt;/span&gt; о концептах. Хотя концепты, по всей видимости, будут радикально переделаны, да и произойдет это только в будущих версиях стандарта, мы все-таки опубликуем эти удаленные разделы, пусть и в виде приложения. Определенная ценность в них есть, да и проделанной работы по переводу жалко. :-) К тому же, многие просят и советуют оставить.&lt;br /&gt;&lt;br /&gt;Вот как-то так... :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8224163229837394669-3713450787918746371?l=zouev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zouev.blogspot.com/feeds/3713450787918746371/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8224163229837394669&amp;postID=3713450787918746371' title='Комментарии: 11'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8224163229837394669/posts/default/3713450787918746371'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8224163229837394669/posts/default/3713450787918746371'/><link rel='alternate' type='text/html' href='http://zouev.blogspot.com/2010/01/blog-post_07.html' title='Перевод Стандарта С++: финиш близок'/><author><name>zouev</name><uri>http://www.blogger.com/profile/09163739178551976623</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8224163229837394669.post-4519074172506728477</id><published>2010-01-04T17:39:00.003+01:00</published><updated>2010-01-04T17:56:20.644+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Прочее'/><title type='text'>Заспамили...</title><content type='html'>Что-то за последнее время в блогспоте спам повалился просто невиданными темпами. Каждый день по нескольку идиотских "комментариев" появляется, зачастую к очень старым статьям. И ладно бы народ что-то рекламировал, свои фирмы или сервисы: "Разработка сайтов", например. Такое тоже есть, но удивительно, что такие сообщения не составляют большинства! Противно, конечно, когда твой блог используют для продвижения каких-то левых предложений - но я чувствую себя последним идиотом, обнаруживая в блоге такие, например, "комментарии":&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;"Хорошо пишете. Надеюсь, когда-нибудь увижу нечто подобное и на своем блоге…"&lt;br /&gt;&lt;br /&gt;"Без особого преувеличения можно точно сказать, что пост тему раскрыл на все 100 процентов"&lt;br /&gt;&lt;br /&gt;"Да уж… Тут как говорится: Амбар крепок, да углы худы"&lt;br /&gt;&lt;br /&gt;"Так-так… надо будет присмотреться к этой области"&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Вот скажите мне, какие цели преследуют авторы подобных текстов??? Какая им выгода от подобных сообщений? Никаких ссылок, линков и прочего в них нет, автор - "Анонимный". Зачем они пишут (или пускают "пишущих" роботов)?? Не понимаю...&lt;br /&gt;&lt;br /&gt;Но нет худа без добра: не выдержал и прошел по всем своим постам, вычищая подобное,- и обнаружил много комментариев по делу, на которые в прежней суете не управился ответить. Друзья, прошу прощения, что не всегда был оперативен, и за то, что, каюсь, просто забывал ответить! Буду исправляться. :-)&lt;br /&gt;&lt;br /&gt;И хорошо бы, конечно, блог активизирвать. В каждый последующий год число постов (и так небольшое) падает по сравнению с предыдущим - хотя тем для постов меньше не становится. Буду исправляться. :-))&lt;br /&gt;&lt;br /&gt;А пока - всех с Новым годом!!!&lt;br /&gt;(В России, вроде, еще каникулы, а у нас в Европах праздники кончились, настали рабочие будни...)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8224163229837394669-4519074172506728477?l=zouev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zouev.blogspot.com/feeds/4519074172506728477/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8224163229837394669&amp;postID=4519074172506728477' title='Комментарии: 9'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8224163229837394669/posts/default/4519074172506728477'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8224163229837394669/posts/default/4519074172506728477'/><link rel='alternate' type='text/html' href='http://zouev.blogspot.com/2010/01/blog-post.html' title='Заспамили...'/><author><name>zouev</name><uri>http://www.blogger.com/profile/09163739178551976623</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8224163229837394669.post-2132904083877576970</id><published>2009-11-16T12:58:00.000+01:00</published><updated>2009-11-16T12:59:07.877+01:00</updated><title type='text'>Опять хвастаюсь :-))</title><content type='html'>&lt;!-- Результат теста. Shkolazhizni.ru --&gt;&lt;div style="border: 1px solid #F0F0F0; padding: 10px; background: white; text-align: left; width: 250px;"&gt;&lt;a href="http://shkolazhizni.ru/test/"&gt;&lt;img border="0" title="Познавательные тесты" src="http://shkolazhizni.ru/img/logo-tests.gif"/&gt;&lt;/a&gt;&lt;div style="margin: 3px 0pt 0px; background: #F0F0F0; width: 100%; height: 1px;"&gt;&lt;/div&gt;&lt;div style="padding: 5px 0pt; font-family: Georgia,Times; font-size: 16px;"&gt;Шпрехен зи руссиш?&lt;/div&gt;&lt;div style="color:#505050; font-family: Arial,Tahoma; font-size: 12px;"&gt;&lt;a href="http://shkolazhizni.ru/test/21/"&gt;&lt;img  align="left" src="http://shkolazhizni.ru/img/tests/21_small.jpg" style="border: 1px solid #F0F0F0; margin-right: 10px;" alt="Шпрехен зи руссиш?" title="Шпрехен зи руссиш?"/&gt;&lt;/a&gt;Тест на знание заимствованных слов, имён собственных и других хитростей русского языка. Такой небольшой &amp;laquo;диктант&amp;raquo;, позволяющий проверить вашу грамотность. &lt;/div&gt;&lt;div style="padding: 5px 0pt; font-family: Georgia,Times; font-size: 16px;" id="res_title"&gt;&lt;b&gt;Зуев&lt;/b&gt; прошел этот тест с результатом:&lt;/div&gt;&lt;div style="color: #347c00; font-family: Arial,Tahoma; font-weight: bold; font-size: 12px;"&gt;Ни одной ошибки! Столь доскональное знание русского языка выдаёт в вас профессионала.&lt;/div&gt;&lt;div style="margin: 7px 0pt 5px; background: #F0F0F0; width: 100%; height: 1px;"&gt; &lt;/div&gt;&amp;rarr; &lt;a href="http://shkolazhizni.ru/test/21/"&gt;Пройти тест "Шпрехен зи руссиш?"&lt;/a&gt;&lt;br&gt;&amp;rarr; &lt;a href="http://shkolazhizni.ru/test/"&gt;Все познавательные тесты на ШколаЖизни.ру&lt;/a&gt;&lt;/div&gt;&lt;!-- Результат теста. Shkolazhizni.ru --&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8224163229837394669-2132904083877576970?l=zouev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zouev.blogspot.com/feeds/2132904083877576970/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8224163229837394669&amp;postID=2132904083877576970' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8224163229837394669/posts/default/2132904083877576970'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8224163229837394669/posts/default/2132904083877576970'/><link rel='alternate' type='text/html' href='http://zouev.blogspot.com/2009/11/blog-post.html' title='Опять хвастаюсь :-))'/><author><name>zouev</name><uri>http://www.blogger.com/profile/09163739178551976623</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8224163229837394669.post-374782978091852595</id><published>2009-10-08T16:24:00.003+02:00</published><updated>2009-10-08T16:31:12.801+02:00</updated><title type='text'>Хвастаюсь :-)</title><content type='html'>Хотя моей заслуги тут никакой, но все-таки...&lt;div&gt;Опубликован рейтинг&lt;b&gt; двухсот&lt;/b&gt; лучших университетов мира за 2009 год.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.timeshighereducation.co.uk/Rankings2009-Top200.html"&gt;http://www.timeshighereducation.co.uk/Rankings2009-Top200.html&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.timeshighereducation.co.uk/Rankings2009-Top200.html"&gt;&lt;/a&gt;ETH Zurich, в котором я проработал шесть лет,- &lt;b&gt;на 20-м месте&lt;/b&gt;: лучший университет в континентальной Европе (выше только штатовские и английские универы).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;EPFL Lausanne, где я работаю сейчас,- &lt;b&gt;на 42-месте&lt;/b&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Для сравнения: МГУ &lt;b&gt;на 155 месте&lt;/b&gt;, питерский универ - &lt;b&gt;на 168-м&lt;/b&gt;&lt;/div&gt;&lt;div&gt;(в МГУ, впрочем, я тоже работал :-))&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8224163229837394669-374782978091852595?l=zouev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zouev.blogspot.com/feeds/374782978091852595/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8224163229837394669&amp;postID=374782978091852595' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8224163229837394669/posts/default/374782978091852595'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8224163229837394669/posts/default/374782978091852595'/><link rel='alternate' type='text/html' href='http://zouev.blogspot.com/2009/10/blog-post_08.html' title='Хвастаюсь :-)'/><author><name>zouev</name><uri>http://www.blogger.com/profile/09163739178551976623</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8224163229837394669.post-7100195327466820601</id><published>2009-10-01T15:57:00.006+02:00</published><updated>2009-10-01T17:01:54.739+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Публикации'/><category scheme='http://www.blogger.com/atom/ns#' term='Standardization'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>Хорошо забытое старое</title><content type='html'>Вот, друзья, подтверждение моей старой идеи насчет полезности двуязычного текста "канонического" описания языка программирования. Недавно откопал у себя такую вот книгу:&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Пересмотренное сообщение об Алголе-68. Москва, "Мир", 1979 год. Под редакцией А.П.Ершова.&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Вот скан обложки:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_bSVAvG6-TEw/SsS3LFNGfgI/AAAAAAAAAxE/R62cz714kCk/s1600-h/IMG_0001.jpg"&gt;&lt;img src="http://1.bp.blogspot.com/_bSVAvG6-TEw/SsS3LFNGfgI/AAAAAAAAAxE/R62cz714kCk/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; " /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;А внутри вот что: на левой странице каждого разворота - оригинальный, английский текст описания языка, на правой - перевод, с поабзацным соответствием. Смотрите сами:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_bSVAvG6-TEw/SsS30-zR7TI/AAAAAAAAAxM/a04jAXG3LR4/s1600-h/CaptureX.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 256px;" src="http://3.bp.blogspot.com/_bSVAvG6-TEw/SsS30-zR7TI/AAAAAAAAAxM/a04jAXG3LR4/s320/CaptureX.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5387633175081119026" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;Скажут: ну что там, какой-то древний язык, который никому давно уже не нужен... Но ведь дело не в языке - дело в принципе подачи материала. А такой двуязычный текст, на мой взгляд, делает изучение языка на порядок удобнее и быстрее, нежели любые "одноязычные" тексты, пусть даже самые блестящие. Не хочу сейчас повторять свои аргументы...&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Замечу только, что в то время выход языка Алгол-68 представлялся (да и был) очень важным, едва ли не эпохальным, событием в программировании. Язык несомненно очень мощный, с хорошим "научным" базисом, с продуманным и элегантным дизайном, систематически и тщательно спроектированный. Да, сложный; да, местами избыточно сложный; да, кое-какие особенности вряд ли были оправданы для языка массового применения, каким он задумывался  (в частности, сами принципы построения, с двухуровневой грамматикой, с разделением формальных правил и "особенностей представления")...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Но так или иначе, к языку тогда относились очень серьезно, и книга, которую я упоминаю,- тому наглядный пример.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Так что ничего я не выдумал - все уже было...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;И последнее. Весь этот пост на самом деле - плач по несбывшемуся: наш перевод выйдет в &lt;i&gt;&lt;b&gt;одно&lt;/b&gt;&lt;/i&gt;язычном формате. Публиковать английский оригинал "от себя" мы не имеем права. Если бы Госстандарт нам помог получить права публикации - может, что-то бы и получилось. Но ребята там сидят какие-то вялые - от них даже ответа по существу не добьешься; только пожелания успехов (это не шутка: таким пожеланием заканчивалась их очередная отписка)...&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8224163229837394669-7100195327466820601?l=zouev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zouev.blogspot.com/feeds/7100195327466820601/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8224163229837394669&amp;postID=7100195327466820601' title='Комментарии: 5'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8224163229837394669/posts/default/7100195327466820601'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8224163229837394669/posts/default/7100195327466820601'/><link rel='alternate' type='text/html' href='http://zouev.blogspot.com/2009/10/blog-post.html' title='Хорошо забытое старое'/><author><name>zouev</name><uri>http://www.blogger.com/profile/09163739178551976623</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_bSVAvG6-TEw/SsS3LFNGfgI/AAAAAAAAAxE/R62cz714kCk/s72-c/IMG_0001.jpg' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8224163229837394669.post-7247355221256100794</id><published>2009-07-23T12:30:00.004+02:00</published><updated>2009-07-23T12:55:50.840+02:00</updated><title type='text'>Концепции или концепты?</title><content type='html'>&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Появился комментарий такого рода:&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style=" border-collapse: collapse; font-family:arial;"&gt;&lt;span class="Apple-style-span"  style="color:#3366FF;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;...давайте концепции не будем обзывать концептами?&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; "&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; "&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Хотя этих самых концепций-концептов в языке - по крайней мере, в течение ближайших лет - не будет, все-таки имеет смысл сказать пару слов по этому поводу.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Конечно, английское concept вообще-то переводится на русский как "концепция", "понятие". Но, как мне кажется, было бы неправильно буквально использовать такой вариант перевода. Дело в том, что "прямой" перевод обозначает - по крайней мере, в русском языке - нечто обобщенное, абстрактное. Некую идею, на основе которой строится какая-то теория, система взглядов и т.п. Например, "концепция бесконечности Вселенной" или что-то подобное.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;В нашем же случае речь идет не о какой-либо идее, взгляде, теории - а о &lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;конкретном механизме конкретного языка&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;, введенном в него для решения вполне определенных задач (насколько этот механизм адекватен задачам - другой вопрос). И использовать для обозначения &lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;языкового м&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;еханизма&lt;/span&gt;&lt;/i&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; слово, традиционно обозначающее нечто "неконкретное", "абстрактное" - было бы неправильным. Тут нужно что-то близкое, но другое. И слово &lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;концепт&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;, на мой взгляд, лучше отражает именно конкретность, предметность того, о чем идет речь: совокупность синтаксических и семантических правил, определяющих некий языковой механизм.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;В английском языке, по-моему, не столь чувствуются подобные тонкие смысловые различия, потому они довольно легко используют для нового понятия любое более-менее подходящее слово. Не сомневаюсь, что они запросто могут выдать что-то вроде &lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;the concept of concepts&lt;/span&gt;&lt;/i&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;. Но сказать по-русски "понятие концепции" или "механизм концепций" - как хотите, но это ужасно и выглядит как насилие над языком, и никто не заставит меня это повторить...&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;И последнее: пафос комментария словно бы предполагает, что C++ concepts уже широко обсуждаются в русскоязычных источниках и там уже вовсю называются концепциями. Рискну предположить, что это все-таки не совсем так. :-)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;По всему по этому: только &lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;концепты&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;. :-))&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8224163229837394669-7247355221256100794?l=zouev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zouev.blogspot.com/feeds/7247355221256100794/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8224163229837394669&amp;postID=7247355221256100794' title='Комментарии: 6'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8224163229837394669/posts/default/7247355221256100794'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8224163229837394669/posts/default/7247355221256100794'/><link rel='alternate' type='text/html' href='http://zouev.blogspot.com/2009/07/blog-post_23.html' title='Концепции или концепты?'/><author><name>zouev</name><uri>http://www.blogger.com/profile/09163739178551976623</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8224163229837394669.post-4814713540332195547</id><published>2009-07-23T11:54:00.004+02:00</published><updated>2009-07-23T12:20:58.425+02:00</updated><title type='text'>Concepts are gone!!</title><content type='html'>Многие уже знают, но все равно: ошеломляющая новость!&lt;div&gt;&lt;br /&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;Комитет по стандартизации C++ проголосовал за удаление механизма концептов из нового Стандарта Си++&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;. &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Вот ссылка, по которой  рассказываются детали и обсуждаются причины и последствия:&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.informit.com/guides/content.aspx?g=cplusplus&amp;amp;seqNum=441"&gt;http://www.informit.com/guides/content.aspx?g=cplusplus&amp;amp;seqNum=441&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Вот на что упал взгляд при первом чтении (перевод вольный):&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#3366FF;"&gt;В понедельник 13 июля на очередном заседании комитета по стандартизации С++ во Франкфурте по результатам голосования концепты были удалены из C++0x. Эта шокирующая новость вызывает множество вопросов и беспокойств...  Когда я впервые об этом услышал, я просто не поверил... Концепты представляли собой наиболее существенное добавление в ядро С++ с 1998 года &lt;/span&gt;(с момента выпуска первого стандарта - Е.З.)&lt;span class="Apple-style-span"  style="color:#3366FF;"&gt;. В течение последних &lt;b&gt;пяти лет &lt;/b&gt;обсуждение механизма концептов проходило на каждом заседании комитета... После десятков официальных сообщений, описаний и статей, посвященных представлению и продвижению концептов, казалось крайне маловероятным, что непосредственно перед финишной чертой, в результате драматического голосования этот механизм будет выброшен...&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;По-моему, это беспрецедентно: на самом последнем этапе стандартизации, когда даже редакторские правки в финальный текст вносятся неохотно, а голосование представляет собой формальность, сделать такое... Надо полагать, были на то весомые причины. Где-то было написано, что, мол, "никто из участников голосования не был счастлив от такого решения"...&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'Lucida Grande';"&gt;&lt;span class="Apple-style-span" style=" line-height: 19px;"&gt;&lt;span class="Apple-style-span"  style="font-family:Georgia;"&gt;&lt;span class="Apple-style-span" style=" line-height: normal;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Помимо очевидной важности этого события "вообще", оно непосредственно влияет и на мою работу: простите, ребята, &lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;я уже перевел почти сто страниц текста&lt;/span&gt;&lt;/i&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; - громадный кусок главы 14 драфта!.. И что мне теперь, выкидывать все это? Помимо этого, упоминание концептов и понятий, к ним относящихся, разбросано по всему тексту стандарта - и теперь придется лазить по всему тысячестраничному тексту и все эти упоминания вычищать?..&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8224163229837394669-4814713540332195547?l=zouev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zouev.blogspot.com/feeds/4814713540332195547/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8224163229837394669&amp;postID=4814713540332195547' title='Комментарии: 9'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8224163229837394669/posts/default/4814713540332195547'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8224163229837394669/posts/default/4814713540332195547'/><link rel='alternate' type='text/html' href='http://zouev.blogspot.com/2009/07/concepts-are-gone.html' title='Concepts are gone!!'/><author><name>zouev</name><uri>http://www.blogger.com/profile/09163739178551976623</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8224163229837394669.post-7381333929331710511</id><published>2009-07-17T16:19:00.008+02:00</published><updated>2009-07-17T16:38:14.258+02:00</updated><title type='text'>Примеры комментариев</title><content type='html'>&lt;div&gt;&lt;div style="text-align: center; "&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;По просьбе &lt;/span&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; "&gt;&lt;a href="http://www.blogger.com/profile/15875277007650610928" target="_blank" style="color: rgb(42, 93, 176); "&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Ilya Kulakov&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; привожу два примера того, как могли бы выглядеть комментарии.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; "&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Первый пример (не знаю, хорошо ли будет видно...):&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_bSVAvG6-TEw/SmCKl1Dr5qI/AAAAAAAAAwU/oRTqZJ01bek/s1600-h/Capture.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 356px;" src="http://1.bp.blogspot.com/_bSVAvG6-TEw/SmCKl1Dr5qI/AAAAAAAAAwU/oRTqZJ01bek/s400/Capture.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5359435939073222306" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;div style="text-align: left;"&gt;&lt;span class="Apple-style-span"  style="color:#0000EE;"&gt;&lt;span class="Apple-style-span" style="text-decoration: underline;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: arial; border-collapse: collapse; "&gt;(Для особо внимательных: в этом кусочке есть опечатка. Она уже исправлена. Капчу переделывать лень. :-))&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: arial; border-collapse: collapse; "&gt;Второй пример - даже не комментарий, а как бы просто "маркер": он говорит, что, мол, в этом месте неплохо бы написать комментарий такого-то содержания. Такие маркеры также приветствуются.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse;"&gt;&lt;span class="Apple-style-span" style="border-collapse: separate; font-family: Georgia; "&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_bSVAvG6-TEw/SmCK6WmlzPI/AAAAAAAAAwc/ptYqsSMC1AQ/s1600-h/Capture_2.jpg"&gt;&lt;img src="http://1.bp.blogspot.com/_bSVAvG6-TEw/SmCK6WmlzPI/AAAAAAAAAwc/ptYqsSMC1AQ/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; " /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="font-family:arial;font-size:7;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-size: 48px;"&gt;&lt;span class="Apple-style-span"  style="font-size:130%;"&gt;&lt;span class="Apple-style-span" style="font-size: 16px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:arial;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse;"&gt;И последнее замечание. На самом деле, комментарии вовсе не обязаны быть "умными". У меня полно коротеньких комментариев типа "&lt;span class="Apple-style-span"  style="color:#3366FF;"&gt;об этом подробнее сказано в таком-то разделе&lt;/span&gt;", "&lt;span class="Apple-style-span"  style="color:#3366FF;"&gt;здесь такой-то термин использован неправильно, надо такой-то&lt;/span&gt;" и даже "&lt;span class="Apple-style-span"  style="color:#3366FF;"&gt;простите за буквоедство, но здесь опечатка&lt;/span&gt;"...&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8224163229837394669-7381333929331710511?l=zouev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zouev.blogspot.com/feeds/7381333929331710511/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8224163229837394669&amp;postID=7381333929331710511' title='Комментарии: 3'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8224163229837394669/posts/default/7381333929331710511'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8224163229837394669/posts/default/7381333929331710511'/><link rel='alternate' type='text/html' href='http://zouev.blogspot.com/2009/07/blog-post_17.html' title='Примеры комментариев'/><author><name>zouev</name><uri>http://www.blogger.com/profile/09163739178551976623</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_bSVAvG6-TEw/SmCKl1Dr5qI/AAAAAAAAAwU/oRTqZJ01bek/s72-c/Capture.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8224163229837394669.post-1539563436469833011</id><published>2009-07-16T17:17:00.004+02:00</published><updated>2009-07-16T18:18:11.091+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Публикации'/><category scheme='http://www.blogger.com/atom/ns#' term='Standardization'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>Перевод Стандарта: на распутье...</title><content type='html'>Тут вот какое дело.&lt;div&gt;В последние дни я (в который раз) просмотрел то, что сделал, и пришел к такому неутешительному выводу. Перевод как таковой готов практически полностью - осталось пару-тройку терминов уточнить, да кое-какие стилистические корявости поправить. Работы на неделю. Ну, еще приложения подготовить - еще недели три более-менее спокойной работы. Так что, в принципе, можно (было бы) переходить к к обсуждению технических деталей, связанных с публикацией. Но...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Комментарии&lt;/b&gt;! Проблема в том, что их... не то чтобы мало, но недостаточно для того, чтобы дать всей работе в целом некое новое качество, сделать ее в каком-то смысле уникальной - ну и, конечно, полезной для программистов и вообще всех, так или иначе причастных к разработке программ на Си++.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Дело в том, что в одиночку я сейчас никак не тяну написать комментарии в том объеме и качестве, в каком хотелось бы и задумывалось. Коллеги, которые помогали мне в этой работе, по ряду вполне уважительных причин сейчас тоже не в состоянии активно в ней участвовать.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Так что сейчас передо мной стоит дилемма: остановить содержательную работу над комментариями и выпускать перевод в том виде, как он есть в данный момент, или... не торопиться и продолжать неспешную работу в расчете на то, что до октября (предполагаемый срок формального опубликования Стандарта Си++) достаточный объем комментариев наберется (но тогда книга выйдет гораздо позже изначально задуманного и, не дай Бог, кто-нибудь опередит :-)).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Какой вариант правильный - честно, не знаю. (И немного рассчитываю на "помощь зала" :-)).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Есть, правда, еще один вариант, связанный с этой самой "помощью зала"... Что если призвать на помощь добровольцев? Идея может быть такой: те, кто считает себя более-менее сведущим в языке и у кого есть содержательные мысли относительно того или иного языкового свойства, могут поступить так:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;- Скачать текст предварительного Стандарта.&lt;/div&gt;&lt;div&gt;- Найти в нем раздел/абзац, относящийся к интересующей теме.&lt;/div&gt;&lt;div&gt;- Написать к нему комментарий!&lt;/div&gt;&lt;div&gt;- Прислать его мне. :-)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Может, попробовать?&lt;/div&gt;&lt;div&gt;Если кому-то это предложение покажется интересным, то вот некоторые детали:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;- Текст предварительного стандарта находится по адресу&lt;br /&gt;&lt;a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2800.pdf"&gt;http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2800.pdf&lt;/a&gt;&lt;/div&gt;&lt;div&gt;- Комментарии пишутся по-русски&lt;/div&gt;&lt;div&gt;- Комментарий должен явно относиться к конкретному абзацу или разделу текста&lt;/div&gt;&lt;div&gt;- Комментарий должен быть коротким (два-три-четыре абзаца текста), нейтральным по стилистике и нести полезную информацию; при этом допускаются как конкретные соображения ("данное правило введено для того-то и того-то"), так и рассуждения общего характера ("в ранних версиях языка это было по-другому" - и почему изменено).&lt;/div&gt;&lt;div&gt;- В комментариях могут быть короткие примеры программ, выдержанные в стилистике других примеров, имеющихся в Стандарте.&lt;/div&gt;&lt;div&gt;- Комментарии могут содержать ссылки на известные публикации, типа книг Страуструпа, Саттера, Александреску, Мейера и т.д., в которых комментируемое свойство объяснено подробнее и понятнее, чем в Стандарте. Допускаются прямые цитаты из подобных источников (разумеется, с указанием этих источников).&lt;/div&gt;&lt;div&gt;- Присылать свои тексты можно либо в виде комментариев к этому посту (что, между прочим, может способствовать их обсуждению и повышению качества), либо непосредственно на мой электронный адрес из профиля.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Со своей стороны, я гарантирую внимательное и доброжелательное рассмотрение всех комментариев без исключения и честную попытку взять из них максимум полезного для целей перевода. В то же время я оставляю за собой право редактирования комментариев, выбора тех вариантов перевода терминов, которые приняты и используются в данном переводе. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Кроме того, все добровольцы, чей комментарий (хотя бы один) войдет в окончательный текст, будут упомянуты (если они не будут возражать, конечно) в предисловии. Вдобавок, скажем, трем самым активным комментаторам я буду готов подарить экземпляр книги, когда он выйдет из печати.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;(Расписался... Начал "заупокой" и в процессе сам увлекся этой идеей. :-))&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Ну, и последнее. Комментарии принимаются по всему тексту "языковой части" стандарта (&lt;b&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;без библиотеки!&lt;/span&gt;&lt;/b&gt;- &lt;b&gt;до главы 16 включительно&lt;/b&gt;). Но есть наиболее интересные для меня места, в которых комментариев пока недостаточно:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;- Лямбда-выражения (раздел 5.1.1) - текст короткий, но важный, и ни одного примера!- вот бы кто-нибудь с "функционально-устроенной головой" высказал свое отношение! :-))&lt;/div&gt;&lt;div&gt;- Шаблоны в целом (глава 14) и механизм концептов в особенности (разделы 14.9, 14.10)&lt;/div&gt;&lt;div&gt;- Совместное использования (глава 13)&lt;/div&gt;&lt;div&gt;- Обработка исключительных ситуаций (глава 15)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Вот как-то так. :-)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8224163229837394669-1539563436469833011?l=zouev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zouev.blogspot.com/feeds/1539563436469833011/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8224163229837394669&amp;postID=1539563436469833011' title='Комментарии: 12'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8224163229837394669/posts/default/1539563436469833011'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8224163229837394669/posts/default/1539563436469833011'/><link rel='alternate' type='text/html' href='http://zouev.blogspot.com/2009/07/blog-post_16.html' title='Перевод Стандарта: на распутье...'/><author><name>zouev</name><uri>http://www.blogger.com/profile/09163739178551976623</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8224163229837394669.post-8258852320236619803</id><published>2009-07-09T13:30:00.005+02:00</published><updated>2009-07-16T17:16:17.386+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Standardization'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>Новое в Си++: концепты</title><content type='html'>&lt;h3 style="margin-top:0cm;margin-right:0cm;margin-bottom:6.0pt;margin-left: 35.4pt"&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span" style=" font-weight: normal; "&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Этот текст содержит краткий обзор основных возможностей концептов – нововведения в новый стандарт Си++, позволяющего накладывать ограничения на параметры шаблонов. Показаны преимущества концептов при диагностике ошибок в шаблонах, использование отображений концептов для адаптации конкретных типов к использованию в качестве параметров шаблонов.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;&lt;h3 style="margin-top:0cm;margin-right:0cm;margin-bottom:6.0pt;margin-left: 35.4pt"&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span" style=" font-weight: normal; "&gt;&lt;span class="Apple-style-span"&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Обзор по моей просьбе написан &lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Станиславом Михалковичем&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;, доцентом Южного Федерального университета (Ростов-на-Дону), и выкладывается здесь с его любезного разрешения. Я сделал только очень небольшие редакторские правки и добавил немного замечаний (&lt;/span&gt;&lt;span style="color:blue;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;синим шрифтом&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;), иногда эмоционально-окрашенных. &lt;/span&gt;&lt;/span&gt;&lt;span style=" font-family:Wingdings;mso-ascii-font-family:&amp;quot;Times New Roman&amp;quot;;mso-hansi-font-family: &amp;quot;Times New Roman&amp;quot;;mso-char-type:symbol;mso-symbol-font-family:Wingdings;"&gt;&lt;span style="font-family:Wingdings;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;J&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;&lt;h3 style="margin-top:0cm;margin-right:0cm;margin-bottom:6.0pt;margin-left: 35.4pt"&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span" style=" font-weight: normal; "&gt;&lt;span class="Apple-style-span"&gt;&lt;span style=" font-family:Wingdings;mso-ascii-font-family:&amp;quot;Times New Roman&amp;quot;;mso-hansi-font-family: &amp;quot;Times New Roman&amp;quot;;mso-char-type:symbol;mso-symbol-font-family:Wingdings;"&gt;&lt;span style="font-family:Wingdings;"&gt;&lt;span class="Apple-style-span"  style="font-family:Georgia;"&gt;&lt;span style="color:blue;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;В обзор вошли не все аспекты механизма концептов; в частности, ничего не сказано об &lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;архетипах&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; и &lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;аксиомах&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;. Но не все же сразу. &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Wingdings; mso-ascii-font-family:&amp;quot;Times New Roman&amp;quot;;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;; mso-char-type:symbol;mso-symbol-font-family:Wingdings;color:blue;"&gt;&lt;span style="font-family:Wingdings;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;J&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; От обсуждений типа «зачем это нужно», «нужно ли вообще» давайте пока воздержимся. В том или ином виде ограничения на параметры шаблона можно задавать почти во всех современных языках, содержащих подобные средства: в Аде, в &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"  style="color:blue;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Java&lt;/span&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;/&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"  style="color:blue;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;C&lt;/span&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;#, в &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"  style="color:blue;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Scala&lt;/span&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;  &lt;p class="MsoNormal" style="margin-bottom:6.0pt;text-align:justify;text-indent: 36.0pt"&gt;&lt;span style="color:blue;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Итак, &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;концепты в новом &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;C&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;++ – это средства задания ограничений на параметры шаблонов. Они представляют собой специальным образом оформленный набор объявлений, которые параметр шаблона должен реализовывать.&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:6.0pt;text-align:justify;text-indent: 36.0pt"&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Рассмотрим вначале пример шаблона стандартного алгоритма &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"  style="font-family:&amp;quot;;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;find&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;без использования концептов:&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-top:0cm;margin-right:0cm;margin-bottom:6.0pt; margin-left:35.4pt"&gt;&lt;b&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;template&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;typename&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; Iter, &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;typename&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; V&gt;&lt;br /&gt;Iter find(Iter first, Iter last, V v) {&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;    while&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; (first != last &amp;amp;&amp;amp; *first != v)&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;        ++first;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;    return&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; first;&lt;br /&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:6.0pt;text-align:justify"&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Очевидно, что тип &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"  style="font-family:&amp;quot;;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Iter&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; должен удовлетворять следующим условиям:&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;ol style="margin-top:0cm" start="1" type="1"&gt;  &lt;li class="MsoNormal" style="margin-bottom:6.0pt;text-align:justify;mso-list:      l0 level1 lfo1;tab-stops:list 36.0pt"&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Объекты      типа &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"  style="font-family:&amp;quot;;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Iter&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; должны      быть сравнимы на &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;quot;;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;!=&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;.&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;  &lt;li class="MsoNormal" style="margin-bottom:6.0pt;text-align:justify;mso-list:      l0 level1 lfo1;tab-stops:list 36.0pt"&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;К      объектам типа &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"  style="font-family:&amp;quot;;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Iter&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; можно применять префиксную операцию &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"  style="font-family:&amp;quot;;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;++&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;.&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;  &lt;li class="MsoNormal" style="margin-bottom:6.0pt;text-align:justify;mso-list:      l0 level1 lfo1;tab-stops:list 36.0pt"&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Объекты      типа &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"  style="font-family:&amp;quot;;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Iter&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; можно      разыменовывать.&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt;  &lt;p class="MsoNormal" style="margin-bottom:6.0pt;text-align:justify"&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Кроме того, имеется условие, связывающее типы &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;Iter&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; &lt;/span&gt;и &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"  style="font-family:&amp;quot;;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;V&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;: &lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;ol style="margin-top:0cm" start="4" type="1"&gt;  &lt;li class="MsoNormal" style="margin-bottom:6.0pt;text-align:justify;mso-list:      l0 level1 lfo1;tab-stops:list 36.0pt"&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Разыменованные      объекты типа &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;Iter&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; &lt;/span&gt;можно сравнивать с объектами типа &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;V&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; на &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;quot;;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;!=&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;.&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt;  &lt;p class="MsoNormal" style="margin-bottom:6.0pt;text-align:justify;text-indent: 36.0pt"&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;В C++ стандарта 1998/2003 гг. проверка данных условий осуществляется при настройке шаблона. Например, при компиляции вызова&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;find&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;(1,5,0)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; в результате выведения получим: &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;Iter&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;=&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;int&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;, &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;V&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;=&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;int&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;. При попытке компиляции тела функции &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;find&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;с указанными типами возникнет ошибка: условие 3 не выполняется. Таким образом, ошибка компиляции возникнет на достаточно позднем этапе – при попытке компиляции тела настроенной версии &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;find&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;int&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;int&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;. &lt;/span&gt;&lt;span style="color:blue;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;На практике это приводит к неадекватным по существу и совершенно безумным по форме диагностическим сообщениям, в которых фигурируют длиннейшие абсолютно нечитаемые имена настроенных шаблонов (в которых уже сделаны подстановки).&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:6.0pt;text-align:justify;text-indent: 36.0pt"&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Рассмотрим теперь версию того же алгоритма &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"  style="font-family:&amp;quot;;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;find&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;с использованием концептов:&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-top:0cm;margin-right:0cm;margin-bottom:6.0pt; margin-left:35.4pt"&gt;&lt;b&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;template&lt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span lang="EN-US"&gt;&lt;inputiterator&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;typename &lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;V&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;requires&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; EqualityComparable&lt;/span&gt;&lt;/span&gt;&lt;iter::value_type,&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;br /&gt;Iter find(Iter first, Iter last, V v) { ... }&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/iter::value_type,&gt;&lt;/inputiterator&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:6.0pt;text-align:justify"&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Здесь&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;тип&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"  style="font-family:&amp;quot;;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Iter&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;удовлетворяет&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;концепту&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;InputIterator&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;, &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;содержащему&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;требования&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; 1, 2 &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;и&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; 3, &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;а&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;также&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;типы&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;Iter::value_type&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;и&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;V&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;связаны&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;концептом&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;EqualityComparable&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;, &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;содержащим&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;требование&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; 4. &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Теперь при вызове &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;find(1,5,0)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;компилятор осуществит проверку типов &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;Iter&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;=&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;int&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; и &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;V&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;=&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;int&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; на соответствие концептам &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;InputIterator&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; &lt;/span&gt;и &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"  style="font-family:&amp;quot;;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;EqualityComparable&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;, и мы получим сообщение об ошибке вида «Тип &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;int&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; &lt;/span&gt;не удовлетворяет концепту &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;InputIterator&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;». При этом в отличие от предыдущего примера тело функции &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;find&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; не будет компилироваться вообще, т.е. ошибка компиляции обнаружится на более раннем этапе.&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:6.0pt;text-align:justify;text-indent: 36.0pt"&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Заметим, что условие удовлетворения типов концепту может записываться как в секции &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;requires&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;, так и в угловых скобках; в последнем случае ключевое слово &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;typename&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; заменяется на имя концепта, которому должен удовлетворять тип. Задание имени концепта в угловых скобках – более простой способ, он позволяет наложить на тип ограничения одного концепта. Для типов, удовлетворяющих нескольким концептам, а также для концептов, затрагивающих несколько типов, следует использовать вариант с &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;requires&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;, разделяя различные требования символом &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;. Так, последний пример можно записать следующим образом:&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-top:0cm;margin-right:0cm;margin-bottom:6.0pt; margin-left:35.4pt"&gt;&lt;b&gt;&lt;span lang="EN-US"  style="font-family:&amp;quot;;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;t&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;emplate&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;typename&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; Iter, &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;typename&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; V&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;requires&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; InputIterator&lt;/span&gt;&lt;/span&gt;&lt;iter&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; &amp;amp;&amp;amp; EqualityComparable&lt;/span&gt;&lt;/span&gt;&lt;iter::value_type,&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;br /&gt;Iter find(Iter first, Iter last, V v) { ... }&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/iter::value_type,&gt;&lt;/iter&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:6.0pt;text-align:justify;text-indent: 36.0pt"&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Концепты позволяют обеспечить раннюю проверку типов не только при настройке шаблона, но и при его описании. Предположим, мы совершили ошибку в теле шаблона, неверно используя операцию &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"  style="font-family:&amp;quot;;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;:&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-top:0cm;margin-right:0cm;margin-bottom:6.0pt; margin-left:35.4pt"&gt;&lt;b&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;template&lt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span lang="EN-US"&gt;&lt;inputiterator&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;typename &lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;V&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;requires&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; EqualityComparable&lt;/span&gt;&lt;/span&gt;&lt;iter::value_type,&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;br /&gt;Iter find(Iter first, Iter last, V v) {&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;    while&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; (first &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="color:red;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; last &amp;amp;&amp;amp; *first != v)&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;        ++first;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;    return&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; first;&lt;br /&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/iter::value_type,&gt;&lt;/inputiterator&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:6.0pt;text-align:justify"&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Такое описание &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;find&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;не позволяет использовать его для списков: в итераторе списка отсутствует операция &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;&lt;/span&gt;. Без использования концептов ошибка будет обнаружена только при попытке компиляции тела настроенного шаблона &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;find&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;list&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;int&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&gt;::&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;iterator&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;int&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;, т.е. на позднем этапе. При использовании концептов ошибка компиляции будет получена при первой компиляции тела шаблона и проверке входящих в него типов на соответствие концептам &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;InputIterator&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; &lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;и &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;EqualityComparable&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;, т.е. на существенно более раннем этапе.&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:6.0pt;text-align:justify;text-indent: 36.0pt"&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Приведем определение концепта &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;EqualityComparable&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;:&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-top:0cm;margin-right:0cm;margin-bottom:6.0pt; margin-left:35.4pt"&gt;&lt;b&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;template&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;typename&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; T&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;concept&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; EqualityComparable {&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;    bool&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;operator&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;==(T, T);&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;    bool&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;operator&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;!=(T, T);&lt;br /&gt;}; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:6.0pt;text-align:justify"&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Оно напоминает определение интерфейса в таких языках программирования как Java и C#. Однако, в &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Java&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;и &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;C&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;# уже при определении типа &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;T&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;надо описать все возможные интерфейсы, которым он удовлетворяет. Концепты позволяют, не затрагивая определение типа &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;T&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;, наложить на него ограничения позже. Такой способ является значительно более гибким, поскольку невозможно заранее предугадать все требования, накладываемые на тип &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;T&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; при его определении. &lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:6.0pt;text-align:justify;text-indent: 36.0pt"&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Функции, определенные внутри концепта, называются &lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;ассоциированными функциями&lt;/span&gt;&lt;/i&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;. Так, в предыдущем объявлении &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;bool&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;operator&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;==(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;T&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;, &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;T&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; является ассоциированной функцией. Кроме этого, внутри концепта могут определяться так называемые &lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;ассоциированные типы&lt;/span&gt;&lt;/i&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;. Ассоциированные типы, как правило, используются для представления типов параметров и типов возвращаемых значений ассоциированных функций. Например, операция &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;operator&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;*&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;, определенная в концепте &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;InputIterator&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;, возвращает некий тип &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;value&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;_&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;type&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;, который следует определить в концепте &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;InputIterator&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; следующим образом:&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-top:0cm;margin-right:0cm;margin-bottom:6.0pt; margin-left:35.4pt"&gt;&lt;b&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;concept&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; InputIterator&lt;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;typename&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; Iter&gt; {&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;    typename&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; value_type;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;    value_type &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;operator&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;*(Iter);&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;    ...&lt;br /&gt;};&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:6.0pt;text-align:justify"&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Все типы, удовлетворяющие концепту &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;InputIterator&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;, должны определять тип &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;InputIterator&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;::&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;value&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;_&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;type&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;, а ссылка на этот тип может фигурировать, например, при наложении ограничений в секции &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;requires&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;, как в примере с алгоритмом &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;find&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;:&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:6.0pt;text-align:justify;text-indent: 36.0pt"&gt;&lt;b&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;requires&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; EqualityComparable&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;iter::value_type,&gt;&lt;/iter::value_type,&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:6.0pt;text-align:justify;text-indent: 36.0pt"&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Обычно концепты определяются со служебным словом &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;auto&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;(такие концепты называются автоматическими):&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-top:0cm;margin-right:0cm;margin-bottom:6.0pt; margin-left:35.4pt"&gt;&lt;b&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;auto&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;template&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;typename&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; T&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;concept&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; EqualityComparable {&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;    &lt;b&gt;bool &lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;operator&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;==(T, T);&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;    &lt;b&gt;bool &lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;operator&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;!=(T, T);&lt;br /&gt;}; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:6.0pt;text-align:justify"&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;В этом случае любой тип, имеющий операции &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;==&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; и &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;!=&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;, удовлетворяет концепту. В частности, таковыми являются все стандартные числовые типы, тип &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;string&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; &lt;/span&gt;и пр. Если концепт определен без служебного слова &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;auto&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; &lt;/span&gt;или если в типе отсутствуют функции или операции с такими именами, то для того, чтобы тип удовлетворял концепту, необходимо объявить для него так называемое &lt;/span&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;отображение концепта&lt;/span&gt;&lt;/i&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; (&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;concept_map&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;). Отображение концепта для данного типа должно удовлетворять каждой ассоциированной функции и реализовывать каждый ассоциированный тип из концепта. Например, чтобы тип &lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-top:0cm;margin-right:0cm;margin-bottom:6.0pt; margin-left:36.0pt"&gt;&lt;b&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;struct&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; Person {&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;    string name;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;    int age;&lt;br /&gt;};&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:6.0pt;text-align:justify"&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;удовлетворял концепту &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;EqualityComparable&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;в смысле равенства только полей &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"  style="font-family:&amp;quot;;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;name&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;, необходимо объявить следующее отображение концепта:&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-top:0cm;margin-right:0cm;margin-bottom:6.0pt; margin-left:36.0pt"&gt;&lt;b&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;concept&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;_&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;map &lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;EqualityComparable&lt;/span&gt;&lt;/span&gt;&lt;person&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; {&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;bool&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;operator&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;==(&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;const&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; Person&amp;amp; p1, &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;const&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; Person&amp;amp; p2)&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;{ return p1.name == p2.name; }&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;bool&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;operator&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;!=(&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;const&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; Person&amp;amp; p1, &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;const&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; Person&amp;amp; p2);&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;{ &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;return&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; !(p1 == p2); }&lt;br /&gt;};&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/person&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:6.0pt;text-align:justify;text-indent: 36.0pt"&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Чтобы не повторять очевидную реализацию &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;operator&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;!=&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;, в концепте &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"  style="font-family:&amp;quot;;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;EqualityComparable&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; следует задать для &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;operator&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;!=&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; реализацию по умолчанию:&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-top:0cm;margin-right:0cm;margin-bottom:6.0pt; margin-left:35.4pt"&gt;&lt;b&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;auto&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;template&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;typename&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;T&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;concept&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;EqualityComparable&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; {&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;    &lt;b&gt;bool&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;operator&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;==(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;T&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;, &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;T&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="FR"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;    &lt;b&gt;bool&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="FR"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span lang="FR"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;operator&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;!=(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="FR"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;T&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="FR"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="FR"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;1, &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="FR"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;T&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="FR"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="FR"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;2) { &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span lang="FR"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;return&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; !(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="FR"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;1 == &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="FR"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;2); }&lt;br /&gt;}; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:6.0pt;text-align:justify"&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;В этом случае если объявление операции &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:&amp;quot;;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;!=&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; в типе или его отображении концепта отсутствует, то берется реализация по умолчанию.&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:6.0pt;text-align:justify;text-indent: 36.0pt"&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Отображение концепта само может быть шаблонным. Например, чтобы тип &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;vector&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;T&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; удовлетворял концепту &lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-top:0cm;margin-right:0cm;margin-bottom:6.0pt; margin-left:35.4pt"&gt;&lt;b&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;concept&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;Stack&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;typename&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;X&gt; {&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;    typename&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; value_type;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;    &lt;b&gt;void &lt;/b&gt;push(X&amp;amp;, value_type);&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;    &lt;b&gt;void &lt;/b&gt;pop(X&amp;amp;);&lt;br /&gt;};&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:6.0pt;text-align:justify"&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;следует&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;определить&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;шаблон&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;отображения&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;концепта&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-top:0cm;margin-right:0cm;margin-bottom:6.0pt; margin-left:35.4pt"&gt;&lt;b&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;template&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;typename&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; T&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;concept&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;_&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;map&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; Stack&lt;/span&gt;&lt;/span&gt;&lt;std::vector&gt;&lt;t&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; &gt; {&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;    typedef&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; T value_type;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;    &lt;b&gt;void &lt;/b&gt;push(std::vector&lt;/span&gt;&lt;/span&gt;&lt;t&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&amp;amp; v, &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;const&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; T&amp;amp; x) { v.push_back(x); }&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;    &lt;b&gt;void &lt;/b&gt;pop(std::vector&lt;/span&gt;&lt;/span&gt;&lt;t&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&amp;amp; v) { v.pop_back(); }&lt;br /&gt;};&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/t&gt;&lt;/t&gt;&lt;/t&gt;&lt;/std::vector&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:6.0pt;text-align:justify"&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Обратим внимание, что отображение ассоциированного типа выполняется с помощью директивы &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;typedef&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;.&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:6.0pt;text-align:justify;text-indent: 36.0pt"&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Концепты могут наследоваться (уточняться). Например&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;:&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-top:0cm;margin-right:0cm;margin-bottom:6.0pt; margin-left:35.4pt"&gt;&lt;b&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;concept&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; ForwardIterator&lt;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;typename&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; Iter&gt; { ... };&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;concept&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; RandomAccessIterator&lt;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;typename&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; Iter&gt;: ForwardIterator&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;iter&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; { ... };&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/iter&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:6.0pt;text-align:justify"&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;При этом при наличии нескольких совместно используемых версий функции, на типы которой наложены ограничения концептов, выбирается наиболее специализированная версия концепта. Так, при наличии следующих совместно используемых объявлений&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-top:0cm;margin-right:0cm;margin-bottom:6.0pt; margin-left:36.0pt"&gt;&lt;b&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;template&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span lang="EN-US"&gt;&lt;forwarditerator&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;void&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; advance(Iter&amp;amp; p, int n) { &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;while&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; (n--) ++p; }&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;template&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;randomaccessiterator&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;void&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt; advance(Iter&amp;amp; p, int n) { p += n; }&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/randomaccessiterator&gt;&lt;/forwarditerator&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:6.0pt;text-align:justify"&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;при вызове&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-top:0cm;margin-right:0cm;margin-bottom:6.0pt; margin-left:36.0pt"&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;vector&lt;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;int&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&gt; v(10);&lt;br /&gt;vector&lt;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;int&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&gt;::iterator vi = v.begin();&lt;br /&gt;advance(vi,5);&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:6.0pt;text-align:justify"&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;предпочтение отдается более специализированной версии &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;advance&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;, в которой тип &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;Iter&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; удовлетворяет концепту &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;RandomAccessIterator&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;.&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:6.0pt;text-align:justify;text-indent: 36.0pt"&gt;&lt;span style="color:blue;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;В качестве завершения нужно сказать, что концепты – весьма мощное средство, которое по своим возможностям и гибкости явно превосходит аналогичные механизмы в других языках. При том, что идея задания ограничений на параметры шаблонов представляется совершенно ясной, конкретная ее реализация в «новом» Си++, прямо скажем, выглядит весьма непростой, громоздкой и неочевидной. В этом смысле новый механизм идет в русле «философии» Си++: совершенно ясные, мощные и полезные идеи, лежащие в основе концептуального базиса языка, сопровождаются реализацией, которая как будто специально спроектирована так, чтобы программистам и разработчикам компиляторов «жизнь медом не казалась»...&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:10.0pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:6.0pt;text-align:justify"&gt;&lt;span style="font-size:10.0pt;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8224163229837394669-8258852320236619803?l=zouev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zouev.blogspot.com/feeds/8258852320236619803/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8224163229837394669&amp;postID=8258852320236619803' title='Комментарии: 10'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8224163229837394669/posts/default/8258852320236619803'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8224163229837394669/posts/default/8258852320236619803'/><link rel='alternate' type='text/html' href='http://zouev.blogspot.com/2009/07/blog-post_09.html' title='Новое в Си++: концепты'/><author><name>zouev</name><uri>http://www.blogger.com/profile/09163739178551976623</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8224163229837394669.post-1455712701590390980</id><published>2009-07-09T13:11:00.003+02:00</published><updated>2009-07-10T15:30:49.102+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Standardization'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>Комментированный перевод Стандарта Си++: текущее состояние</title><content type='html'>&lt;p class="MsoNormal"&gt;Вот... Давно не писал, много дел было, много всяких событий произошло... Но чтобы не отвлекаться от главного: работа по переводу стандарта очень близка к завершению. Фактически, остаются приложения, которых задумано штук пять (это «собственные» приложения, не те, которые есть в оригинальном тексте). Некоторые из них кажутся довольно трудоемкими (зато подобного для Си++ еще никто, кажется, не делал &lt;span style="font-family:Wingdings;mso-ascii-font-family:&amp;quot;Times New Roman&amp;quot;; mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-char-type:symbol;mso-symbol-font-family:Wingdings;"&gt;&lt;span style="mso-char-type:symbol;mso-symbol-font-family:Wingdings;"&gt;J&lt;/span&gt;&lt;/span&gt;).&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt;Ну, а пока – просто для памяти: краткий список основных нововведений в стандарт Си++. Там есть много по мелочам, но эти вроде как наиболее значимые.&lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Пакеты &lt;/b&gt;параметров&lt;/li&gt;&lt;li&gt;&lt;b&gt;Атрибуты &lt;/b&gt;сущностей&lt;/li&gt;&lt;li&gt;Новая семанттика спецификатора &lt;b&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;auto&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Лямбда-выражения&lt;/b&gt; (&lt;span lang="EN-US" style="mso-ansi-language: EN-US"&gt;closures, &lt;/span&gt;«замыкания»)&lt;/li&gt;&lt;li&gt;&lt;b&gt;Концепты &lt;/b&gt;для задания ограничений на параметры шаблонов&lt;/li&gt;&lt;li&gt;Спецификатор &lt;b&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;constexpr&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;&lt;li&gt;Спецификатор &lt;b&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;decltype&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;&lt;li&gt;Спецификатор выравнивания &lt;b&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;alignas&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Литералы&lt;/b&gt;, определяемые пользователем&lt;/li&gt;&lt;li&gt;Делегирование между конструкторами (&lt;b&gt;наследование конструкторов&lt;/b&gt;)&lt;/li&gt;&lt;li&gt;Подставляемые пространства имен (inline namespaces)&lt;/li&gt;&lt;li&gt;&lt;b&gt;Алиасы &lt;/b&gt;(псевдонимы) шаблонов&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;                        &lt;p class="MsoNormal"&gt;&lt;o:p&gt; Может, что-то забыл впопыхах. Если вспомню, добавлю.&lt;/o:p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8224163229837394669-1455712701590390980?l=zouev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zouev.blogspot.com/feeds/1455712701590390980/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8224163229837394669&amp;postID=1455712701590390980' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8224163229837394669/posts/default/1455712701590390980'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8224163229837394669/posts/default/1455712701590390980'/><link rel='alternate' type='text/html' href='http://zouev.blogspot.com/2009/07/blog-post.html' title='Комментированный перевод Стандарта Си++: текущее состояние'/><author><name>zouev</name><uri>http://www.blogger.com/profile/09163739178551976623</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8224163229837394669.post-6602037080971242985</id><published>2008-11-18T22:38:00.004+01:00</published><updated>2008-11-18T22:46:01.567+01:00</updated><title type='text'>Интерстрон: ближайшие планы</title><content type='html'>Этот текст (см. ниже) на днях появится на сайте компании &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Интерстрон&lt;/span&gt; (www.interstron.ru). Возможно, он окажется интересен и тем, кто время от времени меня читает. Там, в частности, говорится и о состоянии дел с переводом нового стандарта Си++.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;p class="MsoNormal" style="margin-bottom:6.0pt"&gt;&lt;span style="font-family:Arial;"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;Коллеги и друзья!&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:6.0pt"&gt;&lt;span style="font-family:Arial;"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;В последнее время в фирме проводилась довольно серьезная «скрытая» работа, связанная с нашим флагманским продуктом – компилятором переднего плана Си++. Эта работа – а она полным ходом продолжается и сейчас – направлена на то, чтобы адекватно и на высоком уровне соответствовать современной и динамичной ситуации в сфере инструментов разработки.&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:6.0pt"&gt;&lt;span style="font-family:Arial;"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;Сейчас пришла пора немного подробнее рассказать о первых результатах наших усилий и о ближайших планах компании. Если говорить в целом, речь идет о достижении существенных новых результатов в таких направлениях:&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:6.0pt"&gt;&lt;span style="font-family:Arial;"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;- Развитие языка Си++ и его реализация&lt;br /&gt;- Создание новых инструментов разработки&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:6.0pt"&gt;&lt;span style="font-family:Arial;"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;А теперь чуть подробнее.&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:6.0pt"&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="font-family:Arial;"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;Новый стандарт Си++ и его реализация&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:6.0pt"&gt;&lt;span style="font-family:Arial;"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;Многие знают, что совсем недавно была опубликована «бета-версия» нового Международного Стандарта Си++ (октябрьский драфт). Формального принятия этого стандарта можно ожидать примерно через полтора года, однако по правилам ISO нынешняя версия уже не должна претерпеть существенных изменений (кроме стилистических и редакторских), так что ее можно рассматривать как практически окончательную.&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:6.0pt"&gt;&lt;span style="font-family:Arial;"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;В новом стандарте – очень много нового. Помимо многочисленных модификаций и уточнений уже имеющихся языковых понятий и конструкций, появилось большое количество совершенно новых механизмов, зачастую меняющих сам взгляд на этот язык. Поддержка функционального стиля программирования, механизм шаблонов с ограничениями, основанный на новом понятии концептов (&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"  style="mso-ansi-language:EN-US;font-family:Arial;"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;concepts&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Arial;"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;), наследование конструкторов – только некоторые примеры.&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:6.0pt"&gt;&lt;span style="font-family:Arial;"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;Для компании Интерстрон это означает, что впереди большая работа по приведению компилятора Си++ в соответствие новому стандарту. Эта работа уже началась, и мы надеемся, что наш &lt;/span&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;компилятор&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt; будет одним из первых в мире, поддерживающих новый стандарт в полном объеме – так же, как десять лет назад этот компилятор обгонял многие западные реализации по полноте поддержки тогдашнего стандарта 1998 года.&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:6.0pt"&gt;&lt;span style="font-family:Arial;"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;Но это не все. Помимо реализации нового стандарта, мы решили выпустить его &lt;/span&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;перевод&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;. Мы считаем, что строгое, полное и недвусмысленное определение языка, каким является стандарт, по своей сути является первичным и наиболее авторитетным источником информации о нем. Конечно, стандарт – это чтение не из легких, но его безусловное достоинство по сравнению с более популярными и неизбежно облегченными описаниями языка состоит в том, что программист при возникновении каких-либо проблем с этим большим и сложным языком может гарантированно найти в стандарте ответ на свои вопросы. &lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:6.0pt"&gt;&lt;span style="font-family:Arial;"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;Мы уверены, что если такое «настоящее» определение языка выйдет на родном языке, то оно наверняка будет востребовано большой армией серьезных отечественных разработчиков – да и вообще, всех программистов, говорящих и понимающих по-русски. Пусть даже многие наши специалисты неплохо знают английский и способны читать написанные на нем технические тексты – все равно наличие русского перевода снимет хотя бы часть проблем с чтением и без того очень непростого текста.&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:6.0pt"&gt;&lt;span style="font-family:Arial;"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;Наш перевод мы собираемся снабдить комментариями, которые будут пояснять некоторые не слишком ясно написанные или просто важные моменты определения языка. Идейным вдохновителем и образцом для нас послужил в первую очередь текст книги Страуструпа, который написал такое комментированное описание языка в 1990 году, к началу процесса стандартизации. Для стандарта языка Ада выпущена отдельная книга с обоснованием всего дизайна языка и его конструкций («&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"  style="mso-ansi-language:EN-US;font-family:Arial;"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;Rationale&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Arial;"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;»). Похожая книга имеется и для C# (&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"  style="mso-ansi-language:EN-US;font-family:Arial;"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;C&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Arial;"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;# &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"  style=" mso-ansi-language:EN-US;font-family:Arial;"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;Annotated&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"  style="font-family:Arial;"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"  style="mso-ansi-language: EN-US;font-family:Arial;"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;Standard&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Arial;"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;, &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"  style="mso-ansi-language:EN-US;font-family:Arial;"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;Morgan&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"  style="font-family:Arial;"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"  style="mso-ansi-language:EN-US;font-family:Arial;"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;Kaufmann&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Arial;"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;, 2007), так что полезность комментариев подтверждается реальной практикой.&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:6.0pt"&gt;&lt;span style="font-family:Arial;"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;Признаюсь, наши планы подразумевали выпуск не просто перевода, но &lt;/span&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;двуязычного&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt; текста: на одной стороне книжного разворота – оригинальный текст, на другой – соответствующий перевод. Такой формат был бы оптимальным для многих категорий читателей и специалистов. К сожалению, по некоторым причинам юридического характера мы лишены такой возможности и вынуждены публиковать только русский перевод.&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:6.0pt"&gt;&lt;span style="font-family:Arial;"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;Помимо выпуска печатной версии перевода, мы обсуждаем перспективы и online-версии текста. Идея заключается в том, чтобы программист, зайдя на наш сайт, немедленно получил бы в свое распоряжение гипертекстовую версию перевода, со всем необходимым справочным аппаратом, включая примеры, комментарии и ссылки на соответствующие места оригинального текста.&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:6.0pt"&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="font-family:Arial;"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;Новые инструменты проектирования и разработки&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:6.0pt"&gt;&lt;span style="font-family:Arial;"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;Компании Интерстрон уже больше десяти лет, и мы не новички в области создания сложных инструментов и систем разработки. Попробуем кратко объяснить наше видение современных потребностей разработчиков – как отдельных программистов, так и их коллективов.&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:6.0pt"&gt;&lt;span style="font-family:Arial;"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;Средства разработки программ за последние годы проделали существенную эволюцию и сейчас представляют собой, как правило, весьма мощные и развитые комплексы, позволяющие создавать высокоэффективные программы. Попросту говоря, создатели компиляторов и систем программирования научились уверенно разбирать сложный синтаксис современных языков и генерировать качественный код; более того, можно сказать, что создание компиляторов из некоторой «магической» деятельности, требующей высочайшей программистской квалификации и владения теорией, доступной немногим «избранным», превратилось в обычную программистскую работу, вполне сравнимую по сложности с созданием, например, графических редакторов или систем распределенной обработки информации.&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:6.0pt"&gt;&lt;span style="font-family:Arial;"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;Однако и объективные потребности индустрии ПО претерпели к настоящему времени определенную эволюцию. Теперь «просто компиляторов» или даже мощных сред программирования в традиционном понимании явно недостаточно. Центр внимания смещается от средств генерации качественного кода к многофункциональным системам, реализующим широкий спектр самых разных операций над программами, и в этом спектре генерация кода – далеко не единственный и иногда даже не самый важный аспект.&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:6.0pt"&gt;&lt;span style="font-family:Arial;"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;Можно сказать, что научившись генерировать хороший код, индустрия пока еще не достигла сравнимого прогресса в сфере &lt;/span&gt;&lt;i style="mso-bidi-font-style:normal"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;понимания&lt;/span&gt;&lt;/i&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt; программ – как создаваемых, так и уже существующих. Налицо явный дефицит доступных, мощных и вместе с тем удобных в работе средств моделирования, систем статического анализа программ различной направленности (поиск потенциальных ошибок, оценка сложности ПО и т.д.), систем прямого и обратного инжиниринга, генерации тестовых покрытий с заданной степенью полноты, рефакторинга и подобных им.&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:6.0pt"&gt;&lt;span style="font-family:Arial;"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;И вот в этой сравнительно новой области у компании достаточно выигрышные и перспективные позиции. Дело в том, что ядро наших средств разработки – компилятор переднего плана Си++ – обладает уникальными свойствами, основное из которых – наличие развитого семантического представления с мощным и удобным программным интерфейсом (&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"  style="mso-ansi-language: EN-US;font-family:Arial;"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;API&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Arial;"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;). Существо дела заключается в том, что семантическое представление Интерстрона содержит всю информацию из исходной программы, необходимую практически для любых манипуляций с ней. Можно сказать, что это та же исходная программа, но представленная в регулярном единообразном виде (с выявленной скрытой семантикой, полностью разрешенными именами и явно представленными структурными отношениями между программными сущностями), удобном для создания на ее основе того самого широкого спектра операций, потребность в которых ощущаются все более отчетливо.&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:6.0pt"&gt;&lt;span style="font-family:Arial;"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;До недавнего времени – скажем откровенно – эти возможности компилятора использовались далеко не полностью. Потребности индустрии диктовали спрос на традиционные системы программирования с генерацией кода для различных процессоров специального назначения, и мы делали (и делаем) такие системы для отечественных и зарубежных производителей аппаратных средств. В таких системах заказчику, как правило, необходим «обычный» качественный и надежный компилятор, дополненный удобной средой со стандартным набором средств (визуальный редактор, отладчик, учитывающий специфику процессора, и т.п.).&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:6.0pt"&gt;&lt;span style="font-family:Arial;"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;И вот сейчас, наряду с описанной сферой нашей деятельности, мы собираемся открыть новое для нас стратегическое направление, направленное на создание серии &lt;/span&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;инструментов моделирования, анализа и синтеза программ&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;. Ядром всех этих инструментов будет служить наш компилятор, стабильность, надежность и высокое качество которого гарантирует десятилетний опыт его практического использования. Профильная функциональность продуктов будет реализована на основе использования семантического представления, порождаемого компилятором. При этом сам компилятор будет упрятан глубоко «под капот» этих продуктов, так что пользователю будет «видна» только нужная ему функциональность, и ему не придется даже гадать о том, что находится внутри инструмента…&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:6.0pt"&gt;&lt;span style="font-family:Arial;"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;Первым продуктом из этой серии будет инструмент моделирования и инжиниринга программ, реализующий широкое подмножество графической нотации UML и использующий Си++ в качестве входного и целевого языка. Рабочее название инструмента – &lt;/span&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;Визуализатор&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;, однако собственно «визуализация» программ, то есть представление их в наглядном структурном виде – только очень небольшая часть его функциональных возможностей. Если говорить коротко, то этот продукт обеспечивает достаточно полный спектр типичных операций по моделированию ПО согласно методике, поддерживаемой графическим языком UML (&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"  style="mso-ansi-language:EN-US;font-family:Arial;"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;Unified&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"  style="font-family:Arial;"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"  style="mso-ansi-language:EN-US;font-family:Arial;"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;Modeling&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"  style="font-family:Arial;"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"  style=" mso-ansi-language:EN-US;font-family:Arial;"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;Language&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Arial;"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;). К числу таких операций относятся обратный и прямой инжиниринг, а также средства документирования и визуализации. Язык UML, реализованный в продукте, соответствует последней на настоящий момент версии 2.1.&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:6.0pt"&gt;&lt;span style="font-family:Arial;"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;Конечно, наш Визуализатор – не первая система подобной направленности. Хорошо известны, в частности, изделия фирмы Ration&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US"  style="mso-ansi-language:EN-US;font-family:Arial;"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;a&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Arial;"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;l Rose, которые реализуют сходную функциональность. Однако, мы уверены, что наш продукт будет выгодно отличаться от изделий уважаемых конкурентов – прежде всего, более низким «порогом вхождения», обусловленным его удачным дизайном, простотой и русскоязычностью. Кроме того, он будет попросту существенно дешевле.&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:6.0pt"&gt;&lt;span style="font-family:Arial;"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;Визуализатор – отдельный «коробочный» продукт, который, как мы надеемся, будет интересен и полезен как разработчикам, так и всем, изучающим программирование и моделирование ПО. Однако мы не собираемся ограничиваться выпуском отдельного инструмента. В наших планах – создание мощной среды проектирования программ, которая будет включать большой ассортимент операций, поддерживающих все этапы жизненного цикла ПО. В этой системе, ориентированной прежде всего на платформу Intel, будет и наш компилятор, и полная поддержка UML, и много других полезных свойств.&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:6.0pt"&gt;&lt;span style="font-family:Arial;"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;Но и это еще не все. Мы хорошо понимаем, что несмотря на несомненную востребованность подобных систем, практическая работа с ней может вызвать трудности ввиду отсутствия у потенциальных пользователей соответствующего опыта. Чтобы преодолеть эту проблему для нашего Визуализатора, мы решили предварить его выход на рынок выпуском &lt;/span&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;книги&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;, которая будет служить одновременно и введением в тему, и практическим руководством по использованию продукта. Предварительное название книги - &lt;/span&gt;&lt;span class="apple-style-span"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;Простое введение в Си++ и UML: пособие по практическому освоению&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;.&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:6.0pt"&gt;&lt;span style="font-family:Arial;"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;Книга рассчитана на тех, кто хотя бы немного знаком с Си++ и хочет освоить принципы и методы работы с UML. Во второй части книги будут детально описаны последовательности шагов типичных операций моделирования, реализованных в нашем продукте. Вообще, мы стараемся писать эту книгу очень простым и ясным языком, сознательно оставляя за ее рамками некоторые сложные аспекты языка Си++ и нотации UML.&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:6.0pt"&gt;&lt;span style="font-family:Arial;"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;Ориентировочный срок выпуска книги и Визуализатора – &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;весна-лето будущего года&lt;/span&gt;.&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:6.0pt"&gt;&lt;span style="font-family:Arial;"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;В заключение нужно сказать, что в планах компании – ряд других языко-ориентированных инструментов, а также еще более амбициозные и нестандартные проекты.&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom:6.0pt"&gt;&lt;span style="font-family:Arial;"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;Следите за новостями!&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-family:Arial;"&gt;&lt;o:p&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt; &lt;/span&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8224163229837394669-6602037080971242985?l=zouev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zouev.blogspot.com/feeds/6602037080971242985/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8224163229837394669&amp;postID=6602037080971242985' title='Комментарии: 10'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8224163229837394669/posts/default/6602037080971242985'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8224163229837394669/posts/default/6602037080971242985'/><link rel='alternate' type='text/html' href='http://zouev.blogspot.com/2008/11/blog-post.html' title='Интерстрон: ближайшие планы'/><author><name>zouev</name><uri>http://www.blogger.com/profile/09163739178551976623</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8224163229837394669.post-3095827440617944188</id><published>2008-11-01T01:50:00.007+01:00</published><updated>2008-11-01T02:02:17.003+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Публикации'/><category scheme='http://www.blogger.com/atom/ns#' term='Standardization'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>Стандарт С++0x: финальная фаза</title><content type='html'>&lt;span class="Apple-style-span"  style=" ;font-family:'times new roman';"&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;Внизу текст сообщения из OpenNET (&lt;/span&gt;&lt;a href="http://www.opennet.ru/opennews/art.shtml?num=18665"&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;прямая ссылка&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;).&lt;/span&gt;&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'times new roman';"&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;От себя добавлю: скачав октябрьский драфт (сентябрьский пропустил, каюсь), скорее побежал смотреть главу 14.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'times new roman';"&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;И вот: &lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold; "&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;концепты появились!&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'times new roman';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'times new roman';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style=" ;font-family:'times new roman';"&gt;&lt;table border="0" cellspacing="0" cellpadding="5" bg="" width="100%"  style="color:#E9EAD6;"&gt;&lt;tbody&gt;&lt;tr bg=""  style="color:#C7CBB1;"&gt;&lt;td width="100%"  style=" ;font-size:12pt;"&gt;&lt;b&gt;&lt;span style="color:#3399FF;"&gt;30.10.2008 19:45&lt;/span&gt;  &lt;span id="r_title"&gt;&lt;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); "&gt;Принятие стандарта языка C++0x вошло в финальную фазу&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr bgcolor="#E9EAD6"&gt;&lt;td style="font-size: 12pt; "&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td class="chtext" bg="" id="r_memo"   style=" padding-right: 5px; text-align: justify; text-indent: 10px; font-size:12pt;color:E9EAD6;"&gt;&lt;p&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;На очередной сессии комитета ISO по C++, проходившей в Сан-Франциско с 15 по 20 сентября, на общем голосовании был принят проект стандарта языка программирования C++0x. По &lt;/span&gt;&lt;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; "&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;словам&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt; Герба Саттера, председательствовавшего на заседании, результат голосования был достаточно предсказуем - финальная редакция документа практически ни чем не отличается от его сентябрьской рабочей копии.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;Перед окончательным принятием C++0x в качестве официального стандарта ISO должно пройти еще два раунда согласований в национальных комитетах. На первом этапе, который уже начался, национальные комитеты должны изложить свои комментарии по поводу полученного проекта и подать необходимые усовершенствования. Следующий этап, который начнется приблизительно через год, будет нацелен на исправление неточностей формулировок и общего стиля документа. Внесение кардинальных изменений по сути принимаемого стандарта на этом этапе не предусматривается. Текущую стадию документа можно рассматривать как функционально законченную бета-версию. &lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8224163229837394669-3095827440617944188?l=zouev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zouev.blogspot.com/feeds/3095827440617944188/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8224163229837394669&amp;postID=3095827440617944188' title='Комментарии: 8'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8224163229837394669/posts/default/3095827440617944188'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8224163229837394669/posts/default/3095827440617944188'/><link rel='alternate' type='text/html' href='http://zouev.blogspot.com/2008/11/0x.html' title='Стандарт С++0x: финальная фаза'/><author><name>zouev</name><uri>http://www.blogger.com/profile/09163739178551976623</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8224163229837394669.post-6975407867578826931</id><published>2008-09-07T19:38:00.007+02:00</published><updated>2008-09-07T23:20:34.177+02:00</updated><title type='text'>Семантическое представление: ответ Анониму</title><content type='html'>&lt;span class="Apple-style-span" style="color: rgb(51, 51, 51); font-size: 13px; line-height: 20px; "&gt;&lt;div&gt;Уважаемый Аноним, спасибо за развернутый комментарий.&lt;/div&gt;&lt;div&gt;Только "спорить"-то не о чем - у нас ведь не спор, а дискуссия...&lt;/div&gt;&lt;div&gt;Вот мои соображения в ответ на Ваши (писать их в виде комментария неудобно, лучше уж новый пост сделать).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;На мой взгляд, то, что писал Страуструп в "Дизайне и эволюции", в значительной степени сделано во многих компиляторах и средах программирования для различных языков. Писал-то он давно.&lt;/span&gt;&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255); font-size: 13px; line-height: 20px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 51); font-size: 13px; line-height: 20px; "&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 0);"&gt;В том-то и дело, что практически ничего из предложенного не сделано!- потому и мой пост. Ну, если что-то и сделано (см. ниже), то частично и - самое главное - для несколько иных целей, нежели кажутся мне действительно актуальными.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ну действительно, Intellisense есть и в Visual Studio, и в Java-средах программированя, и в Dephi - да где только нет... &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255); font-size: 13px; line-height: 20px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 20px; "&gt;Какие-то средства более продвинутого "понимания" семантики программ, конечно, есть, никто с этим не спорит, и Intellisense - замечательная вещь, которая реально помогает при программировании. Но подобные механизмы, сколь они ни будь удобными, носят частичный характер, то есть служат отдельным конкретным целям. Возьмите вопросы о программе, ответы на которые Страуструп хотел бы получить (первый абзац того раздела, который я цитировал в предыдущем постинге),- никакой Intellisense не в состоянии на них ответить, он просто для этого не предназначен. А количество подобных вопросов можно в разы и десятки раз умножить. Причем, уверяю Вас, эти вопросы - не праздные, а наоборот, крайне актуальные, они возникают в большом количестве в реальных и важных случаях. &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 20px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 20px; "&gt;Мне уже приходилось как-то писать, что разработчики компиляторов за двадцать последних лет научились генерировать выполняемый код приличного (часто - очень хорошего) качества. Так что компиляция в "узком" смысле - как генерация кода - в целом уже перестала быть актуальной задачей (исключения бывают, конечно, я говорю о тенденции). С другой стороны, весьма актуальные проблемы, связанные с &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;пониманием&lt;/span&gt; программ - их устройства, их сильных и слабых сторон, потенциальных проблем, скрытых дефектов  (в частности, пресловутых "закладок"), возможностей и направлений их развития - если и решаются, но явно недостаточными темпами. &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 51); font-size: 13px; line-height: 20px; "&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;Откуда берется эта информация? По моим понятиям, из некоторой формы внутреннего представления.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255); font-size: 13px; line-height: 20px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 51); font-size: 13px; line-height: 20px; "&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 0);"&gt;А тут и гадать не надо: код, генерируемый для .NET, по определению несет в себе метаданные - некоторую информацию об исходной программе, которой и пользуется Intellisense. Более того, доступ к этой информаици можно производить кому угодно (программным путем) - из самой программы, из другой программы...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Внутреннее семантическое представление есть во всех компиляторах. &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255); font-size: 13px; line-height: 20px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 20px; "&gt;Это конечно, так, и на первый взгляд выглядит очевидным: внутренние таблицы компилятора, синтаксическое дерево программы - можно считать тем самым семантическим представлением. Однако чуть более глубокий взгляд на ситуацию говорит, что не все так просто. Во-первых, эта информация - сугубо внутренняя, она недоступна извне. Во-вторых, эта информация предназначена исключительно для нужд компилятора (а именно, для контроля ошибок и генерации кода) и потому не слишком удобна для любых менее "стандартных" операций. В-третьих, зачастую эти внутренние структуры данных просто невозможно использовать, так как они практически никогда не существуют как единое целое. Например, внутреннее представление компилятора С++ из Visual Studio создается по частям (для отдельных функций, например) и по частям же удаляется (после генерации кода для это функции). Проделать какую-либо содержательную процедуру, связанную с глобальным анализом программы, пользуясь таким фрагментарным представлением, невозможно. В-четвертых, даже если авторы компилятора дают возможность доступиться к внутренним структурам (например, Ада-компилятор GNAT может сбросить целиком дерево программы на файл), они принципиально не дают никакой гарантии, что в следующей версии формат этого дерева не изменится...&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255); font-size: 13px; line-height: 20px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 51); font-size: 13px; line-height: 20px; "&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;Многие системы используют единое внутреннее представление для нескольких языков (на ум приходят Visual Works и gcc, есть и в VS наверняка).&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255); font-size: 13px; line-height: 20px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 20px; "&gt;С промежуточным представлением gcc большие проблемы. Фактически, это низкоуровневая структура данных (к тому же, говорят, плохо задокументированная),  "заточенная" только и исключительно на генерацию кода для различных платформ. В этом представлении не осталось практически ничего от семантики исходной программы, поэтому воспользоваться им для содержательного анализа невозможно.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 20px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 20px;"&gt;У VS нет единого внутреннего представления. Все языки, представленные в VS, создавались в различных условиях, с разными задачами, в разное время и различными командами. Вообще, VS скрывает в себе немало неожиданностей. Например, там, как говорят инсайдеры, на самом деле &lt;span class="Apple-style-span" style="font-style: italic;"&gt;два&lt;/span&gt; компилятора C# - один обычный, подобный тому, который из командной строки (он запускается по команде Build), а второй - "умный", который находит синтаксические ошибки на лету (в процессе наборра программы в редакторе) и обеспечивает Intellisense. Компилятор VB - один на все виды работ. Что касается плюсового компилятора, то с ним вообще непонятно. Он совсем старый, подкрученный на "живую нитку". Говорят, они собираются его капитально переделывать (якобы, уже начали...)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255); font-size: 13px; line-height: 20px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 51); font-size: 13px; line-height: 20px; "&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt; Только оно у коммерческих фирм либо закрыто вовсе, либо продается за отдельные деньги. Кстати, Интерстрон тоже небесплатно его предлагает.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255); font-size: 13px; line-height: 20px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 20px; "&gt;Честно говоря, вопросы "свободно/за деньги" мне параллельны, поскольку они не имеют отношения к тому, что мы обсуждаем. Интерес представляет проблемы, связанные собственно с разработкой и реализацией семантического представления, а не с тем, как оно распространяется. Вот сделаем, тогда и решать будем. :-)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255); font-size: 13px; line-height: 20px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 51); font-size: 13px; line-height: 20px; "&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt; Понятно, что из семантического представления можно "выуживать" практически все факты о программе программным же образом, а не только те, которые предоставляются средой. &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255); font-size: 13px; line-height: 20px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 20px; "&gt;Суть в том, чтобы не "выуживать" из семантического представления нужную информацию, а спроектировать это представление таким образом, чтобы эта информация извлекалась оттуда достаточно просто, очевидным и единообразным способом.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255); font-size: 13px; line-height: 20px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 51); font-size: 13px; line-height: 20px; "&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;То есть, непонятно, что нового - в использовании какого-то особого внутреннего представления C++.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255); font-size: 13px; line-height: 20px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 51); font-size: 13px; line-height: 20px; "&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 0);"&gt;Новое заключается в том, чтобы придумать целостное, полное, независимое от конкретного компилятора представление семантики языка Си++, а также программный интерфейс к такому представлению, и, конечно, реализовать этот интерфейс. &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Этого до сих пор никто не сделал&lt;/span&gt;, хотя пара проектов с подобными целями известна (но они либо умерли лет пять назад, либо несколько "сменили ориентацию" в пользу более простых задач). Правда, можно двигаться несколько другим путем: начать с того, чтобы специфицировать интерфейс доступа к семантическому представлению, а потом заниматься реализацией этого интерфейса. Именно так сделано в Ада-мире: был принят стандарт на интерфейс доступа к Ада-программам - ASIS (Ada Semantic Interface Specification), и он был реализован для нескольких Ада-компиляторов.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Дальше. Представим себе, что сем. представление есть, и его все могут использовать. Какие варианты использования для "реальной жизни" можно предложить? Мне кажется, их не так много. Ну, визуализация, ну, создание метрик программы. Из неперечисленных - рефакторинг (от замены имени с последующей реконструкцией кода до реорганизации кусков кода). Распараллеливание - наверное (это наверняка делается). Для C++ представляется важным использовать семантическое представление для хранения кода шаблонов с последующим инстанцированием - а то - безобразие - все хдранить в заголовочном файле и парсить каждый раз. Но о стандартах - не договорятся...&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255); font-size: 13px; line-height: 20px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 51); font-size: 13px; line-height: 20px; "&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 0);"&gt;Уверяю Вас, реальных и насущных задач подобного рода очень много - даже в России, не говоря об остальном мире. Есть насущная потребность в разного рода анализе исходных кодов громадных программ. Да и актуальность даже тех задач, которые вы перечислили (добавьте еще оптимизацию), будучи помноженной на гигантские размеры иных программ, дает весьма высокую потребность в программах анализа. Тривиальный проимер. Несколько лет назад Боинг был, якобы, крайне заинтересован (и готов был платить большие деньги) в том, чтобы кто-то проанализировал сотни миллионов строк их авиационного софта на предмет (всего лишь!) "мертвого" кода.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 51); font-size: 13px; line-height: 20px; "&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;&lt;br /&gt;По поводу линковки по семантическому представлению. Идея для C++ - правильная и хорошая. Только - его основные проблемы - отсутствие толковой метаинформации в откомпилированных модулях, да и отсутствие приличной модульности вообще.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255); font-size: 13px; line-height: 20px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 20px; "&gt;Ну и я о том же самом писал: нет семантической информации. Где спор-то? :-)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255); font-size: 13px; line-height: 20px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 51); font-size: 13px; line-height: 20px; "&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt; Даже в устаревающем Delphi уже давно есть откомпилированные модули dcu с кучей метаинформации в заголовке. И линковщик только заглядывает в нее и сразу разрешает внешние ссылки. А в C++ линковщик проделывает гигантскую работу - известно же про скорость линковки проектов на C++...&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255); font-size: 13px; line-height: 20px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 20px; "&gt;Как пишет Страуструп в той же книге, одним из основных требований при проектировании С++ было обспечить совместимость с существующими инструментами (с линкерами, заточенными под Си, в частности). Именно отсюда проблемы - какой ни будь С++ продвинутый, но вынь и положь возможность плюсовые программы линковать с сишными.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255); font-size: 13px; line-height: 20px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 51); font-size: 13px; line-height: 20px; "&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt; Я уж не говорю про .NET и Java, где этап линковки ну почти отсутствует - в байт-коде уже хранится нужная информация.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255); font-size: 13px; line-height: 20px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 20px; "&gt;В .NET линковки нет по другой причине - сама архитектура спроектирована таким образом, что исключает статическую линковку. Динамическое связывание - да, возможно, и, кстати, на основе тех же метаданных.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255); font-size: 13px; line-height: 20px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 51); font-size: 13px; line-height: 20px; "&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt; Кстати, интересен вопрос, насколько лучше делать линковку по семантическому представлению, чем по байт-коду - мне кажется, что преимущества в большинстве сомнительны. &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255); font-size: 13px; line-height: 20px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 51); font-size: 13px; line-height: 20px; "&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 0);"&gt;С байт-кодом (или с MSIL-кодом) проблемы те же: там нет семантической информации об исходной программе. Есть метаданные, но их недостаточно для реализации "умной" линковки. Да и нет метаданных для кода из-под "обычного" С++ (не для Managed C++). А нужда в умной линковке, помимо борьбы с code bloat для шаблонов, заключается еще и в возможности делать &lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 0);"&gt;глобальную оптимизацию&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 0);"&gt; программы, и в возможности ее "умной" и безопасной &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;интерпретации &lt;/span&gt;(в частности, для режима отладки). Именно по этим причинам линковка семантического представления предпочтительна.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Мне кажется, что сейчас нужно ставить более прогрессивные вопросы, чем ставил Страуструп 15 лет назад: создание единого семантического представления для группы языков программирования&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255); font-size: 13px; line-height: 20px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 20px; "&gt;"Прогресс" - понятие диалектическое. :-) На мой-то взгляд, прогресс в решении даже тех задач, которые Страуструп сформулировл в том разделе, довольно относителен. С другой стороны,&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 20px; "&gt;реальный прогресс в той сфере, которую мы обсуждаем, возможен только при наличии соответствующих потребностей со стороны пользователей. Спроси сейчас кого угодно: тебе нужно единое семантическое представление для двух (трех и т.д.) языков? Ответ будет отрицательный. Это не означает, разумеется, что работы в этой области не имеют смысла. Но надо понимать, что это требует довольно фундаментальных исследований. Речь идет, по существу, о том, чтобы спроектировать и обосновать &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;универсальный семантический базис&lt;/span&gt; для различных ЯП. Можно запросто (знаю, что говорю :-)) объединить семантические представления, например, для С/С++, Джавы и C# (просто свалить все в одну кучу) и объявить "революцию" свершившейся. Выделить же общие семантические свойства хотя бы двух языков, построить минимальный понятийный базис для них и определить механизм расширения этого базиса - это задача, поверьте, очень-очень нетривиальная...&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255); font-size: 13px; line-height: 20px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 51); font-size: 13px; line-height: 20px; "&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt; и преобразования "во все стороны".&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255); font-size: 13px; line-height: 20px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 20px; "&gt;Преобразовапние во все стороны - это как раз несложно. "Одна сторона" (например, текстовое представление) генерируется по "другой стороне" довольно просто. Исходный текст по UML-представлению, например,- сколько угодно.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255); font-size: 13px; line-height: 20px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 51); font-size: 13px; line-height: 20px; "&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt; Можно также говорить о стандарте внутреннего представления только для C++ и о стандарте хранения его на диске - иначе каждая фирма будет разрабатывать свое и тщательно скрывать от конкурентов.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255); font-size: 13px; line-height: 20px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 51); font-size: 13px; line-height: 20px; "&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 0);"&gt;Стандарт - это почти всегда хорошо (я уже говорил о стандарте сем.интерфейса для Ады). И, наверное, какой-нибудь уважаемый профессор из мира языков программирования такую задачу мог бы поставить. Но не мы, простые смертные... Кроме того, стандарт никогда не создается на пустом месте: нужна хотя бы одна разработка, наглядно демонстрирующая, как такое стандартное представление могло бы выглядеть. &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 20px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 51); font-size: 13px; line-height: 20px; "&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 0);"&gt;А насчет "скрывать" - мне, честно говоря, не очень интересно, как та или иная фирма будет поступать со своими разработками. Все равно эффект от семантического представления будет виден в продуктах фирмы...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ну и - что касается C++ - хорошо бы хранить в каком-то стандартном бинарном виде заголовочные файлы - а то они каждый раз перекомпилируются - пещерный век!&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255); font-size: 13px; line-height: 20px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 20px; "&gt;Ну, тут Вы ломитесь в открытую дверь, простите - у Микрософта уже много лет имеется механизм "предкомпилированных" заголовочных файлов, и они действительно экономят много времени при повторных сборках. Это даже на глаз заметно и даже в небольших проектах.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: 13px; line-height: 20px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8224163229837394669-6975407867578826931?l=zouev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zouev.blogspot.com/feeds/6975407867578826931/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8224163229837394669&amp;postID=6975407867578826931' title='Комментарии: 14'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8224163229837394669/posts/default/6975407867578826931'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8224163229837394669/posts/default/6975407867578826931'/><link rel='alternate' type='text/html' href='http://zouev.blogspot.com/2008/09/blog-post_07.html' title='Семантическое представление: ответ Анониму'/><author><name>zouev</name><uri>http://www.blogger.com/profile/09163739178551976623</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>14</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8224163229837394669.post-2373486530133472306</id><published>2008-09-05T19:04:00.016+02:00</published><updated>2008-09-05T22:49:57.984+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Идеи'/><category scheme='http://www.blogger.com/atom/ns#' term='Static Analysis'/><category scheme='http://www.blogger.com/atom/ns#' term='Language Tools'/><category scheme='http://www.blogger.com/atom/ns#' term='Compilers'/><category scheme='http://www.blogger.com/atom/ns#' term='Проекты'/><category scheme='http://www.blogger.com/atom/ns#' term='XML'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><category scheme='http://www.blogger.com/atom/ns#' term='Source Code'/><title type='text'>Страуструп о будущих средах программирования</title><content type='html'>В августе позволил себе короткий отпуск и взял с собой книгу Страуструпа &lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;Дизайн и эволюция языка C++&lt;/span&gt;. Вроде, в свое время читал ее (просматривал), но в этот раз обнаружил совершенно замечательный раздел, который раньше как-то прошел мимо меня. Он пишет в точности о том, что сейчас занимает все мои "профессиональные" мысли!&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Не поленюсь и выпишу раздел целиком, выделяя курсивом и жирным шрифтом некоторые "ударные" с моей точки зрения места. А мои комментарии - красным.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;9.4.4 За пределами файлов и синтаксиса&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;Как я вижу среду для разработки программ на С++? Прежде всего - инкрементная компиляция. Если вносится небольшое изменение, то система "понимает", что оно небольшое, и генерирует новую версию программы мгновенно. &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Моментальные ответы хотелось бы получать также на простые вопросы и указания типа: "Показать объявление &lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;f&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;", "Какие еще &lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;f&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt; есть в области действия", "Как разрешен этот вызов оператора &lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;+&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;?", "Какие классы произведены от &lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Shape&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;?" и "Какие деструкторы вызываются в конце этого блока?"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;                           Инструмент, который давал бы возможность получать ответы на&lt;br /&gt;                           подобные вопросы,- это в точности то, над чем я сейчас работаю.&lt;br /&gt;                           Основой такой системы должно быть то самое промежуточное&lt;br /&gt;                           представление программ на С++ (я предпочитаю говорить&lt;br /&gt;                           о &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;семантическом представлении&lt;/span&gt;), о котором он пишет далее.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;В программе на С++ есть много информации, которая в типичной среде доступна только компилятору. Уверен, что &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;она должна быть предоставлена программисту&lt;/span&gt;.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;                           Не хочу, чтобы подумали о (само)рекламе, но &lt;a href="http://www.blogger.com/www.interstron.ru"&gt;наш компилятор&lt;/a&gt;&lt;br /&gt;                           переднего плана&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt; устроен именно таким образом: он генерирует&lt;br /&gt;                           промежуточное представление,&lt;span class="Apple-style-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;в котором содержится вся семантика&lt;br /&gt;                           исходной программы. Для этого&lt;span class="Apple-style-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;промежуточного представления&lt;br /&gt;                           имеется программный интерфейс.&lt;/span&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;С помощью этого интерфейса -&lt;br /&gt;                           не скажу, что так уж легко, но, в общем,&lt;span class="Apple-style-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;нормальному программисту&lt;br /&gt;                           вполне по силам - можно сделать, скажем,&lt;span class="Apple-style-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;инструмент, отвечающий&lt;br /&gt;                           на "смысловые" вопросы о программе вроде тех,&lt;span class="Apple-style-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;которые&lt;br /&gt;                           Страуструп приводит в первом абзаце. &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;Однако люди в большинстве своем смотрят на С++-программу как на набор исходных файлов или строк символов. &lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;Программа - это набор типов, функций, предложений и т.д.&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt; Данные понятия представляются в виде символов в файлах только для удобства изображения в традиционных средах программирования.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 0); "&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255); "&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0); "&gt;                           Прекрасно! Это в чистом виде &lt;span class="Apple-style-span" style="font-style: italic;"&gt;семантический взгляд&lt;/span&gt; на программу!&lt;br /&gt;                           Если появится система, которая в полной мере воплотит такой&lt;br /&gt;                           подход к работе с С++, это будет весьма существенным прогрессом,&lt;br /&gt;                           если не сказать прорывом... Продолжая тему "семантического"&lt;br /&gt;                           подхода к С++, эксплуатируемому Интерстроном, могу сказать, что&lt;br /&gt;                           у нас есть и реальное средство, работающее с семантическим&lt;br /&gt;                           представлением: это &lt;span class="Apple-style-span" style="font-style: italic;"&gt;визуализатор&lt;/span&gt;, который показывает исходную&lt;br /&gt;                           программу в виде дерева семантических элементов - именно как &lt;br /&gt;                           "набор типов, функций, предложений..." и/или в нотации UML.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;То, что в основе реализаций С++ лежат символьно-ориентированные инструменты, всегда было главным препятствием на пути развития языка.&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt; Если нужно препроцессировать и перекомпилировать каждый заголовочный файл, прямо или косвенно включенный в файл, где находится слегка измененная функция, то для этого требовалось определенное, пусть и небольшое время. Существует несколько методов, позволяющих избежать ненужных перекомпиляций, но, по-моему, наиболее перспективный и интересный подход - &lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;отказаться от традиционного исходного текста и положить в основу инструментов абстрактное внутреннее представление&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;. Ранний вариант такого представления можно найти в работах [Murray, 1992], [Koenig, 1992].  &lt;/span&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;Естественно, текст все равно необходим - его вводят и читают пользователи&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt; - но он &lt;/span&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;легко&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt; преобразуется системой во внутреннюю форму&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;                           Ну, насчет "легко" - это он погорячился. :-) Если то абстрактное&lt;br /&gt;                           внутреннее&lt;span class="Apple-style-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;представление, о котором он говорит выше, содержит&lt;br /&gt;                           семантическую информацию&lt;span class="Apple-style-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;об исходной программе, введенной&lt;br /&gt;                           в текстовом виде, то построение &lt;/span&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;такого&lt;span class="Apple-style-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;представления - весьма&lt;br /&gt;                           нетривиальнная задача. Но крайне... &lt;span class="Apple-style-span" style="font-style: italic;"&gt;challenging&lt;/span&gt;, как&lt;span class="Apple-style-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;говорят у них.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;и реконструируется по запросу.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;                           А вот реконструкция текста - это действительно несложно.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;Форматирование текста с соблюдением некоторых правил отступа - лишь один из многих возможных взглядов на программу. Простейшее применение этого замечания: текст программы, который каждый из пользователей видит отформатированным в своем любимом стиле, а вы - в вашем.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;Нетекстовое представление могло бы быть создано языками более высокого уровня, генераторами программ, инструментами визуального программирования и т.д.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;                           Ну, и обычными компиляторами переднего плана, разумеется.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;Это позволило бы таким инструментам работать в обход обычного синтаксиса С++ и даже помогло бы избавить язык от некоторых неудачных особенностей его синтаксиса. &lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;Я утверждаю, что система типов и семантика С++ чище, чем его синтаксис.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255); font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;                           Из этого пассажа можно сделать такой вывод: &lt;span class="Apple-style-span" style="font-style: italic;"&gt;семантику С++&lt;br /&gt;&lt;span class="Apple-style-span" style="font-style: normal; "&gt;                           &lt;/span&gt;можно представить&lt;span class="Apple-style-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;в виде, не зависящем от конкретного&lt;br /&gt;&lt;span class="Apple-style-span" style="font-style: normal; "&gt;                           &lt;/span&gt;синтаксиса&lt;/span&gt;, который несет тяжелый груз&lt;span class="Apple-style-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;языка-&lt;br /&gt;                           предшественника, неудачного дизайна, за которым шлейф&lt;br /&gt;                           философии и привычек миллионов&lt;span class="Apple-style-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;программистов. Если для этого&lt;br /&gt;                           использовать какую-нибудь систематическую&lt;span class="Apple-style-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;общеупотребитель-&lt;br /&gt;                           ную  нотацию (например, XML), то может получиться нечто,&lt;br /&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;                           что можно назвать &lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;семантическим синтаксисом С++&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;.&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;                           Более того: такое описание я как раз сейчас делаю. И должен сказать,&lt;br /&gt;                           что&lt;span class="Apple-style-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;получаю громадное удовольствие, на каждом шаге наглядно&lt;br /&gt;                           наблюдая,&lt;span class="Apple-style-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;как обсыпаются многочисленные корявые и громоздкие&lt;br /&gt;                           синтаксические&lt;span class="Apple-style-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;конструкции языка, обнажая естественное и стройное&lt;br /&gt;                           здание&lt;span class="Apple-style-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;семантики С++&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;...&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;                           Я пока не знаю точно, каково может быть практическое применение&lt;br /&gt;                           этого семантического синтаксиса. Впрочем, его можно&lt;br /&gt;                           рассматривать, как формальную запись семантического представле-&lt;br /&gt;                           ния С++, которое сейчас используется в продуктах Интерстрона.&lt;br /&gt;                           Кроме того, на основе этой нотации разрабатывается &lt;span class="Apple-style-span" style="font-style: italic;"&gt;новое&lt;br /&gt;&lt;/span&gt;                           семантическое представление, которое будет использоваться&lt;br /&gt;                           в системе программирования следующего поколения. :-)&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;Из представления о синтаксисе как об интерфейсе между языком и пользователем следует, что &lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;возможны и другие интерфейсы&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;                           Например, графический интерфейс: программа "рисуется" -&lt;br /&gt;                           с помощью ли&lt;span class="Apple-style-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;нотации UML или как-то еще, а "рисовальный"&lt;br /&gt;                           инструмент переводит картинку во внутреннее представление. &lt;br /&gt;                           Или &lt;/span&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;программный&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt; интерфейс: пытливый&lt;span class="Apple-style-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;пользователь легко&lt;br /&gt;                           и быстро пишет некий скрипт, который бы просмотрел&lt;span class="Apple-style-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;программу&lt;br /&gt;                           на предмет ее структуры, каких-либо свойств, особенностей или&lt;br /&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;                           метрик, и выдал бы отчет...&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Единственная фудаментальная константа - это базовая семантика языка.&lt;/span&gt; Она не должна меняться ни при каких обстоятельствах, и, учитывая это, вполне можно выдать С++-код в обычной текстовой форме по запросу.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;В среде, основанной на абстрактном представлении С++, можно было бы предоставлять альтернативные способы создания и просмотра программ, а равно и &lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;другие пути компоновки, компиляции и исполнения кода&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;. Например, &lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;компоновка выполнялась бы до генерации кода&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;, поскольку наличие объектного кода не являлось бы обязательным для доступа к информации о связях.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;                           У Интерстрона есть &lt;/span&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;линкер промежуточного представления&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;,&lt;br /&gt;                           который делает&lt;span class="Apple-style-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;именно это: компоновку программы на этапе,&lt;br /&gt;                           предшествующем генерации кода. &lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;Более того, согласно нашей&lt;br /&gt;                           философии, генерация кода - это частный случай,&lt;span class="Apple-style-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;одна из многих&lt;br /&gt;                           операций, возможных над промежуточным представлением.&lt;br /&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;                           Можно это представление визуализировать, можно подвергнуть&lt;br /&gt;                           его статическому &lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;анализу или оптимизировать, наконец, можно&lt;br /&gt;                           его... исполнить (см. далее)!&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;Различие между интерпретатором и компилятором в значительной мере сгладилось бы, поскольку &lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;их работа была бы основана на одной и той же информации&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt; примерно в одном и том же формате.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 255);"&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;                           В точности так! &lt;/span&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;Виртуальная машина С++&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt; (еще одна разработка&lt;br /&gt;                           Интерстрона)&lt;span class="Apple-style-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;непосредственно исполняет программу, &lt;br /&gt;                           представленную в промежуточном &lt;/span&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;представлении. Конечно,&lt;br /&gt;                           это гораздо медленнее, чем выполнение сгенерированного&lt;br /&gt;&lt;/span&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;&lt;span class="Apple-style-span" style="white-space: normal; "&gt;                           &lt;/span&gt;целевого &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;кода, но в очень многих реальных и важных случаях&lt;br /&gt;                           этой скорости бывает&lt;span class="Apple-style-span" style="white-space: pre;"&gt; вполне &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;достаточно (очевидный пример - &lt;br /&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;                           пошаговая отладка программы).&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8224163229837394669-2373486530133472306?l=zouev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zouev.blogspot.com/feeds/2373486530133472306/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8224163229837394669&amp;postID=2373486530133472306' title='Комментарии: 22'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8224163229837394669/posts/default/2373486530133472306'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8224163229837394669/posts/default/2373486530133472306'/><link rel='alternate' type='text/html' href='http://zouev.blogspot.com/2008/09/blog-post.html' title='Страуструп о будущих средах программирования'/><author><name>zouev</name><uri>http://www.blogger.com/profile/09163739178551976623</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>22</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8224163229837394669.post-6643062651578356018</id><published>2008-09-05T18:39:00.007+02:00</published><updated>2008-09-05T18:56:33.808+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Публикации'/><category scheme='http://www.blogger.com/atom/ns#' term='Standardization'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>Комментированный стандарт: current state</title><content type='html'>Последние два месяца я буквально головы не поднимал от работы по комментированному стандарту (см. сообщение от 17 мая). Перевод, чистка перевода (включая аккуратный перевод терминологии), форматирование, сверка сначала с февральским, а потом с июньским выпуском драфта... Комментарии опять же... Потому и не писал ничего сюда. Прошу прощения, что оставлял ваши вопросы и сообщения без ответа.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;В какой-то момент казалось, что работа никогда не будет закончена. Но сейчас ситуация более-менее выправляется, в конце туннеля забрезжил свет :-). До конца года комментированный стандарт выйдет. Точные сроки, опять же, называть не буду - из тех же суеверных соображений :-). Пока не все еще ясно, как книга будет распространяться, так что на многочисленные вопросы насчет того, где ее можно будет приобрести, ответа у меня пока нет. Очень надеюсь, что с этим все прояснится довольно скоро.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;В стандарте появилось (появится, так как формально он еще не вышел) довольно много нововведений, и некоторые из них очень интересные. Я собираюсь постепенно выкладывать сюда фрагменты нового текста в своем переводе, описывающие эти нововведения. Пока без комментариев.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8224163229837394669-6643062651578356018?l=zouev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zouev.blogspot.com/feeds/6643062651578356018/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8224163229837394669&amp;postID=6643062651578356018' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8224163229837394669/posts/default/6643062651578356018'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8224163229837394669/posts/default/6643062651578356018'/><link rel='alternate' type='text/html' href='http://zouev.blogspot.com/2008/09/current-state.html' title='Комментированный стандарт: current state'/><author><name>zouev</name><uri>http://www.blogger.com/profile/09163739178551976623</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8224163229837394669.post-2386174629114051877</id><published>2008-06-17T17:30:00.004+02:00</published><updated>2008-06-17T17:35:31.157+02:00</updated><title type='text'>Шутка, конечно, но приятно :-)</title><content type='html'>Давно уже встречал этот тест у разных блоггеров, но сам не заходил: боялся опозориться :-). А тут вот взял и... прошел:&lt;br /&gt;&lt;br /&gt;&lt;table style="FONT-SIZE: 11pt; BACKGROUND: #ffe493 0% 50%; WIDTH: 510px; TEXT-ALIGN: justify"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Я проверил свои знания русского языка и получил пятерку.&lt;br /&gt;&lt;br /&gt;&lt;img height="164" src="http://www.rb.ru/poll/7/img/5.gif" width="500" align="center" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;a href="http://www.rb.ru/poll/7/"&gt;Сходи, проверься?&lt;/a&gt;&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;Там еще такие слова были:&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3366ff;"&gt;&lt;strong&gt;Результаты тестирования&lt;/strong&gt;&lt;br /&gt;8 из 8 - Поздравляем, вы - вымирающий вид россиянина, отлично знающего свой родной русский язык. Вы один из немногих носителей элитарного знания, доступного в наше время единицам (4% от общего числа опрошенных). Второй вариант: вы - выпускник, которого хорошо натаскали на сдачу экзамена по русскому языку. Третий вариант: вы – репетитор. Или просто закончили филологический факультет и пошли работать не по специальности.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8224163229837394669-2386174629114051877?l=zouev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zouev.blogspot.com/feeds/2386174629114051877/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8224163229837394669&amp;postID=2386174629114051877' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8224163229837394669/posts/default/2386174629114051877'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8224163229837394669/posts/default/2386174629114051877'/><link rel='alternate' type='text/html' href='http://zouev.blogspot.com/2008/06/blog-post.html' title='Шутка, конечно, но приятно :-)'/><author><name>zouev</name><uri>http://www.blogger.com/profile/09163739178551976623</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8224163229837394669.post-2221093686003385643</id><published>2008-05-17T23:24:00.006+02:00</published><updated>2008-05-17T23:42:38.762+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Публикации'/><category scheme='http://www.blogger.com/atom/ns#' term='Standardization'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>Комментированный стандарт: предварительные итоги</title><content type='html'>Коллеги и друзья!&lt;br /&gt;&lt;br /&gt;Я уже несколько раз писал о своей старой идее выпуска комментированного стандарта C++. Так вот, дело, кажется, сдвинулось с мертвой точки: некоторое время назад мы с коллегами из фирмы Интерстрон (www.interstron.ru) приняли решение о возобновлении этого проекта.&lt;br /&gt;&lt;br /&gt;Напоминаю, что речь идет о двуязычном параллельном тексте (английский оригинал и русский перевод) с комментариями, которые призваны пояснять те или иные неясные или чересчур формально изложенные положения стандарта. Комментарии, кроме того, будут включать короткие примеры, ссылки на вторичные источники информации, полезные в данном контексте, а также цитаты из них (разумеется, с указанием источников).&lt;br /&gt;&lt;br /&gt;Многие в курсе, что сейчас рабочая группа ISO с бюрократической аббревиатурой JTC1/SC22/WG21 готовит новую редакцию стандарта C++. Скорее всего, окончательный текст будет готов к концу этого года, но формальная процедура принятия нового стандарта завершится не раньше, чем еще через год, а то и позже; по крайней мере, так &lt;a href="http://zouev.blogspot.com/2008/04/blog-post.html"&gt;оценивает сроки Страуструп&lt;/a&gt;). Нам показалось бессмысленным ждать момента формального принятия, и мы решили взять за основу нашего текста последнюю на настоящий момент версию (от февраля нынешнего года) предварительного стандарта («Working Draft», документ №2521, http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2521.pdf). &lt;br /&gt;&lt;br /&gt;Конечно, с формальной точки зрения Working Draft – это не стандарт. Однако, наш опыт работы с предыдущей редакцией стандарта от 1998 года (а тогда мы писали наш компилятор C++ параллельно с процессом стандартизации и вынуждены были оперативно отслеживать изменения, производимые в нем) показывает, что на завершающих этапах серьезных добавлений в текст уже не вносится. Разумеется, мы будем вносить в наш текст последующие изменения, которые появятся в новых драфтах,- вплоть до момента сдачи книги в типографию, насколько это будет в наших силах.&lt;br /&gt;&lt;br /&gt;К данному моменту текст предварительного стандарта практически полностью переведен. Это основной итог напряженной работы последнего времени. На следующей неделе мы начинаем активную деятельность по анализу текста: собираемся определить, какие положения стандарта требуют комментирования, в чем должен состоять комментарий и т.д. Следующий этап – собственно комментарии. Да, кроме перевода и комментариев, текст будет включать дополнительные материалы: толковый словарь понятий C++ («Краткий стандарт», или просто «Краткий курс» :-)), обоснование выбранных вариантов перевода технических терминов, синтаксические диаграммы и кое-что еще.&lt;br /&gt;&lt;br /&gt;Наконец, о сроках. Мы собираемся выпустить наш перевод в печатном виде ближе к концу года (точнее не скажу, чтобы не сглазить :-)). Технические подробности, связанные с выпуском, и текущие новости я буду сообщать в процессе. Будет ли сделана онлайн-версия перевода и если да, то когда – сейчас решается.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8224163229837394669-2221093686003385643?l=zouev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zouev.blogspot.com/feeds/2221093686003385643/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8224163229837394669&amp;postID=2221093686003385643' title='Комментарии: 8'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8224163229837394669/posts/default/2221093686003385643'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8224163229837394669/posts/default/2221093686003385643'/><link rel='alternate' type='text/html' href='http://zouev.blogspot.com/2008/05/blog-post.html' title='Комментированный стандарт: предварительные итоги'/><author><name>zouev</name><uri>http://www.blogger.com/profile/09163739178551976623</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8224163229837394669.post-3844217346543885903</id><published>2008-04-28T12:37:00.005+02:00</published><updated>2008-05-06T16:49:23.553+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Публикации'/><category scheme='http://www.blogger.com/atom/ns#' term='Compilers'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>"Редкая профессия" на сайте Интерстрона</title><content type='html'>Типа информация. :-)&lt;br /&gt;Моя давняя-давняя статья "Редкая профессия", о том, как мы делали компилятор C++, выложена на сайте фирмы Интерстрон (www.interstron.ru). Статья вышла в конце 1997 года в PC Magazine/Russian Edition, довольно долгое время лежала у них в электронном архиве, но недавно исчезла (наверное, в связи с десятилетним юбилеем :-)) По этой причине я счел естественным опубликовать ее на сайте "своей" фирмы, подправив кое-какие ляпы и опечатки (не все, к сожалению).&lt;br /&gt;&lt;br /&gt;С момента выхода статьи я получил на нее довольно много отзывов, как в различных профессиональных форумах, так и в личных письмах. Один раз даже удостоился критики: автор, мол, "ничего не понимает в компиляторах" или что-то в этом роде. Было очень лестно :-). Как ни покажется удивительным, отзывы продолжают приходить и по сей день (даже с утверждениями, что "статья не устарела"!), что послужило дополнительным мотивом ее повторного опубликования.&lt;br /&gt;&lt;br /&gt;Прямая ссылка на статью:&lt;br /&gt;http://www.interstron.ru/upload/images/pubs/Redkaya_professiya.pdf&lt;br /&gt;Enjoy! :-)&lt;br /&gt;&lt;br /&gt;Да, чуть не забыл. Вопрос к читателям (на сто тысяч):&lt;br /&gt;Если вы смогли одолеть этот довольно длинный текст, то как бы вы отнеслись к появлению статьи под условным заголовком "Редкая профессия: десять лет спустя" - с рассказом о том, что последовало за описанными событиями, и о некоторых других похожих проектах? Не умею устраивать голосование на блоге (да и не хочу заморачиваться, честно говоря), но узнать интегральное мнение было бы очень интересно...&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;UPD: Оказывается, статья не исчезла, а просто переехала на другое место в связи с редизайном сайта PC Magazine/RE. Прошу прощения за ошибку, и спасибо Олегу Лебедеву за поправку. Вот &lt;a href="http://www.pcmag.ru/issues/detail.php?ID=9972"&gt;новая ссылка на статью&lt;/a&gt;.&lt;/strong&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8224163229837394669-3844217346543885903?l=zouev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zouev.blogspot.com/feeds/3844217346543885903/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8224163229837394669&amp;postID=3844217346543885903' title='Комментарии: 50'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8224163229837394669/posts/default/3844217346543885903'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8224163229837394669/posts/default/3844217346543885903'/><link rel='alternate' type='text/html' href='http://zouev.blogspot.com/2008/04/blog-post_28.html' title='&quot;Редкая профессия&quot; на сайте Интерстрона'/><author><name>zouev</name><uri>http://www.blogger.com/profile/09163739178551976623</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>50</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8224163229837394669.post-2915649476247365517</id><published>2008-04-05T21:46:00.005+02:00</published><updated>2008-04-05T21:58:53.924+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Публикации'/><category scheme='http://www.blogger.com/atom/ns#' term='Standardization'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>Интервью Б.Страуструпа</title><content type='html'>Недавно, 27-го марта, в Dr. Dobb’s Journal было &lt;a href="http://www.ddj.com/cpp/207000124"&gt;опубликовано&lt;/a&gt; очередное интервью Б.Страуструпа. Заметная часть интервью либо повторяет более-менее известные исторические обстоятельства появления C++, либо содержит любопытные (хотя тоже ранее озвученные) взгляды автора этого языка на обучение программированию. Самое же для меня интересное – информация о готовящемся новом стандарте C++ (кодовое наименование C++0x). Вот наиболее важное в вольном пересказе.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Срок&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Новый стандарт языка (по плану?) должен быть готов к концу 2008 года, но все процедуры ISO, связанные с его официальным принятием, обычно занимают много времени. Поэтому то, что сейчас известно под именем C++0x, скорее всего, станет C++10.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Стандартная библиотека&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Нововведения в стандартной библиотеке хотя и существенны, но, по его мнению, недостаточны. Добавлены потоки (threads), регулярные выражения, хеш-таблицы (которые изначально присутствовали в оригинальной STL, но не были внесены в предыдущий стандарт), "умные" указатели. Много усовершенствований внесено в существующую библиотеку контейнеров. Наконец, в язык добавлен ряд низкоуровневых свойств (новая модель памяти и задачная библиотека - task library),которые, как он говорит, не предоставляют непосредственных выгод для программистов, но скорее призваны служить основой последующих нововведений (которые откладываются до так называемого "C++13"): разделяемая память, пулы потоков (thread pools), распределенное параллельное программирование. С другой стороны, эти новые свойства уже используются в некоторых мощных коммерческих библиотеках.&lt;br /&gt;&lt;br /&gt;(Кстати, один очень интересный момент: Страуструп несколько раз на протяжении интервью жалуется на совершенно недостаточное финансирование процесса стандартизации, из-за которого некоторые важные нововведения в стандартной библиотеке так и не были должным образом рассмотрены и из-за этого в новый стандарт уже не попадают. Причем это высказано в достаточно резких выражениях: «the committee has so few resources», «absolutely no funding» и т.п. Это удивительное для меня обстоятельство: ISO, оказывается, недостаточно финансирует свои комитеты!.. А казалось бы: уважаемая международная организация, важность которой никем не подвергается сомнению, работающая эффективно, тщательно и весьма результативно...)&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Нововведения в язык&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Основной мотив добавления большинства новых свойств - повысить уровень языка введением полезных высокоуровневых абстракций, которые бы способствовали созданию более ясного и хорошо организованного кода без дополнительных затрат по времени выполнения и требуемой памяти (это почти буквальная цитата). К числу таких свойств относятся обобщенные константные выражения (generalized constant expressions), статические утверждения (static assertions), ссылки на r-значения (rvalue references), а также новые возможности задания перечислимых типов.&lt;br /&gt;&lt;br /&gt;Отдельно следует упомянуть новый механизм поддержки обобщенного программирования, который называется &lt;em&gt;concepts&lt;/em&gt;. (Предвижу очередную вакханалию и произвол в попытках перевести это название на русский; буквальный эквивалент "концепция" или "понятие" звучит слишком общо и малосодержательно. Может быть, &lt;strong&gt;концепт&lt;/strong&gt;? Механизм все равно новый, так пусть и слово новое будет?) Содержательно этот механизм предназначен для преодоления одной из основных проблем, связанных с шаблонами,- полным отсутствием в языке каких-либо средств контроля фактических параметров настроек шаблонов.&lt;br /&gt;&lt;br /&gt;От себя замечу, что механизм concepts продвигается в язык уже довольно давно небольшой группой специалистов во главе с самим Страуструпом. Предложение прошло несколько стадий обсуждений в рабочей группе, было выпущено несколько редакций его описания, вышло несколько статей на эту тему. Не уверен точно, но решение о внесении этого механизма в язык уже, кажется, принято. Однако в последнем драфте нового стандарта (февральском) концептов еще нет.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Будущее C++ после принятия нового стандарта&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Помимо новых возможностей стандартной библиотеки, которые (вынужденно, см. выше) отложены на будущее, Страуструп упомянул мультиметоды (диспетчируемые по динамическому типу нескольких аргументов, а не только первого), а также эффективную реализацию динамического приведения (dynamic cast).&lt;br /&gt;&lt;br /&gt;Друзья, не спрашивайте меня, в чем существо упомянутых нововведений: сам еще толком не знаю. :-) В последующих постах собираюсь постепенно рассказывать о новых языковых свойствах, по мере того, как сам в них буду разбираться (но до новых библиотек руки, боюсь, скоро не дойдут). Одним из первых на очереди - попытка понять, что же такое concepts...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8224163229837394669-2915649476247365517?l=zouev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zouev.blogspot.com/feeds/2915649476247365517/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8224163229837394669&amp;postID=2915649476247365517' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8224163229837394669/posts/default/2915649476247365517'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8224163229837394669/posts/default/2915649476247365517'/><link rel='alternate' type='text/html' href='http://zouev.blogspot.com/2008/04/blog-post.html' title='Интервью Б.Страуструпа'/><author><name>zouev</name><uri>http://www.blogger.com/profile/09163739178551976623</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8224163229837394669.post-4972832193794854521</id><published>2008-03-10T20:13:00.002+01:00</published><updated>2008-03-10T22:11:05.669+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='&quot;Эльбрус&quot;'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>Lisp на "Эльбрусе" (вторая предыстория)</title><content type='html'>Очень скоро после того, как я отошел от идеи реализовать на "Эльбрусе" полный Lisp, в журнале "Программирование" (очень неплохой был журнал; он жив и посейчас, но никто о нем, кажется, не знает и не вспоминает...) вышла статья А.Рейтсакаса из Таллина... ровно на ту же самую тему: Lisp на "Эльбрусе"! &lt;br /&gt;&lt;br /&gt;В статье описывалась реализация какой-то (не помню) версии Лиспа, причем, насколько можно было судить по статье, она была на порядок серьезнее, проработаннее и качественнее, нежели мой глупый интерпретатор. У него там, собственно, был представлен полный Лисп, и предусматривался режим "настоящей" компиляции - непосредственно в коды "Эльбруса", и еще какие-то аспекты, активно использующие богатые архитектурные возможности этой машины. &lt;br /&gt;&lt;br /&gt;Не скрою, я был расстроен и задет. Конечно, все негативные эмоции были направлены на самого себя: ведь мог бы (должен был!) гораздо серьезнее подойти к делу, уж если задумал такое нетривиальное предприятие. И описание Лиспа надо было найти, ведь он же смог! &lt;br /&gt;&lt;br /&gt;Конечно, у меня нашлись объяснения. Мы находились совершенно в разных обстоятельствах: Саша работал в Академии Наук Эстонской (тогда еще) ССР, реализация Лиспа была темой его диссертации и, тем самым, основной обязанностью "по службе". Мой же "проект" был полнейшей самодеятельностью, и надеяться, что начальство позволит мне уделять рабочее время теме, хоть и интересной самой по себе, но решительно не относящейся к тематике нашего "ящика", не приходилось. &lt;br /&gt;&lt;br /&gt;Некоторое время спустя, когда мы с Сашей познакомились, я "организовал" у своего начальства отзыв на его диссертационную работу, необходимый для его защиты (попросту говоря, написал этот отзыв и попросил подписать). А Саша и после защиты продолжал заниматься той же темой: в скором времени в его переводе вышел двухтомник финских авторов "Мир Лиспа", который и по сей день, кажется, остается почти единственной толковой русскоязычной книгой по этому языку. Ее скан и сейчас можно откопать в Интернете. &lt;br /&gt;&lt;br /&gt;И - закон парности событий! - примерно в это же самое время появилась еще одна работа, тематически очень близкая: московский аспирант (как же его имя?- кажется, Володя Лихолип... Если ошибся, прошу извинить - все-таки много лет прошло) реализовал для того же "Эльбруса" язык Плэнер (Planner), довольно часто упоминавшийся тогда в литературе, а ныне, кажется, совершенно забытый. Planner предназначался для программирования ("планирования", отсюда и название) поведения роботов и содержал в себе полный Lisp как подмножество. Помимо этого, в нем, помнится, был целый ряд нетривиальных и очень интересных свойств, делающих его мощным инструментом программирования в сфере искусственного интеллекта и подобных областях. &lt;br /&gt;&lt;br /&gt;Реализация Плэнера составляла весьма серьезную программистскую задачу - я вполне мог об этом судить, так как к тому времени появилась книга по этому языку,- и пусть даже язык был реализован не полностью (на своей защите он честно об этом сказал), я был преисполнен глубокого уважения к этому скромному парню. &lt;br /&gt;&lt;br /&gt;И, конечно, очень про себя переживал, что, сидя в своем "ящике", нахожусь вне этой крайне интересной и вдохновляющей, как мне тогда казалось, среды разработчиков инструментальных средств для "Эльбруса"... &lt;br /&gt;&lt;br /&gt;Впоследствии мне еще несколько раз приходилось испытывать подобные чувства: и когда я познакомился с новосибирскими разработчиками PL/I и Ады, и когда В.О. Сафонов из Питера рапортовал о рекордном быстродействии своего Паскаль-компилятора, который обгонял даже "родной" для "Эльбруса" компилятор Эль-76... Я был чужим на этом празднике жизни, занимаясь системным администрированием, поддержкой и обучением пользователей, разрабатывающих для "Эльбруса" "боевые алгоритмы", смысла которых я почти не понимал... &lt;br /&gt;&lt;br /&gt;Основной вывод, который я сделал для себя тогда... Да вру, никаких выводов я не сделал. Просто порасстраивался, и продолжал жить дальше. В конце концов, у меня еще все впереди, появится и у меня классная компиляторная работа!.. (десять лет пришлось ждать...) &lt;br /&gt;&lt;br /&gt;И в заключение это нехитрой истории (&lt;strong&gt;пред&lt;/strong&gt;ыстории, не забывайте - настоящая история еще впереди :-)) - рассказ о том, как я все-таки разжился полным описанием Лиспа. Случай короткий и простой, но в то время он произвел на меня очень большое впечталение. &lt;br /&gt;&lt;br /&gt;В середине девяностых мы, уже работая в МГУ, активно занимались языком C++, делая компилятор по заказу одной европейской фирмы (см. "Редкая профессия"). Наша работа шла параллельно процессу стандартизации C++ в ISO, и от наших заказчиков мы регулярно получали текущие материалы рабочей группы, занимающейся разработкой этого стандарта - стенограммы обсуждений, принятые технические решения, планы и т.д. И вот у моего шефа, профессора В.А.Сухомлина, возникла идея более тесно и, самое главное, официально участвовать в этом процессе в качестве представителей от России. Основания были более чем весомые: наша команда работала над реализацией языка, основываясь на последних решениях рабочей группы, кроме компилятора, мы разрабатывали тесты на соответствие стандарту - так почему бы нам более активно, с учетом собственного опыта, не участвовать в работе этой группы? &lt;br /&gt;&lt;br /&gt;До той поры контакты с рабочими группами ISO по различным языкам формально шли через какой-то отдел НИЦЭВТа - конторы, которая в советское время занималась разработкой ЭВМ Единой Серии. Несмотря на несколько ироническое отношение к характеру и качеству их разработок (все специалисты прекрасно знали и понимали степень "оригинальности" их решений), следует признать, что с чисто промышленной точки зрения эта организация делала очень важное дело, занимаясь масштабным внедрением вычислительной техники во все отрасли народного хозяйства. Да и, кроме того, за ЕС ЭВМ надо признать по крайней мере один большой плюс: унификацию периферийного оборудования, в том числе их интерфейсов. Дисковые и ленточные накопители, дисплеи, графопостроители и другая периферия на "Эльбрусе" вся была ЕСовская. Правда, со смертью обеих этих ветвей отечественной вычислительной индустрии все это потеряло всякий смысл и значение... &lt;br /&gt;&lt;br /&gt;Но в советское время НИЦЭВТ процветал, и, конечно, вид их главного здания поражал воображение: исполинский многоэтажный комплекс из стекла и бетона, почти на километр вытянувшийся вдоль Варшавского шоссе, повторяя его изгиб... &lt;br /&gt;&lt;br /&gt;Вот в это здание я и отправился однажды холодным зимним днем, чтобы по договоренности между начальством забрать материалы по стандартизации языков программирования: теперь контролировать этот процесс должна была наша лаборатория в МГУ. &lt;br /&gt;&lt;br /&gt;...Друзья, это был шок!&lt;br /&gt;Представьте: огромное здание, промерзшее насквозь (отопления то ли не было, то ли не работало), длиннейшие коридоры, перспектива которых терялась в темноте (электричество то ли не работало, то ли его не было :-))... И самое главное: &lt;strong&gt;пусто&lt;/strong&gt;. &lt;em&gt;Людей не было&lt;/em&gt; - ни в коридорах, ни в комнатах. А судя по длине коридоров и размерам комнат, они были явно расчитаны на большие коллективы работников... И легко было представить, как, наверное, выглядело это все в лучшие времена: спешащие, переговаривающиеся, озабоченные люди, сознающие важность своей работы, комнаты, полные опытных специалистов, склонившихся над электронными ли платами, распечатками ли операционной системы... В общем, с тех пор дух того времени прочно ассоциируется у меня с этими поистине апокалиптическим видами бывшего флагмана советской вычислительной индустрии...&lt;br /&gt;&lt;br /&gt;(Спаведливости ради - и, так сказать, для баланса - должен заметить, что примерно в те же времена один из "конкурентов" НИЦЭВТа, институт, где проектировались, создавались и программировались "Эльбрусы" - ИТМиВТ - выглядел не лучше. Такая же пустота и запустение.  Правда, ощущения сбывшегося апокалипсиса не возникало - но и то лишь из-за сравнительно скромных размеров эльбрусовского "гнезда"...)&lt;br /&gt;&lt;br /&gt;В нужной мне комнате, ссутулившись под накинутым пальто, спиной ко входу сидел одинокий человек потерянного вида. Узнав о цели моего прихода, он равнодушно кивнул на шкаф, набитый документами, и отвернулся. Через десять минут лихорадочного просмотра бумаг я понял, какое богатство плывет ко мне в руки, и еще через полчаса приготовленная сумка уже раздувалась от текстов стандартов и других материалов ISO...&lt;br /&gt;&lt;br /&gt;Быстро попрощавшись с зябнущим хозяином комнаты, я с деловым видом подхватил сумку и вышел, стремясь поскорее покинуть это умирающее место (и страшась: вдруг меня остановят и заставят вернуть награбленное :-)). Надо ли говорить, что среди материалов по C++, в сумке лежало много документов, к этому языку не имеющих никакого отношения. А среди них - &lt;strong&gt;рабочий вариант международного стандарта языка Lisp&lt;/strong&gt;!..&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8224163229837394669-4972832193794854521?l=zouev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zouev.blogspot.com/feeds/4972832193794854521/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8224163229837394669&amp;postID=4972832193794854521' title='Комментарии: 3'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8224163229837394669/posts/default/4972832193794854521'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8224163229837394669/posts/default/4972832193794854521'/><link rel='alternate' type='text/html' href='http://zouev.blogspot.com/2008/03/lisp.html' title='Lisp на &quot;Эльбрусе&quot; (вторая предыстория)'/><author><name>zouev</name><uri>http://www.blogger.com/profile/09163739178551976623</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8224163229837394669.post-1365134255741696027</id><published>2008-03-08T21:03:00.024+01:00</published><updated>2008-03-08T22:32:49.424+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Прочее'/><title type='text'>5 инструментов, без которых я не могу работать продуктивно</title><content type='html'>У &lt;a href="http://alenacpp.blogspot.com/"&gt;Алены Сагалаевой&lt;/a&gt; увидел приглашение поучаствовать в опросе (спасибо, Алена!). Получилось довольно длинно, так как без комментариев обходиться не умею. :-)&lt;br /&gt;&lt;br /&gt;Для начала хотел бы сравнить инструменты, которыми я пользовался в процессе разработки компилятора Си++ (десять лет назад), и теми, с которыми работаю сейчас.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1998&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2008&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Файловый менеджер&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Norton Commander&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Total Commander&lt;br /&gt;Компилятор&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;gcc&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;C++/C# из VS&lt;br /&gt;Отладчик&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;gdb&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Отладчик VS&lt;br /&gt;Текстовый редактор&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Multi-Edit&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Редактор VS&lt;br /&gt;Ведение версий&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CVS&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SourceSafe&lt;br /&gt;Интернет-броузер&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Netscape&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Internet Explorer&lt;br /&gt;Почтовая программа&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Netscape Communicator&amp;nbsp;&amp;nbsp;&amp;nbsp;Gmail&lt;br /&gt;Персональный организатор&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;The Journal, Onfolio&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Несколько комментариев.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Файловый менеджер&lt;br /&gt;&lt;/strong&gt;Я довольно консервативен, да и просто не вижу причин менять привычную парадигму манипуляций с файлами/каталогами. Модель с двумя окнами кажется мне удобной и совершенно адекватной подавляющему большинству практических потребностей. Встроенный в винду Windows Explorer, на мое скромное имхо, безумно коряв с эстетической точки зрения и очень неудобен в работе (даже для рядовых пользователей); даже если потратить довольно много времени на его настройку, результат явно неудовлетворителен. Кстати, никакими плагинами к TC не пользуюсь, может, зря – но времени жалко их выбирать, ставить, пробовать, проверять... Единственный недостаток TC – он довольно медленно работает с большим количеством файлов (несколько сот штук) зараз. Впрочем, может быть, это не он виноват, а нижележащая ОС, но мне лень копаться в настройках самой винды...&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Компилятор&lt;br /&gt;Отладчик&lt;br /&gt;Редактор&lt;br /&gt;Ведение версий&lt;br /&gt;&lt;/strong&gt;Visual Studio, по моему мнению,- очень хорошая интегрированная среда, и я не разделяю практически ни одного из критических замечаний о ней, которые мне приходилось слышать. Inellisense и другие удобства, которые некоторые презрительно именуют "свисточками и звоночками", &lt;em&gt;реально&lt;/em&gt; помогают мне программировать и &lt;em&gt;существенно&lt;/em&gt; облегчают и ускоряют мою работу. К сожалению, для работы с Си++ и в особенности с ASP.NET уровень поддержки со стороны среды заметно слабее, чем для C#. Версию VS не указываю, так как использую несколько на разных компьютерах.&lt;br /&gt;&lt;br /&gt;Так как эти четыре средства можно считать за единую интегрированную среду, то у меня остаются свободные позиции. :-) Поэтому я добавлю в свою версию списка еще кое-что.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Интернет-броузер&lt;br /&gt;&lt;/strong&gt;Я ни разу не фанат ни самого Микрософта, ни его продуктов, но - опять-таки - считаю, что IE - вполне приличный инструмент, и не испытываю серьезных проблем в работе с ним. Да, иногда он тормозит и даже, бывает, слетает, но кто скажет, что другие приборы всегда быстры и супернадежны? Кроме того, мне важно, что с ним интегрирован Onfolio (см.ниже). Да и вообще, чтобы перейти на другой броузер, мне нужны - кроме простого человеческого любопытства - достаточно весомые причины...&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Почтовая программа&lt;br /&gt;&lt;/strong&gt;Плюсы GMail всем известны - быстрота, простота, надежность - у меня ни разу не было проблем вроде пропажи аккаунта или (части) писем. Письма приходят ко мне и от меня к моим адресатам без заметных задержек, что иногда случалось с другими почтовиками. Вполне приличный спам-фильтр. Плюс, конечно, возможность зайти в него отовсюду, где есть связь.&lt;br /&gt;&lt;br /&gt;Однако, рискну и здесь высказать точку зрения, отличную от многих слышанных. GMail, как мне кажется, вовсе не идеальная программа по своему дизайну и практическому удобству. В частности, совершенно не разделяю восторгов насчет "ярлыков" (labels): у меня, например, их штук сто (писем очень много, и нужно же их хоть как-то упорядочивать!), в результате список этих ярлыков вытянулся на несколько экранов вниз. Список примитивно-линейный, и никакого другого решения программа не предлагает. (Не говорю уж о том, что под многими ярлыками на самом деле скрываются письма, которые, будь у меня возможность, я бы распихал в различные разделы!) Поиск по письмам, усердно впариваемый как всеобщая панацея, мне приходилось использовать от силы раза три за все годы работы с GMail, и только в одном случае я нашел, что искал.&lt;br /&gt;&lt;br /&gt;Совершенно необходима нормальная, универсальная и всем привычная парадигма иерархического хранилища (папки, попросту). Ярлыки очень удобны и полезны - но только как дополнение к папкам. По невнятной инсайдерской информации что-то подобное должно было появиться еще с год назад, но... до сих пор ждем и надеемся.&lt;br /&gt;&lt;br /&gt;Отсутствие необходимости удалять ненужные письма, тоже выставляемое как просто-таки потрясающе революционное свойство - на самом деле очень смешная вещь: совершенно непонятно, почему пользователи должны бурно радоваться этому обстоятельству? Мы ведь все периодически убираем наши рабочие комнаты и рабочие компьютеры от ненужных бумаг (файлов), которые имеют обыкновение скапливаться на столах, в тумбочках и на жестких дисках с необыкновенной быстротой? И что будет, если нам вдруг скажут: ребята, теперь у вас в компьютере огроменный жесткий диск (если надо будет, еще один такой же поставим), поэтому операцию "удалить файл" вам теперь использовать нельзя?.. (Кстати, где-то читал, что поначалу кнопки "Удалить" в GMail не было вообще, и ввели ее с большой неохотой только по настоянию пользователей...)&lt;br /&gt;&lt;br /&gt;Вообще, рискуя навлечь на себя шквал критики, скажу о некотором сходстве философии авторов GMail и... языка Си (!!!). Как мне кажется, оба эти инструмента создавались (кстати, и тот и другой - двумя друзьями!) согласно очень схожей философии: то, что удобно нам, авторам, будет, разумеется, удобно и всем остальным - как же может быть иначе? Вот и появилась совершенно безумная по дизайну нотация ("понятная, разве что, специалистам по криптографии", как сказано в одной старой книге), к которой, однако, привыкла тесная компания разработчиков UNIX, и почтовая программа, в которой все письма лежат бессистемной кучей, а единственным средством в этой куче разобраться служит "революционный" поиск нужного письма по куску текста из него, который несовершенная наша память успела запомнить...&lt;br /&gt;&lt;br /&gt;Могу предположить: наверное, очень не любили Сергей и Ларри убираться в своих комнатах в университетской общаге - и придумывая свой почтовик, перенесли эту нелюбовь в его дизайн. В самом деле: если мы такие, то ведь и все другие ненавидят наводить порядок в своих вещах и делах!..&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Персональные организаторы&lt;br /&gt;&lt;/strong&gt;(Схитрил: в одну позицию запихал сразу две программы, но они того стоят): The Journal и Onfolio.&lt;br /&gt;&lt;br /&gt;Очень долго – несколько лет – искал подходящие инструменты для организации персональных данных, перепробовал, наверное, все, что мог найти в известных коллекциях. Уже надежду потерял, но в итоге все-таки нашел и почти счастлив :-) Не сочтите за рекламу (хотя, собсно, почему бы и нет?)&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;The Journal&lt;/strong&gt; (&lt;a href="http://www.davidrm.com"&gt;http://www.davidrm.com/&lt;/a&gt;) – в нем я веду профессиональный дневник (только для себя), сохраняю наиболее важные письма, готовлю тексты для блога, составляю и веду различные рабочие планы и вообще, храню всю текстовую информацию, имеющую отношение к моим проектам. Очень удобная программа: то, что действительно важно, она автоматизирует (например, ведение дневника), второстепенные детали оставляет на усмотрение пользователя. Документы можно организовывать в виде древовидной структуры любой сложности. С точки зрения дизайна программа вполне традиционная и не требует много времени на освоение. Встроенный редактор сделан на движке от Ворда и предоставляет вполне адекватную моим потребностям функциональность, включая хорошую поддержку таблиц. Вполне отрабатывает свои 40 долларов :-).&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Onfolio&lt;/strong&gt; – средство для сбора информации из Интернета. Можно собирать и структурировать ссылки и делать вырезки из страниц сайтов. Есть известное количество программ, предоставляющих аналогичный сервис, но для меня эта - однозначно лучшая. Вырезает куски на редкость адекватно, с полным сохранением оформления, позволяет редактировать вырезанное (правда, редактор все-таки слабоват). Структурируется информация традиционными парадигмами – есть понятие коллекции, в которой можно создавать каталоги, а в них – записи. Коллекция – это просто файл. При вырезании запоминается дата и адрес источника, можно добавлять свои атрибуты (заголовок, описание, цветной флажок). Очень не хватает тегов, средств упорядочения каталогов и цветового выделения заголовков записей. Собранные коллекции (части коллекций) можно экспортировать в виде единого mhtm-файла, который прекрасно отображается броузером. Разумеется, в записях можно хранить не только вырезки, но и произвольные тексты, PDF-документы, фотографии и прочее... Есть фид-агрегатор, но я его не использую. Программа встраивается в IE (в панели Windows Live Toolbar появляются дополнительные кнопочки) и управляется очень просто. Кроме плагина для IE, в комплекте есть и независимый вариант: Onfolio Deskbar.&lt;br /&gt;&lt;br /&gt;В свое время я по-честному купил Onfolio и с удовольствием юзал ее года два, но в один прекрасный день фирму-разработчика купил Микрософт, и программа стала бесплатной составной частью Windows Live :-). Ссылку не даю – потерял, а снова искать лень. Программу точно можно найти в недрах микрософтовского сайта, но придется немного покопаться: прямая ссылка из раздела Windows Live не работает, придется искать обходные пути. Но она там точно лежит! :-)&lt;br /&gt;&lt;br /&gt;Передаю эстафету (только троим; к сожалению, не все коллеги, предпочтения которых могли бы быть интересны, ведут свои блоги):&lt;br /&gt;&lt;br /&gt;&lt;a href="http://krotoff.livejournal.com/"&gt;Александр Кротов&lt;/a&gt;&lt;br /&gt;&lt;a href="http://gouriev.livejournal.com/"&gt;Дмитрий Гурьев&lt;/a&gt;&lt;br /&gt;&lt;a href="http://stump-workshop.blogspot.com/"&gt;Сергей Розовик&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8224163229837394669-1365134255741696027?l=zouev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zouev.blogspot.com/feeds/1365134255741696027/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8224163229837394669&amp;postID=1365134255741696027' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8224163229837394669/posts/default/1365134255741696027'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8224163229837394669/posts/default/1365134255741696027'/><link rel='alternate' type='text/html' href='http://zouev.blogspot.com/2008/03/5.html' title='5 инструментов, без которых я не могу работать продуктивно'/><author><name>zouev</name><uri>http://www.blogger.com/profile/09163739178551976623</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8224163229837394669.post-5641221019641911960</id><published>2007-11-06T17:14:00.000+01:00</published><updated>2007-11-06T17:22:40.381+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Идеи'/><category scheme='http://www.blogger.com/atom/ns#' term='Проекты'/><title type='text'>"Древовидный" C++</title><content type='html'>Сергей Прохоренко в комментарии написал:&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#009900;"&gt;Вот несколько моих постов в форумах, которые могут быть полезны для Вашей разработки «древовидного» Си++...&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Сергей, спасибо за ссылки и развернутые комментарии, а также за идею заголовка для этого поста :-). Практически со всеми соображениями, высказанными Вами, можно согласиться. Хочу только немного прояснить свое, так сказать, профессиональное «позиционирование» (выделения в Ваших цитатах – мои):&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#009900;"&gt;Думаю, что кроме низкоуровневого отображения &lt;strong&gt;программного модуля в виде дерева&lt;/strong&gt;, должно быть и высокоуровневое представление &lt;strong&gt;программируемой модели&lt;/strong&gt; как совокупности внешней среды и подсистем. Причем графически это может быть несколько разных типовых представлений, поддерживаемых системой программирования...&lt;br /&gt;&lt;br /&gt;Хочу подчеркнуть, что структура программы (компилируемые модули, области видимости имен, объекты) и структура модели (подсистемы, элементы) вообще говоря &lt;strong&gt;не обязаны совпадать&lt;/strong&gt;. При разработке сверху вниз следует начинать со структуры модели, на которую затем накладывать структуру программы.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Иными словами, Вы – совершенно справедливо - выделяете два фундаментальных компонента: модель предметной области и (программную) модель, ее реализующую. Ваши примеры касаются обоих компонентов; однако мои интересы все-таки ближе к программным моделям (каждый должен заниматься своим делом :-)); формализация и структурирование предметной области – все-таки весьма специфическая и далекая от меня задача, я пытаюсь что-то делать, скорее, в сфере анализа языков программирования как таковых.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;Именно этому – своему проекту, которым я занимаюсь несколько последних месяцев – я хотел бы посвятить ближайшую серию постов (почти уже готовых). Речь там пойдет только и исключительно о том, как половчее представить программу на ЯП в виде дерева (а на самом деле, конечно, графа) и какие преимущества можно из такого представления получить.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Причем, что принципиально важно: не просто "представить программу в виде дерева", и даже совсем не так: скорее, представить &lt;strong&gt;все знание об этой программе&lt;/strong&gt;, включая, помимо структурной, и &lt;strong&gt;семантическую информацию&lt;/strong&gt; - в виде некоей концептуально и технически единой структуры, а также обеспечить удобный и эффективный доступ к этой структуре - как программный, из проблемно-ориентированных приложений, так и посредством стандартных инструментов.&lt;br /&gt;&lt;br /&gt;И последнее замечание.&lt;br /&gt;В некоторых текстах (не у Вас конкретно) чувствуется некая склонность к преувеличению важности для конечных пользователей "древовидного представления" программ. Я уже писал, что скептически отношусь к попыткам полной смены программной парадигмы: мол, синтаксис – гадость и излишество, давайте его выкинем и перейдем на древовидное представление программ (а заодно и обобщим все на свете: чего там, ведь условный оператор и в Си, и в Модуле, и где-там-еще представляется одинаковым деревом... :-)).&lt;br /&gt;&lt;br /&gt;Менталитет разработчиков – вещь все-таки довольно деликатная и требует по крайней мере уважительного отношения. Чтобы совершить подобное насилие над привычками программистов, нужно предложить нечто, что было хотя бы таким же простым, удобным и универсальным, как синтаксически организованный программный текст. Чтобы манипулировать деревом, нужна как минимум адекватная поддержка – соответствующие программные инструменты – не говоря уже о том, чтобы такие инструменты сравнились по простоте и удобству с типичными текстовыми редакторами. Конечно, могут возразить, что в принципе манипулировать деревом ненамного сложнее, чем текстом на формальном языке – однако фундаментальное преимущество текста заключается в том, что с ним можно успешно и эффективно работать великим множеством способов - вплоть до листа бумаги.&lt;br /&gt;&lt;br /&gt;Поэтому, если говорить о конечных пользователях – программистах, я бы все-таки рассматривал древовидное представление программы как &lt;em&gt;дополнительное&lt;/em&gt; средство – для визуализации и навигации, например,- наряду с обычными (продвинутыми) текстовыми редакторами. С другой стороны, любой сколько-нибудь серьезный инструмент для работы с программными текстами (компилятор, например) практически всегда будет основываться на древовидном представлении. Существенно то, что дерево служит сугубо внутренним целям этого инструмента.&lt;br /&gt;&lt;br /&gt;(Между прочим, редактор Visual Studio включает элементы «древовидного» подхода – фрагменты текста программы, соответствующие отдельным синтаксическим конструкциям, можно избирательно сворачивать и разворачивать. К сожалению, набор языковых конструкций, управляемых редактором, ограничивается пространствами имен, классами, функциями и комментариями и не распространяется на «внутренности» функций. Скорее всего, нечто подобное и в Эклипсе есть; может, даже и получше, чем в VS?)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8224163229837394669-5641221019641911960?l=zouev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zouev.blogspot.com/feeds/5641221019641911960/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8224163229837394669&amp;postID=5641221019641911960' title='Комментарии: 6'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8224163229837394669/posts/default/5641221019641911960'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8224163229837394669/posts/default/5641221019641911960'/><link rel='alternate' type='text/html' href='http://zouev.blogspot.com/2007/11/c.html' title='&quot;Древовидный&quot; C++'/><author><name>zouev</name><uri>http://www.blogger.com/profile/09163739178551976623</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8224163229837394669.post-3386732118216931484</id><published>2007-11-06T15:25:00.000+01:00</published><updated>2007-11-06T16:37:21.017+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Публикации'/><category scheme='http://www.blogger.com/atom/ns#' term='Standardization'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>Недавняя статья Страуструпа</title><content type='html'>&lt;strong&gt;Evolving a language in and for the real world: C++ 1991 - 2006&lt;/strong&gt;&lt;br /&gt;Ссылка: http://www.research.att.com/~bs/hopl-almost-final.pdf&lt;br /&gt;Статья большая, почти 60 страниц.&lt;br /&gt;Написана для очередной конференции по истории языков программирования.&lt;br /&gt;&lt;br /&gt;Первые главки статьи повторяют некоторые ранние статьи и его книгу "Дизайн и эволюция С++", но интерес также представляет информация, относящаяся к процессу принятия нового Стандарта C++.&lt;br /&gt;&lt;br /&gt;В целом, статья, безусловно, стоит того, чтобы ее внимательно прочитать.&lt;br /&gt;&lt;br /&gt;Собственно, сама статья – не новость, и в некоторых блогах ее комментировали еще летом; см, например, &lt;a href="http://alenacpp.blogspot.com/2007/06/evolving-language-in-and-for-real-world.html"&gt;здесь&lt;/a&gt;. Но, кажется, никто не заметил (или просто не счел интересной?) короткую, но поистине замечательную фразу (выделения мои):&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;C++'s success in real-world use also led to influences that are less beneficial. &lt;span style="color:#ff0000;"&gt;The frequent use of &lt;strong&gt;ugly and irregular C++ style&lt;/strong&gt; of syntax in modern languages &lt;strong&gt;is not something I'm proud of&lt;/strong&gt;&lt;/span&gt;. It is, however, an excellent indicator of C++ influence - nobody would come up with such syntax from first principles.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Удивительно видеть такую трезвую и недвусмысленную оценку «большого стиля» C++ от самого создателя этого языка! И одновременно, с чувством глубокого удовлетворения наблюдать такой классный пинок тем, кто копирует «ugly and irregular style of syntax» из примитивно понятых «маркетинговых» соображений... Все ведь понимают, в чей огород этот камень.&lt;br /&gt;&lt;br /&gt;P.S. Возможно, в иных обстоятельствах не так бы это зацепило, но как раз сейчас борюсь (в очередной раз...) с этим нерегулярным синтаксисом и семантическими трудностями, которые - как ни покажется странным - порождаются именно этим синтаксисом...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8224163229837394669-3386732118216931484?l=zouev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zouev.blogspot.com/feeds/3386732118216931484/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8224163229837394669&amp;postID=3386732118216931484' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8224163229837394669/posts/default/3386732118216931484'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8224163229837394669/posts/default/3386732118216931484'/><link rel='alternate' type='text/html' href='http://zouev.blogspot.com/2007/11/blog-post.html' title='Недавняя статья Страуструпа'/><author><name>zouev</name><uri>http://www.blogger.com/profile/09163739178551976623</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8224163229837394669.post-2896334082329003065</id><published>2007-11-05T12:26:00.000+01:00</published><updated>2007-11-05T15:25:34.097+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='XML'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><category scheme='http://www.blogger.com/atom/ns#' term='XSLT'/><title type='text'>XML как замена всему :-)</title><content type='html'>&lt;div align="right"&gt;А вообще, конечно же, синтаксис надо давить.&lt;br /&gt;Без синтаксиса лучше.&lt;br /&gt;По этой причине Лисп и стоит выше всех прочих, вместе взятых&lt;br /&gt;(&lt;em&gt;Из комментариев&lt;/em&gt;)&lt;/div&gt;&lt;br /&gt;&lt;div align="right"&gt;&lt;br /&gt;- Авек плезир! - отозвался Фагот, - но почему же&lt;br /&gt;с вами одним? Все примут горячее участие!&lt;br /&gt;(&lt;em&gt;«Мастер и Маргарита»&lt;/em&gt;)&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="left"&gt;А почему же только Лисп? См. второй эпиграф.&lt;br /&gt;А почему только синтаксис? Почему не задавить заодно и семантику? :-)&lt;br /&gt;&lt;br /&gt;Ну, разумеется, рядом с Лиспом по степени, так сказать, отсутствия синтаксиса, поставить почти нечего. В самом деле, если отвлечься от лексических соглашений и немногих технических деталей вроде спецификации параметров или точечной записи, синтаксис Лиспа описывется всего тремя тривиальными правилами :&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;color:#3333ff;"&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;Program ::= List&lt;br /&gt;List ::= '(' { Element } ')'&lt;br /&gt;Element ::= List | Atom&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Весь язык, собственно говоря, «перетек» в семантику – в правила интерпретации списков, которые (правила) определяются в зависимости от первого элемента.&lt;br /&gt;&lt;br /&gt;Насколько это упрощает/усложняет программирование и чтение Лисп-программ – давайте не будем касаться этого вопроса. Сейчас мне хочется просто отметить интересное сходство Лиспа и... XML.&lt;br /&gt;&lt;br /&gt;В самом деле, XML ведь тоже (опять-таки, если не брать во внимание второстепенные технические детали), предельно прост:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;color:#3333ff;"&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;XMLDocument ::= Element&lt;br /&gt;Element ::= StartTag { Content } EndTag&lt;br /&gt;Content ::= Element | NonstructuredText&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Те же три (и очень похожие!) правила. (Правда, в StartTag еще и атрибуты можно задавать, но это та деталь, которой хочется пренебречь для элегантности сравнения... :-))&lt;br /&gt;&lt;br /&gt;У XML, в отличие от Лиспа, &lt;em&gt;нет собственной семантики&lt;/em&gt; – это всего лишь язык разметки. Смысл XML-документу придают агенты, его воспринимающие – либо люди, либо программы, с ним работающие. Но отсутствие семантики парадоксальным образом оборачивается невиданным расширением сфер использования: с помощью XML можно описать практически все на свете; главное – договориться, как именно описывать и как понимать/интерпретировать такое XML-описание. Для первого служат DTD, Schema или различные неформальные соглашения, для второго – шаблоны XSLT плюс смежные технологии, а также стандартизованные программные интерфейсы – DOM, SAX и подобные.&lt;br /&gt;&lt;br /&gt;Вообще-то писать на эту тему можно очень много, но сейчас я хочу только лишь указать на проект Superx++ (http://xplusplus.sourceforge.net/), интересный как раз попыткой предложить XML как замену синтаксиса всеми нами любимого языка C++.&lt;br /&gt;&lt;br /&gt;Собственно, смысл проекта достаточно прост: предлагается нотация, полностью заменяющая синтаксис C++ эквивалентными XML-конструкциями. Правда, более внимательное чтение примеров не подтверждает полной замены: автор не решился «xml-изировать» язык целиком и синтаксис выражений оставил в исходном виде. Более того, в какой-то момент он, похоже, испугался собственного радикализма и предложил некий «промежуточный» вариант под названием &lt;em&gt;shortx&lt;/em&gt;, в котором язык переведен в XML-нотацию только частично...&lt;br /&gt;&lt;br /&gt;Вот, полюбуйтесь: объявление класса в XML-нотации. Исходное, «плюсовое» объявление легко восстановить.&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&amp;lt;class name="XTree"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;scope type="public"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;func name="GetSize" type="int"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;return&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;eval member="Size" object="this"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/return&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/func&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;var name="Size" type="int"&gt;200&amp;lt;/var&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/scope&amp;gt;&lt;br /&gt;&amp;lt;/class&amp;gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Отметим, что (само)уверенности автору не занимать: одна из его первых статей на эту тему называется так: &lt;span style="color:#3333ff;"&gt;x++: The World's First Full XML-Based Programming Language Released!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;(Сначала язык назывался X++, но это имя оказалось занято более «авторитетными» компаниями, и автору пришлось сменить его на superx++.)&lt;br /&gt;&lt;br /&gt;Что касается собственно проекта Superx++, то его реализация не вышла из беты, а с 2004 года он, кажется, не развивается; по правде говоря, трудно представить себе какое-то реальное практическое применение такого парадоксального подхода... В общем, любопытна только идея как таковая, а также некоторые технические подробности; в частности, такая.&lt;br /&gt;&lt;br /&gt;Для superx++ автор сделал интерпретатор, причем написал его на плюсах. А почему не попытаться &lt;strong&gt;применить для этой же цели XSLT&lt;/strong&gt;? Это выглядело бы логично: ведь он как бы хочет по максимуму использовать преимущества XML-технологий? Понятно, что автор хотел сделать эффективный инструмент, так как надеялся найти практическое применение своему проекту (даже фирму специально для этого сделал), но мне кажется, исследователькая ценность проекта от такого выбора только бы возросла, при этом совершенно неважно, в какой мере это ему бы в итоге удалось. Даже отрицательный результат здесь был бы очень интересен; по крайней мере, мы бы лучше себе представляли границы применимости шаблонов XSLT. Я, например, давно хочу эти границы применимости почувствовать...&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;strong&gt;UPDATE&lt;/strong&gt;: совершенно случайно вдруг увидел старую статью В.Турчина: &lt;/div&gt;&lt;div align="left"&gt;&lt;/div&gt;&lt;div align="left"&gt;Рефал как язык для обработки xml-документов&lt;br /&gt;Валентин Турчин&lt;/div&gt;&lt;div align="left"&gt;Опубликовано в журнале "Компьютерра" №25 от 02 июля 2001 года&lt;br /&gt;&lt;strong&gt;Ссылка: &lt;a href="http://www.computerra.ru/2001/402/10900/"&gt;http://www.computerra.ru/2001/402/10900/&lt;/a&gt;&lt;/strong&gt;&lt;/div&gt;&lt;p&gt;Там, помимо вопросов обработки XML-документов средствами Рефала, обсуждается и вариант XML-нотации для этого языка...&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8224163229837394669-2896334082329003065?l=zouev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zouev.blogspot.com/feeds/2896334082329003065/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8224163229837394669&amp;postID=2896334082329003065' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8224163229837394669/posts/default/2896334082329003065'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8224163229837394669/posts/default/2896334082329003065'/><link rel='alternate' type='text/html' href='http://zouev.blogspot.com/2007/11/xml.html' title='XML как замена всему :-)'/><author><name>zouev</name><uri>http://www.blogger.com/profile/09163739178551976623</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8224163229837394669.post-1035905586468651357</id><published>2007-10-31T12:32:00.000+01:00</published><updated>2007-10-31T13:20:56.818+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Zonnon'/><category scheme='http://www.blogger.com/atom/ns#' term='Oberon'/><category scheme='http://www.blogger.com/atom/ns#' term='Ada'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>Простота и сложность: завершение</title><content type='html'>Коллеги, я бы хотел постепенно завершить дискуссию «Простота и сложность». Во-первых, все самое главное, кажется, уже сказано, и повторять соображения еще раз не стоило бы – как мне, так и моим комментаторам. Во-вторых, хочется постепенно перейти к темам, обозначенным в самом первом моем посте (и вообще, приблизиться к компиляторной тематике :-)), и потому нужен некий перерыв, чтобы собраться с мыслями.&lt;br /&gt;&lt;br /&gt;Конечно, отвечать на комментарии было бы логично в соответствующем разделе. Но развернутый ответ там не напишешь: получается слишком длинно и «некрасиво», потому приходится делать отдельный пост.&lt;br /&gt;&lt;br /&gt;Прежде всего, должен извиниться за безграмотность.&lt;br /&gt;Вот что мне написали в комментариях:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#009900;"&gt;&gt; Си: линейная последовательность функций. Си-функция не может хранить собственный контекст между своими вызовами (это «stateless»-компонент), поэтому для обеспечения сколько-нибудь нетривиального взаимодействия приходится активно использовать глобальные переменные.&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#009900;"&gt;То есть как так? А как же static-переменные внутри функций? Они же инициализируются один раз при первом вызове функции, а затем сохраняют своё значение между вызовами функций:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Виноват, совсем забыл про локальные статики. Каюсь. Насчет того, что функции – это stateless-компоненты, дурака свалял. Вообще, весь процитированный абзац выглядит не слишком логичным: &lt;em&gt;взаимодействие&lt;/em&gt; функций никак не может быть связано с их собственными контекстами; каждый такой контекст служит как раз для сохранения значений между вызовам самой этой функции и недоступен другим.&lt;br /&gt;&lt;br /&gt;Кроме того, и к самой теме поста – «какая модульность мне нужна» - этот пассаж не имеет особого отношения. Функции в Си если и могут быть названы модулями, то разве только совсем уж «кончеными» фанатами Си. :-)&lt;br /&gt;&lt;br /&gt;Править основной текст после появления справедливых комментариев – не слишком корректно, потому ограничусь этим ответом.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Комментарии AVP и мои комментарии на комментарии :-)&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#009900;"&gt;&lt;em&gt;Да, в Обероне есть модули. Очень хорошее средство; где-то я уже писал, что считаю модульность (не путать с возможностью раздельной компиляции компонент!) исключительно важным свойством языка, которое не менее (а иногда и более) существенно, нежели, скажем, поддержка ООП. &lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#009900;"&gt;С тем, что модульность иногда важнее ООП, согласен. Но не понимаю, чем Вам раздельная компиляция "не угодила"? :)&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Да почему же не угодила? Нормальное средство для Си и подобных языков, естественно вытекающее из линейной структуры программ и практических потребностей разработки. Другое дело, что это вполне, так сказать, «безыдейное» средство: грубо говоря, разрезать программу на части можно почти произвольным образом (в языке нет явных правил оформления этих частей) и положить их в разные места, сказав, что эти части будут компилироваться раздельно. Кроме того, этого явно &lt;em&gt;недостаточно&lt;/em&gt;; об этом, собственно, и был предыдущий пост.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#009900;"&gt;Возможно, здесь просто терминологическое расхождение (иногда раздельной (separate) компиляцией называют то, что - в терминологии Вирта - называется независимой (independent) компиляцией).&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Ну, примерно так. Мне бы хотелось, чтобы в языке были развитые средства структурирования программ (та самая модульность), а уж техническая возможность компилировать структурные компоненты программы по отдельности подразумевалась бы как естественное следствие этой модульности. Собственно, примерно как в Аде. Модуль (пакет, подпрограмма, задача) – это языковое понятие; раздельная компиляция – больше требование к среде программирования: - к компилятору, линкеру и т.д.&lt;br /&gt;&lt;br /&gt;Попытки назвать &lt;em&gt;модулями&lt;/em&gt; произвольные наборы функций и глобалов в Си, по какой-то причине сложенные в один текстовый файл и компилируемые отдельным вызовом компилятора, выглядят с одной стороны, явно архаично и, с другой стороны,- до смешного претенциозно.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#009900;"&gt;&lt;em&gt;Но вот достаточно ли простого набора одинаковых сущностей (и опять, как и в Си, линейного), чтобы адекватно отражать многообразные отношения между частями создаваемой системы?&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#009900;"&gt;Почему это набор модулей линейный, как список функций в Си? Между модулями существуют отношения экспорта/импорта, благодаря которым (1) они образуют иерархическую расширяемую структуру (даг), (2) корректный порядок инициализации модулей гарантирован.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Конечно, линейный. Отношения импорта/экспорта сами по себе не дают нового качества. Функции в Си характеризуются такими же по сути отношениями импорта/экспорта: каждая функция экспортирует свое имя и импортирует имена всех доступных функций и глобалов. Оберон-модули как таковые не образуют &lt;em&gt;расширяемую иерархическую&lt;/em&gt; структуру: такую структуру образуют расширяемые типы &lt;em&gt;внутри модулей&lt;/em&gt;. Структура Оберон-программы, скорее, маскирует, скрывает расширяемую иерархию типов. Иными словами, сейчас Оберон-модули – это однородный набор контейнеров, по которым распределено дерево типов.&lt;br /&gt;&lt;br /&gt;Если вывести типы из-под «власти» модулей и сделать сами эти типы модулями (записи, собственно, и так являются концептуально вполне самостоятельными сущностями, потому это выглядит, на мой взгляд, очень естественно и логично), то общая структура программы станет более ясной и адекватной задаче, реашемой этой программой. Примерно так и сделано в Зонноне.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#009900;"&gt;&lt;em&gt;Так, да не совсем: расширяемые записи (аналог классов в более распространенных языках) не являются средством структурирования программы в целом.&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#009900;"&gt;Слишком категорично сказано, вызывает сомнение.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Да вроде не слишком и категорично? Оберон-программа – это же набор одинаковых модулей-синглтонов, ведь так? То обстоятельство, что внутри этих модулей, так сказать, «кипит жизнь» в виде расширяемых записей и связанных с ними («примкнувших к ним» :-)) процедур, не меняет этой общей картины? Снаружи – линейный набор контейнеров, внутри конетейнеров – расширяемые типы, смесь «обычных» и связанных процедур и прочего...&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#009900;"&gt;Особенно, если вовремя вспомнить об обероновской программной шине или (на тему того, что модули как-то ограничивают записи) инсталлируемых каталогах объектов (например, в BlackBox). &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Я, честно говоря, не очень осведомлен насчет решений, воплощенных в Блэкбоксе, но подозреваю, что каталоги объектов – это, судя по названию, средство, помогающее программисту увидеть, какие же типы содержатся в модулях программы и каковы отношения между этими типами. Иными словами, если я прав, то Блэкбокс как раз пытается преодолеть тот недостаток Оберона, о котором я и говорю.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#009900;"&gt;А мне думается, что обероновское решение, дублированное в Аде, вводит принципиально другую (новую, если сравнивать с Си/Си++) архитектуру ПО: "тэгированную" (типизированную) память.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Наверное, можно сказать и так, но я не вижу здесь особенной разницы. Почему плюсовая архитектура не вводит эти типизированную память? По-моему, вводит. Кроме того, в моем посте речь шла, скорее, о средствах и возможностях структурирования программ (о модульности в широком смысле), а не об ООП-подходах.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#009900;"&gt;&lt;em&gt;Поэтому, между прочим, на обоих языках программировать объектно оказалось, попросту говоря, крайне неудобно.&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#009900;"&gt;А что значит программировать объектно? Возьмем в качестве примера (абстрактную) современную графическую ОС, основанную на обмене сообщениями. Ее объектная ориентированность вроде бы не подлежит сомнению. И на каком языке ее лучше программировать: на Си++ с его first-class классами :) или Обероне с его расширяемыми записями и проверкой динамического типа всего за одно сравнение? Можно даже сказать, что обероновская программная шина представляет собой простейшую реализацию схемы двойной диспетчеризации.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Честно говоря, я бы уклонился от общей дискуссии об ООП; наверное, я не чувствую себя для этого достаточно подготовленным (это все-таки не совсем компиляторная тема :-)). Пишу «объектно» вполне уверенно, а вот рассуждать и дискутировать... Извините.&lt;br /&gt;&lt;br /&gt;А насчет удобства и неудобства – я имел в виду сугубо практические аспекты, через которые я проходил в свое время в Аде, пытаясь на основе примеров из какой-то статьи написать что-то свое в том же стиле. Кроме того, у меня есть сходные свидетельсва людей, которые пытались делать то же, но уже в рамках своей работы. Повторяю, речь идет о попытках проектировать конкретные программы на основе объектной парадигмы, оперируя конструкциями конкретного языка.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#009900;"&gt;&lt;em&gt;Надеюсь, из сказанного примерно понятно, чего мне недостает в Обероне.&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#009900;"&gt;Если я правильно понял, в Обероне Вам в основном недостает (1) более разнообразной (специалированной) модульности и (2) классов.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Примерно так. Только я не стал бы разделять эти два пункта. Мне представляется, что «класс» в том виде, как он есть в том же Си++, должен иметь статус полноправного (специализированного) модуля, наряду с другими.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#009900;"&gt;Честно говоря, с первым согласиться легче. :)&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#009900;"&gt;Второе, по видимости, движение в том же направлении (по Мейеру, класс = тип + модуль), но вызывает большее сомнение: как уживутся "две женщины на одной кухне" (класс и модуль :) ).&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Что значит «уживутся»? Они друг другу никак не мешают, скорее необорот, помогают и дополняют, и вместо Вашего образа двух женщин на одной кухне я бы предложил, скажем, двух рабочих, несущих что-то тяжелое. Любой из них в одиночку груз даже не поднимет, а вместе они его не просто подняли, но даже и перенесли и поставили куда надо...&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#009900;"&gt;Ведь тот же Си++, где классы являются объектами первого рода, - язык определенно не модульный.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Конечно, не модульный, но не потому, что там классы, а потому, что он прямой потомок Си и сохранил всю его архаику. Классы в этом смысле – только добавка. Важная, принципиальная, фундаментальная – но только в том, что касается ООП. В плане же модульности плюсы, к сожалению, ничего к Си не добавили. В конце концов, ведь известный слоган «Си с классами» в применении к плюсам именно об этом.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#009900;"&gt;Не могли бы Вы подкинуть немного "инсайдерской" информации и ответить на давно мучающий меня вопрос? :)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#009900;"&gt;Почему в Обероне нет шаблонов - понятно. Но почему в нем не прижились даже "облегченные" дженерики, предлагавщиеся в середине 90-х Шиперским?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#009900;"&gt;Я задавал когда-то подобный вопрос Гуткнехту, но, к сожалению, не понял ответа (вероятно, помешал языковой барьер). &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Вряд ли я могу что-то сказать определенное. Основная цель Вирта, как я понимаю,- оставить в языке только фундаментальные, сущностные свойства. Между прочим, в этом смысле, я скорее бы понял, если бы он ввел в язык как раз полноценные шаблоны – все-таки generic programming вполне можно считать одной из фундаментальных программных парадигм. (Правда, при создании Оберона это было, мягко говоря, не очевидно.) А что говорить об облегченных дженериках, если он перечислимые типы и цикл for удалил?..&lt;br /&gt;&lt;br /&gt;Я несколько раз говорил с Виртом насчет generic programming (пытался рассказать ему, о чем, собственно, читаю лекции в ETH :-)), но особого интереса не почувствовал. Он когда-то общался с Александром Степановым, и мне показалось, что и тот не смог объяснить ему, чем важны и хороши дженерики... Кроме того, у Вирта, если я правильно ощутил, есть какое-то неприятие Степанова лично. Впрочем, не уверен, могу ошибаться. Возможно, он просто не считает GP столь уж важным подходом и потому относится не слишком серьезно и к его создателю.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8224163229837394669-1035905586468651357?l=zouev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zouev.blogspot.com/feeds/1035905586468651357/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8224163229837394669&amp;postID=1035905586468651357' title='Комментарии: 7'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8224163229837394669/posts/default/1035905586468651357'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8224163229837394669/posts/default/1035905586468651357'/><link rel='alternate' type='text/html' href='http://zouev.blogspot.com/2007/10/blog-post.html' title='Простота и сложность: завершение'/><author><name>zouev</name><uri>http://www.blogger.com/profile/09163739178551976623</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8224163229837394669.post-4610643609650646199</id><published>2007-10-20T01:15:00.000+02:00</published><updated>2007-10-20T01:45:49.947+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Zonnon'/><category scheme='http://www.blogger.com/atom/ns#' term='Oberon'/><category scheme='http://www.blogger.com/atom/ns#' term='Ada'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>Простота и сложность (2)</title><content type='html'>Позавчера пришел такой комментарий:&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#006600;"&gt;&gt; Для их создания приходится использовать адекватные инструменты, которые не могут не соответствовать сложности и ответственности задач и потому объективно не могут быть простыми. &lt;/span&gt;(это был мой текст)&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;Ну а если говорить в плоскости Java и C++? Первый язык значительно проще плюсов, и, при этом, на нем решаются действительно сложные задачи. В принципе, на том же Обероне Вирт реализовал реально работающую ОС -- проект отнюдь не маленький. Тот же Страуструп часто говорит, что язык, в конечном счете, вторичен, это всего лишь инструмент.&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;Кстати, с большим интересом прочитал бы ваше мнения о Java и C# как о языках (в некотором отрыве от виртуальной машины и фреймворка).&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Во-первых, я не хотел бы «сваливаться» в неформальное сравнение языков (обещание себе дал :-). Если уж сравнивать, то глубоко, предельно конкретно (по существу), тщательно и непредвзято. Для этого нужен традиционный формат журнальной статьи, причем в журнал уровня Software: Practice &amp;amp; Experience или по крайней мере C++ User’s Journal, но уж конечно, не заметка в блог. (Кстати, что-то не припомню подобного сравнительного анализа!- по большей части, встречал только что-то вроде «Critique of C++» или известные едкие пассажи про «Жабу»...)&lt;br /&gt;&lt;br /&gt;Тем не менее, кое-что сказать можно. Конечно, Java проще и стройней (и чисто по-человечески – мне, по крайней мере - писать на ней, как и на C#, не в пример удобнее и приятнее, чем на плюсах). Что же касается решения сложных задач, то их ведь решают на всех языках – и на чистом Си, и на Обероне, в том числе. Я лично знаю человека, который один написал &lt;em&gt;больше полумиллиона строк&lt;/em&gt; на ассемблере БЭСМ-6 - и его программа была вполне рабочей, даже популярной - несколько десятков инсталляций по бывшему Советскому Союзу.&lt;br /&gt;&lt;br /&gt;Вопрос, в конечном счете, заключается в том, какова &lt;strong&gt;цена&lt;/strong&gt; решения, основанного на том или ином языке: какова вероятность завершения работы в заданный срок, насколько такое решение надежно, масштабируемо, развиваемо, сопровождаемо – прежде всего, в долговременном плане. Если брать в рассмотрение эти критерии, то мне все-таки кажется, что «простые» языки... ну, скажем мягко, не выглядят полностью адекватными им (этим критериям).&lt;br /&gt;&lt;br /&gt;Насчет вторичности языка. Язык, конечно, вторичен, однако встык к Вашей цитате из Страуструпа я бы поставил цитату из Дейкстры (под рукой нет первоисточника, передаю смысл): «язык – это инструмент, но это такой инструмент, который оказывает глубокое (и тонкое!) влияние на мышление того, кто им пользуется». Рискну проиллюстрировать тезис классика вполне тривиальным примером.&lt;br /&gt;&lt;br /&gt;Пусть вам нужно запрограммировать группу логически связанных действий, которые работают над некими общими для них данными. В простом Си у вас нет другого способа реализовать эти действия, кроме как определить данные в виде глобальных переменных (или структуры, неважно), а действия представить в виде простого набора функций. Если нужно как-то обособить этот код от других частей программы (уж не говорю – оформить его как независимый модуль!), то имеется, по существу, единственное решение -вырезать этот код (ножницами :-)) из программы, положить его в отдельный файл, а для «склейки» программы использовать текстовые инклюды. Написаны десятки статей, объясняющих недостатки и опасности такого решения, не буду повторять их,- но ведь в Си ничего другого нет! Ну, в крайнем случае можно попытаться откомпилировать этот фрагмент отдельно от основной программы, а потом прилинковать его; однако не всегда это возможно, а очень многие проблемы при этом остаются.&lt;br /&gt;&lt;br /&gt;Так вот, значит ли это, что Си нельзя использовать при разработке сложных программ? Конечно, не значит!- используют же. Но в этом случае на объективную сложность решаемой задачи будут накладываться сложности, порожденные бедным набором выразительных средств и возможностей инструмента. То есть, язык не только не помогает«бороться со сложностью задачи», но еще и привносит в решение собственные проблемы... Получается, как и сказано у Дейкстры: инструмент оказывает (в данном случае негативное) влияние на мышление программиста по поводу его прграммы.&lt;br /&gt;&lt;br /&gt;Давайте пойдем чуть дальше; заодно я отвечу на один недавний комментарий. Вот он:&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#000099;"&gt;AVC&gt;Интересно, почему модульности очевидно недостаточно для борьбы со сложностью?&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000099;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#006600;"&gt;ЕЗ&gt;Э-э-э... А что, достаточно? То есть, в языке достаточно иметь модули, и они одни способны решить все проблемы создания больших программ? Я что-то не понял реплики, простите.&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#006600;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#000099;"&gt;Вопрос был не о всех проблемах создания больших систем, а конкретно о борьбе со сложностью. (Мне просто хотелось услышать обоснование. А то о Си++ Вы пишете много, а об Обероне только одно слово, что его очевидно недостаточно. :) )&lt;br /&gt;Что касается борьбы со сложностью.&lt;br /&gt;Возможно, я не в курсе, но мне известен только один способ борьбы со сложностью: делить сложное целое на части так, чтобы части не вмешивались в дела друг друга. Для этого нужны прежде всего границы, а границы и суть модули.&lt;br /&gt;Интересно, что еще (кроме модулей) имеет отношение непосредственно к борьбе со сложностью?&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#000099;"&gt;&lt;br /&gt;&lt;/span&gt;Да, в Обероне есть модули. Очень хорошее средство; где-то я уже писал, что считаю модульность (не путать с возможностью раздельной компиляции компонент!) исключительно важным свойством языка, которое не менее (а иногда и более) существенно, нежели, скажем, поддержка ООП.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Так вот, давайте тупо (с некоторым огрублением) сравним типичную структуру Си-программы и структуру Оберон-программы.&lt;br /&gt;&lt;br /&gt;Си: линейная последовательность функций. Си-функция не может хранить собственный контекст между своими вызовами (это «stateless»-компонент), поэтому для обеспечения сколько-нибудь нетривиального взаимодействия приходится активно использовать глобальные переменные.&lt;br /&gt;&lt;br /&gt;Чем сложнее Си-программа, тем из большего количества функций она состоит. А скажите, где вы видели действительно сложную систему, архитектура которой адекватно представлялась бы линейным набором функций? Вот и получается, что у Си-программиста имеется крайне ограниченный набор выразительных средств, и ему приходится редуцировать, «сводить» системную архитектуру – как правило, очень сложную и нетривиальную – к той, которую способен реализовать его инструмент. Помогает ли ему инструмент «бороться со сложностью»? Привносит ли он в реализацию собственные проблемы? Вопросы риторические, ответы очевидные.&lt;br /&gt;&lt;br /&gt;Оберон: одноранговый набор модулей-«синглтонов» (то есть, каждый модуль присутствует в работающей программе в единственном числе). Каждый модуль может хранить собственное состояние (контекст). "Активные" компоненты модуля - процедуры. Гораздо лучше, чем в Си, никто не спорит. Но вот достаточно ли простого набора одинаковых сущностей (и опять, как и в Си, линейного), чтобы адекватно отражать многообразные отношения между частями создаваемой системы? Тем более, что, собственно, какой-либо ассортимент этих сущностей отсутствует: есть только модули.&lt;br /&gt;&lt;br /&gt;Возразят: в Обероне есть поддержка ООП, которая вводит новое качество: можно организовывать более сложные и многобразные схемы взаимодействия компонент, более удобно развивать систему, не подвергая опасным модификациям написанное ранее.&lt;br /&gt;&lt;br /&gt;Так, да не совсем: расширяемые записи (аналог классов в более распространенных языках) &lt;strong&gt;не являются средством структурирования программы&lt;/strong&gt; в целом. Они существуют, по сути для того же, для чего предназначены были обычные записи: для представления данных. Добавились просто более продвинутые средства организации работы с этими данными и средства наращивания этой функциональности. Для целей организации программы служат те же модули, и только они. Записи остаются сущностями "второго сорта" - их можно экспортировать в другие модули и там расширять, но это не меняет общей ситуации: "объектные" записи всегда заключены внутри модулей и, тем самым, никак не помогают &lt;em&gt;строить программу&lt;/em&gt;. В точности та же картина, кстати, и в Аде (хотя в ней других средств организации программы изначально было гораздо больше).&lt;br /&gt;&lt;br /&gt;Можно сказать, что и Вирт, и авторы второй (1995 года) редакции Ады приняли одно и то же проектное решение: вводя в язык новые понятия (а в том, что касается создания сложных систем, ООП - принципиально новое понятие, пусть это было осознано не сразу), делали это, стараясь &lt;em&gt;как можно меньше изменить&lt;/em&gt; концептуальный базис существующего языка. Они рассуждали примерно так (Вирт, по крайней мере, именно так): зачем вводить "классы", если уже есть записи?- давайте введем "расширяемые" записи (в Аде - "тегированные"). Смысл тот же, а число базовых понятий не увеличилось. Зачем "функции-члены"?- пусть останутся обычные подпрограммы, только сделаем их "связанными с типом". В Аде, кажется, вообще даже нового термина не ввели, обошлись словесными объяснениями, как подпрограммы должны работать с параметрами тегированных типов.&lt;br /&gt;&lt;br /&gt;(Авторы Ады ужасно гордились, что они сделали свой язык объектно-ориентированным, добавив в него &lt;em&gt;всего лишь&lt;/em&gt; шесть, кажется, новых служебных слов. Нашли чем гордиться: Вирт не добавил вообще ни одного...)&lt;br /&gt;&lt;br /&gt;Такой подход кажется концептуально очень "чистым" и грамотным; он правилен и в практическом ключе: обеспечивается совместимость со старыми версиями языков. Однако, это решение оказалось очень ограниченным: "объектность" в обоих языках осталась "гражданином второго сорта", будучи всегда заключенной в рамки "более равных" программных единиц. Поэтому, между прочим, на обоих языках программировать объектно оказалось, попросту говоря, &lt;em&gt;крайне неудобно&lt;/em&gt;. Как только потребности решаемой задачи выходят за рамки красивых и понятных примеров из руководств, начинается сущее мучение. В Аде, якобы, хотят как-то улучшить "юзабилити", предлагая нотацию вида "object.method", но для этого надо ждать нового стандарта...&lt;br /&gt;&lt;br /&gt;(Вообще, у меня создалось отчетливое ощущение, что и автор Оберона, и авторы Ады не разделяли тогдашние некритические восторги по поводу ООП и расширили свои языки не по внутреннему убеждению в важности и необходимости новых средств, а, скорее, против собственного желания, подчиняясь общей тенденции. Неудобство ООП в этих языках - прямое следствие и такой "вынужденности" тоже).&lt;br /&gt;&lt;br /&gt;Надеюсь, из сказанного примерно понятно, чего мне недостает в Обероне. Возвращаясь к процитированному выше комментарию: действительно, есть "&lt;span style="color:#000099;"&gt;только один способ борьбы со сложностью: делить сложное целое на части так, чтобы части не вмешивались в дела друг друга&lt;/span&gt;". Проблема в том, что делить сложное нужно очень многими различными способами. И "&lt;span style="color:#000099;"&gt;в дела друг друга&lt;/span&gt;" приходится вмешиваться, и тоже по-разному. Модули хороши, но простых модулей &lt;em&gt;недостаточно&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;Чтобы не упрекали в голом критиканстве, вот очень приблизительный список того, что хотелось бы иметь. Может, чего-то упустил, а что-то из перечисленного на самом деле и ни к чему - не судите строго, это все-таки не статья в журнал. :-)&lt;br /&gt;&lt;br /&gt;Обобщая: различные &lt;strong&gt;виды&lt;/strong&gt; модулей и развитые средства задания &lt;strong&gt;отношений&lt;/strong&gt; между модулями. Скажем, в Аде можно делать вложенные модули (самый простой вид отношений), в последней Аде появились дочерние модули. В ней же есть задачи – модульные средства задания параллельного выполнения – и соответствующие средства синхронизации. В дополнение к задачам имеются "защищенные" модули (программируемый аналог монитора Хоара). В ООП-языках вводятся отношения наследования (пусть далеко не везде классы являются одновременно модулями, но сейчас важна идея). Вообще же классы должны быть first-class (полноправными) entities. Так, в Зонноне есть традиционные модули, интерфейсы, их реализации («обычные» классы), и еще есть средства задания протоколов взаимодействия модулей (в том числе, и асинхронных взаимодействий). В Аде модулем может выступать как «пакет» или «задача», так и одиночная подпрограмма. В ней же есть separate-подпрограммы (пусть с довольно слабой семантикой и с ограничениями).&lt;br /&gt;&lt;br /&gt;Еще раз повторяю, сейчас речь идет не "вообще", а именно об адекватности инструмента большим и сложным задачам. "Вообще" же Оберон мне очень нравится: помимо аккуратного дизайна, он несет в себе какую-то позитивную ауру, что ли... Программируя на нем, чувствуешь себя комфортно и уютно. Чего и близко нет в Си. Но это - личное, прошу прощения. :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8224163229837394669-4610643609650646199?l=zouev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zouev.blogspot.com/feeds/4610643609650646199/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8224163229837394669&amp;postID=4610643609650646199' title='Комментарии: 5'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8224163229837394669/posts/default/4610643609650646199'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8224163229837394669/posts/default/4610643609650646199'/><link rel='alternate' type='text/html' href='http://zouev.blogspot.com/2007/10/2.html' title='Простота и сложность (2)'/><author><name>zouev</name><uri>http://www.blogger.com/profile/09163739178551976623</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8224163229837394669.post-2098172069912300926</id><published>2007-10-19T20:45:00.001+02:00</published><updated>2007-10-19T21:06:20.087+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Публикации'/><category scheme='http://www.blogger.com/atom/ns#' term='Standardization'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Annotated C# Standard</title><content type='html'>Вот, сегодня пришло извещение от Amazon:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="left"&gt;&lt;img id="BLOGGER_PHOTO_ID_5123124903964847794" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://3.bp.blogspot.com/_bSVAvG6-TEw/Rxj-9OjILrI/AAAAAAAAAcQ/IdFOWgNma9U/s200/21tNFGHrmEL__PIsitb-dp-arrow,TopRight,15,-22_OU03_.jpg" border="0" /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onclick="return top.js.OpenExtLink(window,event,this)" href="http://www.amazon.de/gp/r.html?R=3SG7TN3NVLE9T&amp;amp;C=2C0884NHICJW5&amp;amp;H=wf0teEL0A6gkI9EY2QRQaFxPu4YA&amp;amp;T=C&amp;amp;U=http%3A%2F%2Fwww.amazon.de%2Fgp%2Fproduct%2F0123725119%2Fref%3Dpe_4131_7993591_pe_snp_119" target="_blank"&gt;C# Annotated Standard (Morgan Kaufmann)&lt;/a&gt; Jon Jagger&lt;br /&gt;EUR 47,03&lt;br /&gt;&lt;br /&gt;&lt;a onclick="return top.js.OpenExtLink(window,event,this)" href="http://www.amazon.de/gp/r.html?R=3SG7TN3NVLE9T&amp;amp;C=2C0884NHICJW5&amp;amp;H=wf0teEL0A6gkI9EY2QRQaFxPu4YA&amp;amp;T=C&amp;amp;U=http%3A%2F%2Fwww.amazon.de%2Fgp%2Fproduct%2F0123725119%2Fref%3Dpe_4131_7993591_pe_snp_119" target="_blank"&gt;&lt;/a&gt;Судя по заголовку, практически то же, что я задумал со стандартом C++. Жалко, что не выложили какую-нибудь главу (только предисловие и индекс); интересно было бы взглянуть, как они текст/комментарии организовали. Придется, наверное, саму книгу заказывать, чтобы было с чего пример брать. :-)&lt;br /&gt;&lt;br /&gt;Вот, кстати, синопсис. Английскими словами - практически то же обоснование, что и я выдвигал по поводу Аннотированного Стандарта C++:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Synopsis&lt;br /&gt;&lt;/strong&gt;&lt;span style="color:#000099;"&gt;Standards, while being definitive, do not usually serve as the best reference to the use of a programming language. Books on languages usually are able to explain usage better, but lack the definitive precision of a standard. &lt;strong&gt;This book combines the two&lt;/strong&gt;; it is the standard with added explanatory material.&lt;/span&gt; Written by members of the standards committee, &lt;span style="color:#000099;"&gt;it annotates the standard with practical implementation advice&lt;/span&gt;. It is the definitive reference to the C# International Standard.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8224163229837394669-2098172069912300926?l=zouev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://zouev.blogspot.com/feeds/2098172069912300926/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8224163229837394669&amp;postID=2098172069912300926' title='Комментарии: 5'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8224163229837394669/posts/default/2098172069912300926'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8224163229837394669/posts/default/2098172069912300926'/><link rel='alternate' type='text/html' href='http://zouev.blogspot.com/2007/10/annotated-c-standard.html' title='Annotated C# Standard'/><author><name>zouev</name><uri>http://www.blogger.com/profile/09163739178551976623</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_bSVAvG6-TEw/Rxj-9OjILrI/AAAAAAAAAcQ/IdFOWgNma9U/s72-c/21tNFGHrmEL__PIsitb-dp-arrow,TopRight,15,-22_OU03_.jpg' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8224163229837394669.post-2532740040660938134</id><published>2007-10-05T20:22:00.000+02:00</published><updated>2007-10-06T00:18:46.356+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Oberon'/><category scheme='http://www.blogger.com/atom/ns#' term='Ada'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>C++ и Ada: вынужденный пост</title><content type='html'>&lt;div align="left"&gt;Собирался уже написать очередной пост, как пришел такой комментарий:&lt;/div&gt;&lt;div align="left"&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align="left"&gt;&lt;span style="color:#3333ff;"&gt;OCTAGRAM комментирует... &lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align="left"&gt;&lt;span style="color:#3333ff;"&gt;&lt;em&gt;Для их создания приходится использовать адекватные инструменты, которые не могут не соответствовать сложности и ответственности задач и потому объективно не могут быть простыми.&lt;/em&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;span style="color:#000000;"&gt;(Это был мой текст)&lt;/span&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align="left"&gt;&lt;span style="color:#3333ff;"&gt;Ну так сравните сложность C++ и сложность Ады.&lt;/span&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align="left"&gt;&lt;span style="color:#000000;"&gt;Э-э-э... А зачем? Я разве что-то говорил про то, что какой-то язык сложнее, а какой-то проще? Не дождетесь. :-) Во всяком случае, ничего дурного про Аду у меня не было,- скорее уж, над C++ и над его автором иронизировал...&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align="left"&gt;&lt;/div&gt;&lt;div align="left"&gt;Но уж если Вы хотите (а Вы хотите: и тон, и содержание Вашего комментария это ясно показывают) сравнения, то вот Вам мой ответ: &lt;em&gt;&lt;strong&gt;оба хуже&lt;/strong&gt;&lt;/em&gt;.&lt;/div&gt;&lt;div align="left"&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align="left"&gt;На C++ я немного уже потоптался, вот вам про Аду.&lt;/div&gt;&lt;div align="left"&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align="left"&gt;&lt;span style="color:#3333ff;"&gt;В C++ мы должны не забывать ставить проверки.&lt;/span&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;span style="color:#3333ff;"&gt;В Аде мы проверки опционально снимаем.&lt;/span&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align="left"&gt;&lt;span style="color:#000000;"&gt;А кто мешает assert'ов понаставить куда надо? Они, вроде, тоже по предопределенному макросу включаются/отключаются?&lt;/span&gt;&lt;/div&gt;&lt;div align="left"&gt;Тяжелее, согласен, и программу загромождает. Зато все явно выписано, и не надо помнить, как в Аде, какие именно проверки делаются, и где, а где не делаются...&lt;/div&gt;&lt;br /&gt;&lt;div align="left"&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;span style="color:#3333ff;"&gt;В C++, чтобы сделать объект некопируемым, мы переопределяем operator= и конструктор копирования в приватной части.&lt;/span&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;span style="color:#3333ff;"&gt;В Аде мы пишем limited.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align="left"&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;span style="color:#000000;"&gt;Замечательно! Красивое служебное слово, все наглядно.&lt;/span&gt;&lt;/div&gt;&lt;div align="left"&gt;Только вот в плюсах действует &lt;em&gt;общий&lt;/em&gt; механизм задания собственных версий для всех операций, включая присваивание, и общие для всех правила управления доступом. А в Аде присваивание и операцией-то не считается, и, стало быть, пришлось для него отдельный limited-механизм вводить. Что лучше: набор различных средств для, в общем-то, одного и того же или единые (и вполне, кстати, ясные) правила для всех операций?..&lt;/div&gt;&lt;br /&gt;&lt;div align="left"&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;span style="color:#3333ff;"&gt;В C++, чтобы определить метод как виртуальный, мы пишем =0 после прототипа.&lt;/span&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;span style="color:#3333ff;"&gt;В Аде мы пишем is abstract.&lt;/span&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align="left"&gt;&lt;span style="color:#000000;"&gt;Согласен. Красиво и ясно. Страуструп служебные слова экономил, на мелочи &lt;/span&gt;&lt;span style="color:#000000;"&gt;их не тратил...&lt;/span&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align="left"&gt;&lt;span style="color:#3333ff;"&gt;В C++ тела настраиваемых методов должны быть в ашниках, а ненастраиваемых — в цппшниках.&lt;/span&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;span style="color:#3333ff;"&gt;В Аде все (видимые снаружи, я имею в виду) определения в .ads, все тела в .adb.&lt;/span&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align="left"&gt;&lt;span style="color:#000000;"&gt;Да никто и не спорит, что в Аде модульность лучше. (Только вот .ads и .adb - это не в Аде, а в GNATе. В стандарте на этот счет ничего нет.) В плюсах этот архаичный механизм заголовочных файлов целиком остался от предшественника, ничего не поделаешь, если надо было обеспечить совместимость.&lt;/span&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align="left"&gt;Только вот делать на основании этого вывод, что C++ "сложнее" Ады - как-то не слишком убедительно. В ответ я мог бы в красках рассказать, как нелепо в Аде сделана поддержка ООП (кто-то заметил, что программировать в объектном стиле на Аде - занятие не для слабонервных, и это истинная правда).... И, кстати, генезис этой нелепости тот же самый: надо было встроить (а на самом деле пристроить) поддержку ООП в уже существующий язык (Ада83) с тем, чтобы непременно обеспечить обратную совместимость - прямо как с C и C++...&lt;/div&gt;&lt;br /&gt;&lt;div align="left"&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;span style="color:#3333ff;"&gt;В C++ нельзя подключить пространство имён в ашнике. (точнее, можно, но по головке за такое не погладят)&lt;/span&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align="left"&gt;&lt;span style="color:#000000;"&gt;Э-э-э... А кто мне запретит, если мне это необходимо сделать? Прибегут хмурые дядьки и по лицу настучат? Конечно, то что Вы упоминаете - не самое лучшее, что может сделать программист, но, вроде, запретов-то и нету?&lt;/span&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align="left"&gt;&lt;span style="color:#3333ff;"&gt;В Аде ... ну, ясен пень, такая тупость только в C++ может быть, в Аде всё в порядке.&lt;/span&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align="left"&gt;&lt;span style="color:#000000;"&gt;Ваш тон, простите, много о Вас рассказывает. Можно и не отвечать дальше... &lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align="left"&gt;Почитайте внимательно правила использования with/use в Аде, правила, связанные с областями действия имен и видимости идентификаторов. Уверяю Вас, они ничуть не проще и не яснее плюсовых. Опытные Ада-программисты с трудом разбираются...&lt;/div&gt;&lt;br /&gt;&lt;div align="left"&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;span style="color:#3333ff;"&gt;В C++ простые аргументы нужно передавать по значению, а большие — по ссылке, иначе они полностью копируются.&lt;/span&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align="left"&gt;&lt;span style="color:#000000;"&gt;Ну, так и передавайте по ссылке, трудно, что ли? Можете слово const добавить, если модифицировать не собираетесь. Все нагляднее, чем про in по умолчанию помнить.&lt;/span&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align="left"&gt;&lt;span style="color:#3333ff;"&gt;В Аде входные параметры (с модификатором in по умолчанию) доступны только для чтения, поэтому копировать их не нужно. &lt;/span&gt;&lt;span style="color:#3333ff;"&gt;А уж как их передать на машинном уровне — это дело компилятора.&lt;/span&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align="left"&gt;&lt;span style="color:#000000;"&gt;Так и в плюсах стандарт явно отдает механизм передачи параметров по ссылке на откуп компилятору. В чем преимущество-то, не пойму. Функционально эквивалентные механизмы.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align="left"&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;span style="color:#3333ff;"&gt;В C++, чтобы настроить шаблон дробным числом, необходимо настроить его ссылкой на это дробное число.&lt;/span&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align="left"&gt;&lt;span style="color:#000000;"&gt;Ну и настройте ссылкой!&lt;/span&gt;&lt;/div&gt;&lt;div align="left"&gt;(Уж молчу о том, кому и &lt;em&gt;зачем&lt;/em&gt; может &lt;em&gt;такое&lt;/em&gt; понадобиться...)&lt;/div&gt;&lt;div align="left"&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align="left"&gt;&lt;span style="color:#3333ff;"&gt;В Аде ... ну, ясен пень, такая тупость только в C++ может быть, в Аде всё в порядке.&lt;/span&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align="left"&gt;Опять... Как же это часто встречается - эта великолепная уверенность в собственном праве припечатывать ярлыки куда и кому угодно! Невзирая, так сказать, на лица. "Тупость"... Не знаю, видели ли Вы один старый фильм, в нем герой говорит примерно следующее: &lt;/div&gt;&lt;div align="left"&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align="left"&gt;- То и дело слышишь: Тургенев не разобрался, Толстой недопонял... Как будто в истории орудовала банда двоечников!&lt;/div&gt;&lt;div align="left"&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align="left"&gt;&lt;span style="color:#3333ff;"&gt;В C++ namespace может быть одним, имя цппшника/ашника другим, а объектный файл, который нужно не забыть подключить — третьим.&lt;/span&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;span style="color:#3333ff;"&gt;В Аде между всеми тремя несложное соответствие. Да и то, реально знать нужно только namespace.&lt;/span&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align="left"&gt;&lt;span style="color:#000000;"&gt;Это, уважаемый, вы что-то не то сказали, воля Ваша. С стандарте нет ни слова об именах файлов-носителей Ада-программ и, тем более, о каких-то "соответствиях" между ними и именами в программе. Это все заморочки GNAT'а, и явно не самые удачные. По-моему опыту, требование называть файл с Ада-пакетом именем самого пакета - ужасная нелепость и неудобство. Семантически, файл как контейнер, и единица компиляции как его содержимое - совершенно различные сущности, и любые правила их "совместного" именования,- ничем не оправданы. Да, компилятору и линкеру можно не быть слишком умными (программист должен сам позаботиться, чтобы назвать файлы так, как им, а не ему, удобно). Но еще хуже, что одно неудачное проектное решение тянет за собой другие, вынужденные. Скажем, наличие ограничения "8+3" на имена файлов в некоторых ОС автоматически приводит к необходимости некоего соглашения: как надо сократить-искорежить имя Ада-единицы, чтобы полученным словом-уродцем поименовать файл, ее содержащий... А тут еще и дочерние единицы появились, с составными именами! Их-то как корежить, по новым каким правилам?&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align="left"&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;span style="color:#3333ff;"&gt;Это лишь несколько примеров к слову об адекватности сложности C++, &lt;/span&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align="left"&gt;&lt;span style="color:#000000;"&gt;Так вот в чем дело, оказывается! Вы читаете между строк!&lt;/span&gt;&lt;/div&gt;&lt;div align="left"&gt;Вам показалось, что смысл моего поста был в том, чтобы заявить об адекватности C++ уровню сложности современных задач? И где именно Вы это увидели?.. &lt;/div&gt;&lt;div align="left"&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align="left"&gt;Писал же (уж яснее, казалось бы, некуда) о C++ и Обероне как о двух крайних подходах к преодолению объективной сложности. Скепсис выражал и о том, и о другом. Критиканствовал даже. И н&lt;strong&gt;а&lt;/strong&gt; тебе - увидели апологетику C++...&lt;/div&gt;&lt;div align="left"&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align="left"&gt;Что ж... я уже не раз сталкивался с подобным эффектом: в самых невинных, самых прямых и бесхитростных моих словах ищут и находят какой-то второй смысл, неясные намеки и т.д. Так вот, во избежание подобных казусов в будущем, хочу заявить: в моих текстах никаких намеков, подтекстов, вторых планов и прочей литературщины &lt;strong&gt;нет&lt;/strong&gt;. То, что написано (и только это), я и хотел сказать. Можете считать, что я слишком глуп, чтобы делать тонкие намеки, организовывать подтексты и выстраивать вторые планы...&lt;/div&gt;&lt;div align="left"&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align="left"&gt;&lt;span style="color:#3333ff;"&gt;которой здесь было посвящено столько воды.&lt;/span&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align="left"&gt;&lt;span style="color:#000000;"&gt;Неужто много воды? Дык... Это все-таки блог, а не статья в журнал. Жанр другой. Свободный, так сказать, полет мысли. Извините, что отнял у Вас время. Однако, хочу честно предупредить, что и впредь намерен продолжать в том же духе. :-) Так что придется Вам теперь что-то другое читать, где воды поменьше... Найдете, поделитесь ссылочкой, please.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align="left"&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;span style="color:#000000;"&gt;Ну, и в заключение:&lt;/span&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align="left"&gt;&lt;span style="color:#3333ff;"&gt;А про Оберон (про первый) ещё Жан Ичбиа, создатель Ады &lt;/span&gt;&lt;a href="http://en.wikipedia.org/wiki/Oberon_programming_language" rel="nofollow"&gt;&lt;span style="color:#3333ff;"&gt;говорил&lt;/span&gt;&lt;/a&gt;&lt;span style="color:#3333ff;"&gt; :&lt;br /&gt;"&lt;em&gt;There are times when Wirth believes in small solutions for big problems. I don't believe in that sort of miracle. Big problems need big solutions!&lt;/em&gt;"&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align="left"&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;span style="color:#000000;"&gt;Ну так и весь мой предыдущий пост про то же! - почти теми же словами...&lt;/span&gt;&lt;/div&gt;&lt;div align="left"&gt;Что Вам не понравилось-то, не пойму?&lt;/div&gt;&lt;div align="left"&gt;Что я Аду не похвалил? :-)&lt;/div&gt;&lt;div align="left"&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align="left"&gt;P.S. Написал все это и подумал: какие-то все замечания мелкие. Ерунда, в общем. Придирки... Почему было не взять что-то очевидное, чтобы никто был не в силах возразить? Cравнить, скажем, модульность (аккуратно проработанную в Аде и попросту отсутствующую в плюсах)? упомянуть механизм подтипов - простой, но удивительно полезный в умелых руках, аналогов которому нет, кажется, больше нигде? Да и многозадачность - непростую в освоении, но надежную и полностью встроенную в язык?..&lt;/div&gt;&lt;br /&gt;&lt;div align="left"&gt;&lt;/div&gt;&lt;div align="left"&gt;P.P.S. Не хотел, честное слово... Обещал же себе не участвовать в религиозных войнах. Посл
