Б. Страуструп - Дизайн и Эволюция C++. 2006 (1160775), страница 38
Текст из файла (страница 38)
Официально самым важным считается комитет ЖС-21, сформированный Международной строить как интерпретатор, предоставляющий приложениям собственную среду. Но у такого подхода есть свои нюансы: в частности, становится трудно воспользоваться особенностями специализированной аппаратуры и следовать локальным требованиям к стилю. Работая на языке, пригодном для построения серьезных систем, мы должны смириться с тем, что вновь и вновь наивный пользователь посылает в сетевую конференцию сообщение: «Я перенес свой объект с Мас на БРАКС, и он перестал работать».
Как и переносимость, способность к взаимодействию — это вопрос проектирования и понимания тех ограничений, которые налагает среда. Некоторые программисты не знают, что фрагменты, откомпилированные двумя разными компиляторами С для одной и той же системы, необязательно можно будет связать друг с другом (скорее всего, это не получится). И тем не менее они приходят в ужас, оттого что С««не гарантирует такое взаимодействие. Это обычное явление, и мы должны просвещать пользователей. Работа комитета ИИИИИИИВ организацией по стандартизации (150).
Он работает по международным прави- лам и принимает окончательное решение о придании стандарту статуса междуна- родного. В частности, действует правило «одна страна — один голосы Другие стра- ны, в том числе Великобритания, Германия, Дания, Россия, Франция, Швеция и Япония, теперь имеют собственные национальные комитеты по стандартизации С++, которые направляют запросы, рекомендации и своих представителей на со- вместные заседания комитетов АХБ1/150. Мы не стали принимать никаких решений в обход процедуры голосования, удовлетворяющей правилам как АХЯ, так и 150.
Это означает, что комитет функ- ционирует, скорее, как двухпалатный парламент, где основные дебаты проходят в «нижней палате» (АХВ1), а затем решение ратифицируется в «верхией пала- те» (150). Однажды такая процедура привела к отклонению предложения, которое в про- тивном случае было бы принято незначительным большинством голосов. Таким образом национальные представители уберегли нас от ошибки, которая могла бы вызвать разногласия. Вопрос был в том, следует ли в какой-то форме определять для С++ ограничения на трансляцию.
Гораздо лучшее решение по этому поводу принято позднее. АХБ1 и 150 проводят совместные заседания три раза в год. Чтобы не вносить путаницу, я буду называть две зти структуры словом «комитет». Каждая встреча продолжается неделю, много часов уходит на решение процедурных вопросов.
Но гораздо больше времени тратится на всякие недоразумения, неизбежные, когда 70 человек пытаются разобраться, чту же все-таки обсуждается. Несколько днев- ных и несколько вечерних заседаний носят технический характер: здесь обсуж- даются такие вопросы, как международные наборы символов и идентификация типов во время выполнения, а также проблемы, относящиеся собственно к стан- дартизации, например формальные методики и организация международных структур по стандартизации. Остальное время отведено для встреч рабочих групп и обсуждений представленных ими отчетов.
Сейчас в работе участвуют такие группы: о по совместимости с С; о по ядру языка; о редакторская; о по окружению; о по расширениям; ст по вопросам интернационализации; о по библиотекам; а по синтаксису, Ясно, что за три недели в году комитету не справиться с таким обширным спектром вопросов, поэтому большая часть работы проводится в промежутках межзу встречами. На каждое заседание представляется стопка отпечатанных на обеих сторонах листа документов толщиной около трех дюймов.
Документы посылаются в двух бандеролях: одна за пару недель до заседания, чтобы все члены комитета могли с ними ознакомиться, а вторая — через две недели после заседания. йПИИИИИИВ Стандартизация 6.3. Как велась работа Большая часть работы над станлартами не вилна среднему программисту, а котла начинаешь ее описывать, выглядит зта работа скучной и понятной лишь посвященным. Множество усилий тратится на ясное и полное выражение и без того известных всем, но не упомянутых в руководстве возможностей, а также на разрешение вопросов, важных лля произволителей компиляторов.
Ведь зто они хотят быть уверены, что правильно поняли то или иное языковое средство. Однако подобные вопросы становятся потом существенными и для программистов, поскольку в основу даже очень тщательно написанной большой программы может быть случайно или намеренно положена возможность, для кого-то не полностью понятная. Если произволители компиляторов не договорятся, то программист окажется <заложником» единственного поставщика, а это уже противоречит моим взглялам на то, каким должен быть С++ (см. разлел 2.1).
б.2Л. Кто работает е комитете В комитет по С++ входят люди с разными интересами, ожиланиями и подготовкой. Одни работают на персональных компьютерах, другие — на 13Х1Х-машинах, третьи — на мейнфреймах и т.д. Одни используют С++, другие — нет, Кто-то хочет, чтобы С++ стал более объектно-ориентированным языком (причем «объектной ориентированностиь даются очень разные определения), других бы больше устроило, если бы зволюция С остановилась на АХВ1 С. Многие, но не все работали с С. Некоторые имеют опыт работы над станлартами, но их меньшинство. Есть профессиональные программисты. Олни обслуживают интересы конечных пользователей, другие поставляют на рьшок инструментальные средства. Некоторым интересны крупные проекты.
Кому-то необходима совместимость с языком С, комуто — нет. Если не считать того, что все входящие в комитет — добровольцы, не получающие за свою работу в нем ни копейки (хотя некоторые прелставляют компании), то трудно выделить какие-то черты, присущие всем без исключения. И зто хорошо: только очень разношерстная группа люлей может выразить интересы весьма неоднородного сообщества пользователей С++. Правда, из-за зтого дискуссии бывают не очень конструктивными и занимают много времени. Меня беспокоит также, что голос пользователей С++ (программистов и проектировщиков) может быть не услышан в хоре языковых пуристов, так называемых проектировщиков языков, бюрократов от стандартизации, разработчиков компиляторов и т.д.
У меня совещательный голос, то есть я представляю свою компанию, но голосует от нее другой человек. Узнать, какие компании представлены в комитете, вы сможете, взглянув на выборку из перечня участников, относящегося к 1990 гс Апн1аЫ, Арр!е, Атйт, ВеПсоге, Вот!апг(, ВПГЬЬ Аегозрасе, С1)С, ОаГа Оепега), 1)ЕС, Гп)!гзп, Неч!ец-расйагг(, 1ВМ, Еоз А!ашоз Хайопа! ЕаЬз, ЕпсЫ, Мепгог ОгарЬ1сз, М1сгозо(ц М1РЯ, НЕС, Ы1Н, ОЬ)ест Оез!яп, Опто!оя1сз, Рпше Сошрцгег, БАБ 1пзйгпге, В!ешепз Ы1хг!ог(, В!!!соп ОгарЬ|сз, Вцп, Таис(еш Сошрнгегз, Тейггоп!х, Техаз 1пзсгцшепгз, ()п!зуз, 1)9 %ЕСТ, ~Чапд, ЕоггесЬ и др.
Надеюсь, вы согласитесь, что отрасль представлена довольно широко. ИИИИИИКИ Как велась работа Чтобы проиллюстрировать возникающие сложности, я подробно остановлюсь на двух вопросах: разрешении имен и продолжительности функционирования временных объектов. Большая часть усилий комитета тратится на решение именно этих проблем. (пс х; с1азз Х ( Гпс т() ( теситп х; ) гпс х; Какой х имеется в виду внутри х:: й ()? А вот другой пример: суреде1 спас* т; с1азз у ( т с() ( т а = 0; сесотп ау ) суредес Гпс т; ); Какое т имеется в виду внутри у:: й ( )? В АВМ даются такие ответы: х в определении х:: й ( ) — это х:: х, а определение класса у содержит ошибку, поскольку смысл т изменяется после использования в у:: б ( ) .
Эндрю Кениг, Скотт Тэрнер (Бсогс Тцгпег), Том Пеннелло, Билл Гиббонс (Вй) 61ЬЪопз) и еще несколько человек потратили много часов, чтобы найти точные, полные, полезные на практике, логически непротиворечивые и совместимые (со стандартом С и существующим кодом С++) решения. Мое участие в такого рода спорах было ограничено: я как раз размышлял о расширениях. Сложность проистекает из противоречивости целей: (з мы хотим, чтобы при синтаксическом анализе можно было ограничиться одним проходом по тексту; (з изменение порядка следования членов не должно менять семантику класса; (з семантика функции не должна зависеть от того, определена данная функция прямо в объявлении класса или вне его; сз имена, объявленные во внешней области действия, должны быть видимы и во внутренней (так же, как в С); (з правила разрешения имен не должны зависеть от того, к чему относится имя.
Если строго следовать всем этим установкам, то синтаксический анализ будет достаточно быстрым, а пользователям не придется заботиться о соблюдении 6ЗЛ. Разрешение имен Самые большие сложности в определении С++ связаны с разрешением имен: с каким точно объявлением связано данное употребление имени. Ниже описана лишь одна проблема такого рода. Она относится к зависимости от порядка объявления членов класса. рассмотрим пример: ПШИИИИИИ Стандартизация 6.3Л.7. Правила разрешения имен в Ай()/( В АВМ эти проблемы решены без особого успеха.
Имена из внешней области действия можно использовать непосредственно, а возникающие при этом зависимости от порядка я попытался минимизировать с помощью двух правил: с) правило переопределения типа; имя типа нельзя переопрелелять в классе после того, как оно в ием уже использовалось; ц правило переписывания: функции-члены, определенные в объявлении класса, разбираются так, как если бы они были определены в точке, непосредственно следующей за концом объявления этого класса.
Из-за правила переопределения класс у дает ошибку: Сурес)ег сваг* Т; с1азз У ( ТГ() (Та=с; сесптпар ) сурес)ес (пс т/ // ошибка: т переопределен после // использования ); Правило переписывания говорит, что с! аз э Х следует интерпретировать как: 1пс х; с1азз Х ( 1пс Г(); 1пс х; 1п11пе 1пс х::1() ( гесигп х; ) // возвращает х::х К сожалению, не все примеры так просты. Рассмотрим: сопзс 1пс 1 = 99; с1азз 2 ( 1пс а[1]1 !пс г() ( сесисп 1; ) епаш ( 1 = 7 ): Этот пример корректен согласно букве правил АВМ, но находится в некотором противоречии их идеям. Два использования 1 относятся к разным определениям и дают разные значения.
Правило переписывания говорит, что 1 в Е:: ! ( )— это а:: 1 и равно 7. Однако для использования 1 в качестве индекса никакого правила переписывания нет, поэтому имеется в виду глобальное а, равное 99. правил, поскольку компилятор по большей части способен найти неоднозначные случаи употребления. В том виде, в каком они сформулированы сегодня, эти пра- вила очень удачны. Как велась работа ЯИИИИИИБ Несмотря на то что 1 используется для определения типа, само оно именем типа не является, поэтому не подпадает под действие правила переопределения. Правила АХЗ1/150 говорят, что этот пример некорректен, так как 1 переопределено после использования.