Был краткий период моральной усталости от отладочной гонки, которая выгляделабесконечной (последние пять процентов ошибочных тестов поддавались сневероятным трудом и требовали все новых правок). Мы задумались о будущем иначали прикидывать, как могла бы выглядеть совсем новая версия компилятора. Мыначали интенсивно искать в Интернете все, что так или иначе касалоськомпиляции, генерации кода и языка Си++. Как ни странно, больше всегоинформации оказалось о методах генерации. И вот в один прекрасный день Сашанатолкнулся на работу Джонсона[3] ореализации одного из первых компиляторов Си — проекте Portable C, относящегосяк концу 70-х годов. Это была статья в каком-то древнем формате с подробнымописанием проектных решений и описывающая, в частности, подход к генерациикода. Мы не глядя распечатали ее и ахнули: в ней были расписаны основные кодыбельгийского внутреннего представления, который мы помнили наизусть! Два дняушло на лихорадочный поиск и запросы во все стороны, где можно найти исходникиPortable C. Нашлись, родимые, рядышком, у какого-то коллекционера в Финляндии!И что же? Похожие названия команд, те же кодировки и почти те же самыезаголовочные файлы, что и у бельгийцев!
Теперь мы поняли причины неуверенности в ответах на вопросы об особенностяхпромежуточного представления — это был не их формат. Многие детали так иостались тогда непроясненными. В начале работы нам приходилось познаватьпромежуточное представление, по существу, полностью самостоятельно, еслиугодно, используя "проекционный подход" В.Ш.Кауфмана: мы написали больше сотнитестов на Си, пропускали их через фирменный компилятор Си и изучали порождаемыйпромежуточный код, сравнивая "проекцию" с оригиналом — исходным текстом.
Не будем гадать о том, почему фирма взяла за основу своего промежуточногопредставления формат Джонсона. Для своего времени это было естественное и,наверное, правильное решение, и, конечно, их нельзя упрекнуть в некорректности — статья известна всем, она до сих пор входит в комплект документации по"Seventh Edition release of the UNIX operating system" компании Bell TelephoneLaboratories, а исходные тексты Portable C общедоступны.
Однако для нас ситуация изменилась радикально. Кто запрещает нам проделать, посуществу, то же самое? Теперь, совсем немного переработав генерирующую частькомпилятора (стоит ли говорить, что за неделю это было сделано), мы можем(можем?) честно и открыто, в противоположность бельгийцам, говорить, что нашкомпилятор порождает промежуточное представление, формат которого соответствуетформату, используемому в таком-то компиляторе (исходные тексты которогообщедоступны) и описанному в таком-то году в такой-то известной статьетакого-то известного автора. Это вполне соответствует общепринятой практике.Если у нас будет (а у нас будет) собственный генератор, по этому промежуточномупредставлению порождающий код для некоторой программно-аппаратной платформы, томы с полным основанием можем считать наш компилятор нашим.
Это сладкое слово — свобода!
Надо бы зарегистрировать его в РАПО…
Заключение. Полетит?
К настоящему времени (конец 1997 года) мы далеко ушли от версии, сданнойбельгийцам в конце прошлого года. Теперь компилятор соответствует последней,декабрьской версии Предварительного Стандарта и успешно проходит примерно 98%всех тестов. Заметно быстрее работает синтаксический разбор, почти полностьюреализованы шаблоны. Наконец, теперь он перенесен на платформу Intel (в видеконсольного приложения для Windows’95), а в конце года должен заработать нашсобственный генератор кода для Win32.
Мы подготовили эскизный проект совершенно новой версии компилятора, надеемся,свободного от проектных ошибок, которые уже невозможно выковырять из теперешнейверсии и в котором заложены очень заманчивые решения (и, конечно, новыеошибки!).
Наконец мы получили опыт, ценность которого безмерна. Такими малыми силамиполностью пройти проект почти предельной сложности (теперь мы можем утверждатьэто совершенно определенно), получить в итоге работающую программу с приличнымихарактеристиками — это было огромным уроком, некоторые фрагменты которого я ипостарался показать. Кстати, задержка реализации компилятора (значительная посравнению с первоначальными сроками, но вполне естественная, если принять врасчет его действительную трудоемкость) дала один положительный эффект: мысмогли на практике оценить и оперативно пересмотреть многие проектные решения,опробовать несколько вариантов и выбрать наилучший в конкретных условиях.
Знакомые ребята из одной московской фирмы, разрабатывающейпрограммно-аппаратные комплексы на основе микроконтроллеров, некоторое времяназад написали компилятор ANSI Си для одного семейства однокристальныхмикроконтроллеров. Их история оказалась несколько похожей на нашу, что можетговорить о типичности явления. Они делали компилятор по заказу известнойамериканской фирмы, в контракте с которой был пункт об оплате всей работы послепроведения тестирования. Сроки тестирования никак не оговаривались, а проводитьего должны были сами заказчики. Через год компилятор был полностью готов(вместе с библиотеками, отладчиком, макроассемблером, программным эмуляторомпроцессора и средой разработки!), однако, к этому времени ситуация изменилась:американцы, видимо, потеряли интерес к разработке и… просто не сталипроводить тестирование! Придраться было не к чему, буква контракта нарушена небыла. В результате фирма осталась без денег, правда, с компилятором, которыйтеперь стал, естественно, их собственностью.
Но… нет худа без добра. Теперь они распространяют его сами и продают до шестикомплектов в месяц. У нас, в России, продается компилятор, разработанный вРоссии же, и покупают его наши пользователи! Как хотите, а это здорово.
Однако их опыт не слишком подходит нам. Ниша, образуемая системным программнымобеспечением для микроконтроллеров, в гораздо меньшей степени насыщена такимиинструментами, как компиляторы языков высокого уровня. Поэтому у ребят остаютсянеплохие шансы выйти и на мировой рынок, который, конечно, существенно шире.Что же касается инструментов общего назначения, то здесь конкуренция оченьжесткая. Примеры превосходных систем программирования на Си++ для любыхплатформ известны всем. Что из того, что наш компилятор лучше соответствуетстандарту? Зато он не интегрирован с редактором, с отладчиком, у него нет"Менеджера Проектов" и других полезных штучек. Даже несмотря на наличиесобственного генератора кода он, по существу, остается полуфабрикатом,пригодным для включения в какую-нибудь интегрированную среду, в которой естьвсе, что надо, но по недосмотру не оказалось компилятора. Сами мы такую средуне напишем — мало сил, не та квалификация, и вряд ли у нас это получитсяпрофессионально (каждый должен заниматься своим делом). Кому нужен такойпродукт?
Правда, не все так уж плохо. Весь последний год мы работали по контракту снебольшой, но серьезной российской фирмой, создающей заказныепрограммно-аппаратные комплексы и спроектировавшей собственный (sic!)специализированный процессор (опытные экземпляры вот-вот появятся; еще одинпример того, что не все занимаются проталкиванием импортных решений!). Мыпринимали участие в разработке системного ПО для этого процессора иадаптировали для него свой компилятор. Что получится из этого проекта, пока неизвестно. Многое зависит от того, как код, сгенерированный нашим компилятором,заработает на реальном "камне", а не на эмуляторе, и от того, сможет ли фирмазаинтересовать этой разработкой потенциальных заказчиков. Однако факт остаетсяфактом: наш компилятор получил (пусть даже очень небольшое) признание, оказалсявостребован.
Однако принципиально ситуация не изменилась. Возможное использованиекомпилятора в одном проекте, к тому же еще не доведенном до конца, никак нельзяназвать успехом. Вопрос "летает — не летает?" по-прежнему остается без ответа ипо-прежнему мучает нас.
3
C.S.Johnson. A Tour Through the Portable C Compiler. http://plan9.bell-labs.com/7thEdMan/vol2/porttour.bun.