Любимое дитя
На душе было тяжело. Компилятор сдан, но его дальнейшая судьба абсолютнонеизвестна. Если бельгийцы намереваются пустить его в дело, то первое, что онидолжны сделать, как и обещали,-- отдать на бета-тестирование. Полное молчание.Мы нисколько не боялись стороннего тестирования (уж сколько мы сами трепали егона всевозможных тестах!), наоборот, были бы несказанно рады, что у компиляторапоявляются какие-то перспективы. Но тогда, как бы ни был компилятор хорош, упользователей обязательно должны были появляться проблемы, вопросы о непонятныхошибках и т.д… Никаких известий.
Словно послали учиться за границу единственного ребенка, а от него ни ответа нипривета.
Может быть, мы им так надоели, что они решили дальше работать с компиляторомсами? Сомнительно. Несмотря на то что Вальтер в свое время продемонстрировалнам высокий уровень анализа нашего программного текста (даже ошибки у наснаходил!), вряд ли, учитывая их непростое положение, они сейчас способны самивести проект. Нет у них своих специалистов по Си++, а сформировать дляподдержки бета-тестирования новую команду они просто не в состоянии. В любомслучае, если бы они приняли определенное решение, рано или поздно они должныбыли объявить об этом публично. Однако их Web-страница наводила уныние, неменяясь уже больше года. Все это время на ней красовалось сообщение: "В концегода (какого? — авт.) у нас будет компилятор Си++"… Она и сейчас,когда прошло еще несколько месяцев, не изменилась ни в одном символе.
Единственное, что можно было еще предположить, — они продали исходный тексткакой-нибудь третьей фирме. Тогда, конечно, мы уже никогда не узнаем, по чьимрукам пошел наш компилятор… Но и в это не очень верилось. Скорее всего,сейчас им просто не до компилятора.
Как бы вы поступили в подобном случае?
Долгое время мы просто переживали и… продолжали работать над компилятором.Как обычно, именно после официальной сдачи проекта обнаруживаются иисправляются ошибки из серии "непонятно, как раньше программа вообще работала",возникают новые плодотворные идеи и в течение нескольких дней воплощаются впрограммный текст. Появилась еще одна редакция предварительного стандарта, и теизменения, которые мы в ней увидели, были немедленно отражены в компиляторе. Ив один прекрасный момент мы вдруг осознали, что:
* теперь компилятор соответствует самой последней редакции предварительногостандарта, а не версии годичной давности, как было зафиксировано в контракте;
* мы исправили несколько ошибок, выявленных уже после сдачи, и некоторые из этихошибок были довольно серьезны;
* некоторые базовые алгоритмы были заметно улучшены в плане эффективности;компилятор заработал быстрее.
Таким образом, мы уже существенно ушли от той версии, которую сдали бельгийцам,и почувствовали, что находимся на правильном пути. Последним толчком для наспослужило предложение от одной московской фирмы включить компилятор взадумываемую ими систему программирования.
Но ведь мы не можем распространять от себя то, что формально нам непринадлежит! Следовательно, нужно сделать компилятор нашим. Из того, чторассказано выше, можно понять, что у нас давно чесались руки многое переделать.Теперь для этого возникли все условия. Часть пути уже пройдена, следуетопределить последующие шаги в этом направлении. Несколько дней мы провели вподробных обсуждениях. Мы не специалисты в юридических аспектах, относящихся кпроблемам собственности, но нам было понятно, что изменения в компиляторедолжны, с одной стороны, затрагивать если не все, то большинство его основныхалгоритмов, и с другой — "внешний вид" программного текста также должен бытьсильно модифицирован. Функциональность программы, естественно, останется (всекомпиляторы, по большому счету, делают одно и то же), но ее внутренности должныв значительной степени измениться. Это должен был быть новый компилятор.
Читатель простит некоторую сдержанность при описании этих аспектов работы.Скажу только, что в новой версии мы умудрились изменить даже стильпрограммирования, не говоря уже о более простых вещах. Что же касаетсяпереработки алгоритмов, то, помимо уже описанных выше изменений, мыоптимизировали формальное описание синтаксиса входного языка, сделав разборвыражений примерно на 20-25% быстрее, доработали механизм шаблонов, включив внего массу нововведений, появившихся за последнее время, реализовали новуюсхему работы с именами (см. главку "Как отремонтировать подгнивший дом") иусовершенствовали как компиляцию исключений, так и алгоритмы временивыполнения, связанные с обработкой исключительных ситуаций. Сделано еще многозаметных изменений, и эта работа продолжается.
Мы перенесли компилятор на персоналки и заставили его работать в средеWindows’95 (правда, без формирования объектного кода — генератора для платформыIntel у нас пока нет).
Наконец, мы решили проблему с форматом промежуточного представления, котороепорождает компилятор. Это очень интересная история. Читайте дальше.
Confidential
Наша система — не традиционный компилятор, порождающий объектный код, а такназываемый компилятор переднего плана (front-end compiler), который в качестверезультата своей работы формирует образ исходной программы на некоторомпромежуточном языке. Далее этот образ обрабатывается отдельной компонентой — генератором кода (back-end). Это обычная схема, давно принятая в многоязыковыхсистемах программирования. Так как промежуточное представление выбираетсяединым для всех входных языков, то в системе достаточно единственногогенератора кода, что исключает затраты на реализацию генератора для каждогоотдельного компилятора. Кроме того, можно разработать несколько генераторовкода с единого внутреннего представления для различных аппаратных платформ,получив тем самым многоплатформную систему программирования. По этой схемеорганизована система gcc, похожим образом устроены и продукты семействаTopSpeed и десятки других.
Промежуточное представление, которое использовали бельгийцы в своихкомпиляторах (это, по существу, специальный язык, который можно назватьобобщенным ассемблером), было разработано довольно давно, выглядело несколькоархаично, но для него было сделано несколько работающих генераторов дляплатформ Intel, Motorola, Sparc и менее известных процессоров. Спарковскийгенератор они и передали нам для использования совместно с создаваемымкомпилятором, специально оговорив недопустимость его копирования. Надокументации по промежуточному языку красовались жирные штампы "Confidential".Это вызывало уважение и некоторый трепет. Перед нами как бы приоткрыли дверь всвятая святых компании — поделились своим ноу-хау.
Когда произошло все то, о чем было написано выше, и мы начали интенсивнопеределывать и дорабатывать компилятор, стремясь сделать его полностью "нашим",перед нами, словно чугунный рельс,-- ни обойти, ни сдвинуть — все время стоялоэто безальтернативное, как хлопок двери, слово,-- "Confidential". В самом деле,пусть мы переписали компилятор, пусть его исходный текст сильно изменился, ноон, тем не менее, порождает код, формат которого является чужойсобственностью,-- как мы можем считать такой компилятор своим? Придуматьсобственное промежуточное представление или адаптировать, например, внутреннийкод gcc — он, как и весь проект GNU, имеет статус freeware — конечно, можно, носколько времени это займет? А соответствующая переделка компилятора сравнима ссозданием нового.
Проблема встала особенно остро, когда нам предложили включить переработаннуюверсию компилятора в состав системного ПО для нового микропроцессора. Особеннопереживал мой коллега, не успевший набраться советского правового нигилизма.Однако именно он и нашел выход. Точнее, не выход, а разгадку, поскольку, какоказалось, проблемы в действительности не было.