— Будете платить? — Нет. — Ну ладно, тогда мы будем работать бесплатно.
Как отремонтировать подгнивший дом
Вскоре после того, как компилятор "задышал" и приобрел относительнуюстабильность, мы стали систематически проводить его профилирование. GNU'шнаяпрограмма gprof выдавала длинные таблицы временных затрат отдельных функций, поэтим таблицам мы рисовали огромные, на несколько листов, графы реальныхвзаимосвязей модулей, пытаясь найти резервы быстродействия. Первый же анализпоказал, что около 40% времени тратится на операции со строками и библиотечныефункции ввода-вывода. Сначала это показалось естественным — любая идентификацияименованного объекта в программе предполагает сравнение имен. Поиск имени втаблицах — одна из базовых операций в любом компиляторе, и даже используятехнику хеширования, избежать прямого литерального сравнения идентификаторовневозможно. Однако цифра показалась нам все же чрезмерно большой. Исправитьположение без разрушения компилятора было крайне сложно, так как всевозможныеоперации с именами буквально пронизывали все модули. Это не являлось проектнойошибкой — полностью локализовать работу с именами невозможно, так как самасемантика языка определяет необходимость оперировать с именами практически навсех стадиях компиляции.
Известно, что у деревянного бревенчатого дома обычно первыми подгнивают нижниевенцы, имеющие постоянный контакт с почвенными водами. Чтобы отремонтироватьподгнивший дом, вовсе не обязательно раскатывать его по бревнышку. Делают так:определяют самый нижний здоровый венец, подводят под него домкраты (под каждыйиз четырех углов) и немного приподнимают ими весь дом. После этого заменяютотслужившие бревна новыми и опускают на них верхнюю часть.
Точно по такой же схеме обошелся с компилятором мой коллега. Он "вынул" из негостарую схему хранения имен и заменил ее на усложненную, но более эффективную.Ключевой момент новой схемы состоял в обеспечении присутствия каждого имени всемантических таблицах в единственном экземпляре. Тогда вместо сравнениялитеральных изображений имен достаточно было сравнивать указатели на этипредставления. Алгоритмы модулей, использующих операции с именами, никак неизменились, однако в некоторых местах пришлось заменить тип IDENT,представляющий "старый" идентификатор в таблицах, заменить на xIDENT — прямойуказатель на единственную копию данного имени. Эту операцию можно было бысделать одной командой контекстной замены, но никакой редактор не смог быразобраться, где именно следовало ее производить, а где — оставитьпо-старому… В очередной раз мы "руками" перещупали весь компилятор. Послечетырех дней непрерывного труда компилятор разогнался на 25% (нагляднаястоимость литеральных сравнений строк в большой программе)!
Фрагмент модуля с усовершенствованной версией обработки имен с тех пор украшаеткомментарий:
/* Krotoff is a _very_ clever guy! */
Товарища не похвалишь, так и он тебя не похвалит.
Последнее прости
Последние месяцы мы работали, не получая от фирмы вообще ничего, кроме писем.Постепенно ситуация с отсрочками платежей начала проясняться. У фирмы возниклифинансовые затруднения. В подробности нас не посвящали, но они были, похоже,достаточно серьезными. Компания применила радикальный, но, видимо, стандартныйметод выживания в подобных условиях — разделение, при котором убыточныеподразделения выделяются в самостоятельные (дочерние) фирмы.
Однако для нас ничего не изменилось, и, несмотря на неопределенность, работу мыне бросали. По-прежнему примерно раз в две недели, а то и чаще мы отсылалитекущие версии компилятора и тестов (snapshot — "моментальный снимок" нашейработы), Вальтер делал собственный прогон компилятора, присылал свои вопросы изамечания. Последний этап работы прошел без особых событий, в тяжелой имонотонной работе.
В ноябре 1996 г. мы получили так называемый "Milestone Certificate" — официальное подтверждение о завершении и принятии очередного этапа работы ивместе с ним — всего проекта в целом. Все взаимные обязательства быливыполнены, фирма не имела к нам никаких претензий (еще бы имела!). Finita…
Компилятор готов, более чем 3-летний марафон успешно завершен! Однако этоэпохальное событие прошло для нас незамеченным. Мы просто не в силах былиостановиться — компилятор еще давал ошибки на семи процентах тестов, последниеверсии стандарта не были просмотрены, и вообще еще много чего нужно былододелать… Все как обычно.
В конце года ситуация, казалось, начала поворачиваться к лучшему. Фирма неумерла, наоборот, они решили создать филиал в другой стране, который занималсябы именно компиляторами, в том числе и нашим. Планировалось отдать компиляторна бета-тестирование в один европейский университет, готовый попробовать его вработе. Надо было готовиться к сопровождению этого процесса. Кроме того, нампредлагалось прямо с января начать новый проект — перепроектировать компилятор,чтобы он генерировал промежуточное представление нового формата, который фирмауже давно разрабатывала и даже продвигала как некоторый стандарт.
Все это выглядело очень перспективно и интересно. Мы были уверены в своих силахи собирались не повторить ни одной из прежних ошибок. Теперь мы могли вполнеобоснованно определить трудозатраты и, конечно, потребовали бы более адекватноевознаграждение. Мы ждали известий о филиале и документацию по новому формату.
Внезапно что-то застопорилось. Письма стали короче и неопределеннее, ответы нанаши вопросы — уклончивыми: мол, создание филиала непростая работа, документыпришлем после подписки о неразглашении. (А как давать подписку, когда незаключен контракт и неизвестно, что, собственно, придется делать и в какиесроки?) Постепенно переписка заглохла.
Тягостная пауза продолжалась несколько месяцев. Надо было что-то решать, но всоздавшихся условиях практически любое решение означало окончательный разрыв сфирмой. А мы… да, боялись этого: нам казалось, что как разработчикикомпиляторов мы больше никому не интересны.
Несмотря на уже неприличное молчание Вальтера и полную неопределенность сбудущим проектом, мощная инерция огромного программного текста, который,подобно тяжелому составу, даже после экстренного торможения проходящему юзом докилометра пути, тянула нас вперед. Все новые и новые доработки, исправления,93% успешных тестов, 95, 97… Компилятор, хотя и был официально сдан, всеулучшался и улучшался. В результате мы довольно существенно продвинули и тесты,которые в целом, как нам казалось, уже вполне можно было считать программнымпродуктом.
У нас возникло ощущение, что, может быть, следует переправить бельгийцам то,что мы сделали за время после формальной сдачи. Наша (конечно же, нескольконаивная) логика была такова: последняя принятая ими версия тестового пакетасодержит ошибки. Теперь мы их исправили. Если мы оставим исправления при себе,то, продавая пакет с ошибками, фирма подмочит свою репутацию, что косвенноударит и по нашему реноме. Мы несколько раз спорили друг с другом; наконец,решили не посылать сразу исправления, а сначала написать письмо с предложением:не хотите ли взять у нас новые версии компилятора и тестов? Тем самым, бытьможет, мы вынудим их раскрыть свои планы.
Ничего подобного не случилось. Ответ Вальтера был по-своему знаменателен. Оннаписал: "мы всегда готовы получить от вас новые версии".
Больше никаких контактов между нами не было. Все было кончено.