Б. Страуструп - Дизайн и Эволюция C++. 2006 (1160775), страница 20
Текст из файла (страница 20)
В свое время я рассмотрел и отверг такие альтернативы семантике языка и технологии компиляции. Непосредственный предшественник С++ — Срге — являлся довольно традиционным препроцессором, Компилятор Стгопт которому были неизвестны синтаксические конструкции, области действия и правила контроля типов С.
Это явилось источником многих проблем как в определении, так и при использовании языка. Я твердо решил не сталкиваться больше с такими трудностями в пересмотренном языке и его реализации. С++ и С(гопг проектировались вместе. Определение языка и технология компиляции, несомненно, были связаны друг с другом, но не так тривиально, как думают некоторые.
3.3.2. Синтаксический анализ С++ В 1982 г., в начале планирования С(гопс я хотел воспользоваться методом рекурсивного спуска, поскольку опыт написания таких синтаксических анализаторов у меня уже был. Они легко обеспечивают хорошую диагностику ошибок. Кроме того, мне импонировала идея иметь под рукой всю мощь универсального языка программирования, когда в синтаксическом анализаторе необходимо принимать те или иные решения. Но, будучи добросовестным молодым ученым, я спросил совета у экспертов. В то время в Центре исследований по вычнслителъной технике как раз работали Эл Ахо (А! Апо) и Стив Джонсон.
Они-то, главным образом Стив, и убедили меня, что: о вручную синтаксические анализаторы уже никто ие пишет; о это пустая трата времени; и при таком подходе неизбежно получится нечто непонятное, что даже сопровождать невозможно; о применяемая в подобном анализаторе техника восстановления после ошибок нссистематична, а значит, и ненадежна. Правильным приемом, по мнению вышеупомянутых специалистов, было бы использование 1 А1.В(1)-генератора синтаксических анализаторов, поэтому я принял на вооружение написанный Элом и Стивом гАСС [АЬо,19861.
Для большинства проектов такой выбор был бы идеальным. Это годилось бы почти для любого проекта, связанного с написанием экспериментального языка с нуля. Но, оглядываясь назад, я понимаю, что именно для С++ этот выбор оказался роковой ошибкой. С-ь+ был не экспериментальным языком, а почти совместимым нздмножеством С, а в то время еще никому не удалось написать для С 1А(.В(1)-грамматику. Такая грамматика для АХ81 С была построена Томом Пеннелло (Тош РеппеПо) спустя примерно полтора года, то есть слишком поздно. Даже созданный Джонсоном РСС вЂ” лучший из всех тогдашних компиляторов С— был не совсем корректен в некоторых деталях, которые для синтаксического анализатора С++ являлись весьма существенными. В частности, в РСС неправильно обрабатывались лишние скобки, поэтому (пс 1х ); нс воспринималось как объявление х.
Более того, из моих наблюдений следовало, что пользователи тяготеют к разным стратегиям разбора. Мое пристрастие к нисходящему разбору многократно проявлялось в форме написания конструкций, которые очень трудно ложатся на грамматику, поддерживаемую ТАСС. До сего дня С1гопг построен на базе синтаксического анализатора УАСС, определенным образом дополненного на уровне лексического разбора. С другой стороны, для С++ все же можно написать эффективный и достаточно изящный анализатор, использующий метод рекурсивного спуска.
Так построены некоторые современные компиляторы С++. П4ИИИИИИв Рождение С++ чо1о Савв:: всъесо1е () ( /*... */ ] // 4»З символов но14) 'лавлес(::рггпв() ( /*...*/ ) // Е+5 символов сотр1ех вс)гг(союр1ех); // 4 символа плюс 'сомр1ех' йоиЬ1е вс(гг(с(оло1е); // 4 символа плюс 'оооо1е' Чтобы представить данные имена всего шестъю символами верхнего регистра, пришлось бы применить какую-то форму сжатия, а это усложнило бы написание инструментальных средств. Конечно, можно воспользоватъся хэшированием, но тогда для разрешения конфликтов потребуется какая-нибудь рудиментарная «база ланных программы».
Таким образом, первый способ крайне неприятен, а второй может стать источником серьезных проблем, поскольку в стандартной модели компоновки программ на С и Гогггап никакая «база данных» не предусмотрена В связи со всем вышесказанным в 1982 г. я начал выступать в пользу доработки компоновшиков для поддержки длинных имен.
Не знаю, мои ли усилия тому причиной, но современные компоновшики разрешают гораздо более длинные имена. В С(гонг для реализации безопасного связывания применяются специальные алгоритмы кодирования типов. При этом 32 символа — это маловато, порой не хватает даже 256 (см. раздел 11.3.2). Временно — для архаичных компоновшиков — применялась система хэшнрования длинных идентификаторов, что было очень неудобно. З.ЗА. Версии Сй'опт Первые версии компиляторов С (е(гЬ С!аваев и С++ люди получали прямо от меня. Таким образом, возможность работать с С впгп С1аззез появилась у сотрудников десятков образовательных учреждений, таких как; Стэндфордский университет (декабрь 1981 г., первая поставка Срге), Калифорнийский университет в Беркли, университет штата Висконсин в Мэдисоне, Калифорнийский технологический институт, университет штата Северная Каролина в Чапел Хилл, Массачусетский технологический институт, Сиднейский университет, университет Карнеги-Мэллон, университет штата Иллинойс в Урбана-Шампейн, Копенгагенский З.З.З.
Проблемы компоновки Как уже говорилось выше, я решил обходиться традиционными компоновшиками со всеми их ограничениями. Однако одно ограничение оказалось совершенно нетерпимым и в то же время настолько глупым, что, будь у меня достаточно терпения, я поднял бы заинтересованных людей на боръбу с ним. Дело в том, что большинство тогдашних компоновшиков не позволяло исполъзовать длинные внешние имена. Обычно число символов ограничивалось восемью, а Ко К С гарантировал для внешних имен только шесть символов н один регистр.
/«)ч31/130 С также унаследовал это ограничение. Принимая во внимание, что нмя функции-члена включает имя класса и что при компоновке необходимо было каким-то образом отразить тип перегруженной функции (см. раздел 11.3.1), я понимал, что выбор у меня невелик, рассмотрим примеры: Компилятор Огоп1 ИИИИИИШ университет, Лаборатория Резерфорда (Оксфорд), 1КСАМ, 1ХК1А Поставки компилятора отдельным образовательным учреждениям продолжались и после того, как был спроектирован и реализован С++, Таким образом компилятор получили следуюшие университеты: Калифорнийский (Беркли — август 1984 г., первая поставка С(гопГ), штата Вашингтон (Сент-Луис), Техасский (Остин), Копеншгенский и Нового Южного Уэльса.
Было, конечно, множество неофициальных копий, поскольку студенты, как водится, не обрашали внимания на бюрократические формальности. Уже тогда распространение версий на индивидуальной основе стало для меня обузой, а для университетского народа, желающего иметь С++, — причиной для раздражения. Поэтому мы с Брайаном Керниганом, начальником моего отдела, и Дейвом Каллманом, отвечавшим в АТ«" Т за С++, решили организовать выпуск С(гонг несколько иначе.
Идея заключалась в том, чтобы избежать назначения цен, подписания контрактов, организации технической поддержки, рекламы, составления документации, отвечаюшей корпоративным стандартам и тд. Вместо этого С(гопс и некоторые библиотеки передавались университетам по цене носителей. Данную версию назвали Ке1еазе Е («Е» — сокращение от Ыисаг(опа!, образовательный).
В январе 1985 г. Лаборатория резерфорда и другие учреждения получили первые ленты. Версия Е заставила меня по-другому взглянуть на веши, Фактически это было полное фиаско. Я ожидал быстрого роста интереса к С++ в университетах. Однако кривая роста нисколько не изменила своего характера (см, раздел 7.1), зато вместо новых пользователей мы получили поток жалоб от профессоров на то, что С++ не распространялся на коммерческой основе. Сколько раз я слышал такие слова: «Да, я хочу работать с С++ и знаю, что могу получить С(гонг бесплатно, но, увы, меня это не устраивает, так как мне необходима некая база, на основе которой я могу давать консультации, а мои студенты — использовать в индустриальных проектахы Вот вам и академическое стремление к чистому знанию.