Confidential

Наша система?—?не традиционный компилятор, порождающий объектный код, а такназываемый компилятор переднего плана (front-end compiler), который в качестверезультата своей работы формирует образ исходной программы на некоторомпромежуточном языке. Далее этот образ обрабатывается отдельной компонентой?—?генератором кода (back-end). Это обычная схема, давно принятая в многоязыковыхсистемах программирования. Так как промежуточное представление выбираетсяединым для всех входных языков, то в системе достаточно единственногогенератора кода, что исключает затраты на реализацию генератора для каждогоотдельного компилятора. Кроме того, можно разработать несколько генераторовкода с единого внутреннего представления для различных аппаратных платформ,получив тем самым многоплатформную систему программирования. По этой схемеорганизована система gcc, похожим образом устроены и продукты семействаTopSpeed и десятки других.

Промежуточное представление, которое использовали бельгийцы в своихкомпиляторах (это, по существу, специальный язык, который можно назватьобобщенным ассемблером), было разработано довольно давно, выглядело несколькоархаично, но для него было сделано несколько работающих генераторов дляплатформ Intel, Motorola, Sparc и менее известных процессоров. Спарковскийгенератор они и передали нам для использования совместно с создаваемымкомпилятором, специально оговорив недопустимость его копирования. Надокументации по промежуточному языку красовались жирные штампы "Confidential".Это вызывало уважение и некоторый трепет. Перед нами как бы приоткрыли дверь всвятая святых компании?—?поделились своим ноу-хау.

Когда произошло все то, о чем было написано выше, и мы начали интенсивнопеределывать и дорабатывать компилятор, стремясь сделать его полностью "нашим",перед нами, словно чугунный рельс,-- ни обойти, ни сдвинуть?—?все время стоялоэто безальтернативное, как хлопок двери, слово,-- "Confidential". В самом деле,пусть мы переписали компилятор, пусть его исходный текст сильно изменился, ноон, тем не менее, порождает код, формат которого является чужойсобственностью,-- как мы можем считать такой компилятор своим? Придуматьсобственное промежуточное представление или адаптировать, например, внутреннийкод gcc?—?он, как и весь проект GNU, имеет статус freeware?—?конечно, можно, носколько времени это займет? А соответствующая переделка компилятора сравнима ссозданием нового.

Проблема встала особенно остро, когда нам предложили включить переработаннуюверсию компилятора в состав системного ПО для нового микропроцессора. Особеннопереживал мой коллега, не успевший набраться советского правового нигилизма.Однако именно он и нашел выход. Точнее, не выход, а разгадку, поскольку, какоказалось, проблемы в действительности не было.

Был краткий период моральной усталости от отладочной гонки, которая выгляделабесконечной (последние пять процентов ошибочных тестов поддавались сневероятным трудом и требовали все новых правок). Мы задумались о будущем иначали прикидывать, как могла бы выглядеть совсем новая версия компилятора. Мыначали интенсивно искать в Интернете все, что так или иначе касалоськомпиляции, генерации кода и языка Си++. Как ни странно, больше всегоинформации оказалось о методах генерации. И вот в один прекрасный день Сашанатолкнулся на работу Джонсона[3] ореализации одного из первых компиляторов Си?—?проекте Portable C, относящегосяк концу 70-х годов. Это была статья в каком-то древнем формате с подробнымописанием проектных решений и описывающая, в частности, подход к генерациикода. Мы не глядя распечатали ее и ахнули: в ней были расписаны основные кодыбельгийского внутреннего представления, который мы помнили наизусть! Два дняушло на лихорадочный поиск и запросы во все стороны, где можно найти исходникиPortable C. Нашлись, родимые, рядышком, у какого-то коллекционера в Финляндии!И что же? Похожие названия команд, те же кодировки и почти те же самыезаголовочные файлы, что и у бельгийцев!

Теперь мы поняли причины неуверенности в ответах на вопросы об особенностяхпромежуточного представления?—?это был не их формат. Многие детали так иостались тогда непроясненными. В начале работы нам приходилось познаватьпромежуточное представление, по существу, полностью самостоятельно, еслиугодно, используя "проекционный подход" В.Ш.Кауфмана: мы написали больше сотнитестов на Си, пропускали их через фирменный компилятор Си и изучали порождаемыйпромежуточный код, сравнивая "проекцию" с оригиналом?—?исходным текстом.

Не будем гадать о том, почему фирма взяла за основу своего промежуточногопредставления формат Джонсона. Для своего времени это было естественное и,наверное, правильное решение, и, конечно, их нельзя упрекнуть в некорректности?—?статья известна всем, она до сих пор входит в комплект документации по"Seventh Edition release of the UNIX operating system" компании Bell TelephoneLaboratories, а исходные тексты Portable C общедоступны.

Однако для нас ситуация изменилась радикально. Кто запрещает нам проделать, посуществу, то же самое? Теперь, совсем немного переработав генерирующую частькомпилятора (стоит ли говорить, что за неделю это было сделано), мы можем(можем?) честно и открыто, в противоположность бельгийцам, говорить, что нашкомпилятор порождает промежуточное представление, формат которого соответствуетформату, используемому в таком-то компиляторе (исходные тексты которогообщедоступны) и описанному в таком-то году в такой-то известной статьетакого-то известного автора. Это вполне соответствует общепринятой практике.Если у нас будет (а у нас будет) собственный генератор, по этому промежуточномупредставлению порождающий код для некоторой программно-аппаратной платформы, томы с полным основанием можем считать наш компилятор нашим.

Это сладкое слово?—?свобода!

Надо бы зарегистрировать его в РАПО…


Примечания:



3

C.S.Johnson. A Tour Through the Portable C Compiler. http://plan9.bell-labs.com/7thEdMan/vol2/porttour.bun.









 


Главная | В избранное | Наш E-MAIL | Прислать материал | Нашёл ошибку | Верх