По рукам!
У кого-то из классиков есть забавная шутка (за точность цитаты не ручаюсь, носмысл передан верно): "Системные программисты не вполне понимают, за что имплатят большую зарплату: ведь они выполняли бы свою работу и бесплатно. Правда,у них хватает ума не говорить об этом своему начальству". Это очень точноенаблюдение — прямо про нас, только без "большой зарплаты".
Характер условий, предлагаемых бельгийцами, был, видимо, типичен для тогдашнихотношений с иностранными фирмами: они передавали нам несколько рабочих станцийSun 3/60 на процессоре Motorola 68020 (которые к тому времени уже моральноустарели и самой фирмой попросту списывались) и обещали платить… не скажусколько, но, поверьте, очень и очень небольшие деньги — даже по тогдашнимроссийским меркам.
Вообще-то, это не очень вязалось с обликом солидной фирмы, но осознание пришлогораздо позже. Да, еще: те станции, на которых мы должны были работать,передавались нам не просто так — они шли в счет оплаты за нашу работу! Мыоказались как бы должны им, еще не приступив к делу… Впоследствии то жепроизошло со SparcClassic. Когда на 3/60 стало совсем невозможно работать(примерно как если на XT пытаться редактировать графические изображения), намперевели деньги на покупку этой самой младшей модели семейства Sparc сминимальной комплектацией, внеся ее стоимость в оплату проекта.
Естественно, результат работы становился собственностью фирмы, а с нас взялиподписку о неразглашении, согласно которой в течение всего срока действияконтракта мы не имели права не только говорить об условиях работы и названиифирмы, но и вообще рассказывать о том, что мы делаем. Говорят, некоторыекомпании оговаривают и более суровые условия: скажем, после окончания действияконтракта разработчик в течение некоторого времени не имеет права работать наданалогичными проектами. Какое счастье, что бельгийцы до этого не додумались — мы бы подмахнули и такое…
Можно сколько угодно смеяться над нашей наивностью и недальновидностью, нокогда вот сейчас, наяву, предлагается в точности та работа, о которой (проститеза высокопарность) мечтал всю жизнь…
Кажется, мы и сейчас приняли бы подобные условия (шутка).
Глаза боятся, а руки делают
Не знаю, решились бы мы на этот проект, если бы сразу представляли (так, какзнаем сейчас) его истинную трудоемкость. Тогда язык Си++, судя по учебнымпособиям, казался нам… да, непростым для компиляции, с корявым инеоднозначным синтаксисом, сильно усложненной семантикой традиционныхконструкций, но вполне сравнимым, например, с объектной версией Паскаля фирмыBorland. Так что срок, названный шефом, поначалу не вызвал у нас протеста.Однако чтение первой же действительно серьезной и подробной книги — переводаавторского определения языка[1], предложенного в качественачальной версии для его стандартизации, повергло нас в ужас и панику.Казалось, это безумие невозможно реализовать вообще! Тогда мы поняли настоящуюцену учебникам типа "Язык XXX за двадцать один день" или "YYY — это просто!".Подобные тексты (сами по себе, быть может, и неплохо написанные) оставляют засвоими рамками настолько обширные области языка, избегают касаться стольких еготонкостей и особенностей, что в голове у читателя-программиста формируетсязачастую усеченный и выхолощенный образ инструмента, который он собираетсяиспользовать.
Вообще, у автора вызывает некоторую настороженность, когда о сложных вещахпытаются говорить упрощенно (это касается не только программирования). Задачи,решаемые современными программными системами, очень и очень сложны. Для ихсоздания приходится использовать адекватные инструменты, которые не могут несоответствовать сложности и ответственности задач и потому объективно не могутбыть простыми. Поэтому писать о Си++ в стиле "Откройте файл myprog1.cpp скомпакт-диска, прилагаемого к книге, и нажмите Ctrl-F9. Поздравляем! Вывыполнили вашу первую программу на Си++!" — недопустимая профанация предмета.
С тех пор мы считаем, что настоящее пособие по сложному современному языкупрограммирования общего назначения (уровня Си++ или Ada95) должно иметь форму,близкую упоминавшейся выше книге Эллис и Страуструпа,-- комментированныйстандарт. Только такая книга может дать читателю настоящее понимание языка. Да,читать и пытаться понять строгий, сложно построенный, местами даже занудныйтекст будет весьма непросто — но кто сказал, что профессия программиста проста?Мы обязательно сделаем такую книгу по Си++, когда его Стандарт, наконец, будетпринят.
Стандарт принят в 1998 году — уже почти три года назад,а обещанных комментариев до сих пор нет… Собственно текст Стандарта япрактически полностью перевел, надо бы засесть и за комментарии. Однако одномумне не справиться… Саша Кротов, где ты!?..
Мы подошли к делу серьезно. Три или четыре месяца мы практически непрограммировали. Мы изучали Эллис и Страуструпа ("Зеленую книгу") вдоль ипоперек и во всех мыслимых направлениях, продумывали общую конфигурациюкомпилятора, выбирали построение основных структур данных и важнейшихалгоритмов, предлагали и обсуждали проектные и технические решения и писалипроект.
Прекрасно помню чувство гордости, которое мы испытали, увидев наглядноесвидетельство наших трудов — увесистый том, привезенный Вальтером, красивоотформатированный, распечатанный на лазерном принтере (у нас их тогда и впомине не было) и даже, кажется, переплетенный. Сейчас, когда прошло уже околотрех лет, очень многие наши проектные решения кажутся прямолинейными, наивнымии даже неверными; некоторые пришлось менять уже в процессе реализации, но, темне менее, проект дал необходимую основу для работы.
Этот текст, кажется, произвел достаточное впечатление на бельгийцев; они вполнеубедились в уровне нашей квалификации. Тогда показалось удивительным, нонекоторых простых вещей они просто не знали: например, чтоtypedef-объявление не вводит новый тип, конструкции extern "С" могутбыть вложенными и т.д. Не говоря уже о более специфических аспектах. Когда мыописывали в проекте технику компиляции вызовов, мы употребили термин "thunk"(короткий код для вычисления фактического параметра). Оказывается, они,сделавшие несколько коммерческих компиляторов, не знали, что это такое! Судовольствием и тайным злорадством я выписал из классической книгиГриса[2] и послал им большуюцитату, объясняющую этот термин…
Первые радости
Начнем с синтаксиса (самого, казалось бы, простого аспекта, однако борьбой сним завершаются попытки очень многих). Несколько первых впечатлений. Во-первых,язык просто очень большой. Это означает, что синтаксические таблицы — составленные вручную или построенные каким-нибудь генератором распознавателей,вроде YACC, будут довольно велики, что, естественно, замедлит скоростьсинтаксического разбора.
Однако при внимательном анализе оказывается, что в языке имеется сравнительнобольшое число «микро»-регулярностей — часто повторяющихся устойчивыхпоследовательностей лексем. Например, пары пустых скобки: (), [],пустой список параметров (void), завершитель списка параметров ...)встречаются очень часто. После служебных слов if, switch, whileвсегда должна стоять левая круглая скобка, после break и continue — точка с запятой, а после слова goto располагаются идентификатор и точка сзапятой. Таких регулярностей набирается несколько десятков, так что еслирассматривать их как отдельные лексемы, объем синтаксиса заметно сокращается.Введение каждой такой "суперлексемы" экономит по крайней мере одно обращениесинтаксического анализатора к таблице разбора. Усложнение распознавателя лексем(сканера), вынужденного составлять суперлексемы из пар или троек обычныхлексем, при этом получается весьма незначительное; более того, если сканер вовремя одного вызова распознает, например, не только служебное слово switch,но и левую круглую скобку, идущую за ним, получится экономия и на числеобращений к сканеру!