Расширение компилятора Mono С#: есть ли какая-либо документация или прецедент?

В настоящее время я участвую в некоторых интересных исследованиях в области программирования, которые до сих пор были сосредоточены вокруг расширения предстоящего компилятора Java 7.0 с помощью некоторых очень мощных функций, основанных на программировании. Работа должна быть в равной степени применима к соответствующим языкам программирования, таким как С#.

В настоящее время я просматриваю параметры прототипирования порта С# для функциональности. Я бы предпочел варианты с открытым исходным кодом, чтобы плоды этой работы можно было разделить с самой широкой аудиторией. Таким образом, компилятор Mono С# кажется наиболее очевидной отправной точкой. Я опытный разработчик С#, поэтому писать код не проблема. Я в основном обеспокоен расширением компилятора поддерживаемым и поддерживаемым образом. В разделе "Часто задаваемые вопросы по Mono" (ссылка) указано, что "Mono уже используется в качестве основы для тестирования новых идей для С# языка (есть три или четыре компилятора, полученные из компилятора Mono С#)". К сожалению, нет никаких дополнительных указателей, кроме этого, и до сих пор поисковые запросы Google ничего не изменили.

Мне интересно, есть ли у кого-нибудь информация об этом. У mcs/gmcs/dmcs есть стандартная модель расширяемости? В частности, я буду выполнять некоторые интересные преобразования в абстрактном синтаксическом дереве программы. Существует ли стандартный механизм для вставки функциональности в цепочку компилятора между генерацией абстрактного синтаксического дерева и проверкой типа, а затем генерации кода?

До сих пор я писал некоторые специальные расширения для кода (прежде всего в генераторе кода), но это не похоже на поддерживаемое решение, особенно учитывая, что я намерен обновлять свои расширения с помощью Git ствол Mono как можно больше. Кроме того, было бы неплохо иметь возможность обновлять мои расширения без необходимости перекомпилировать весь компилятор каждый раз, когда я вношу изменения. Я хотел бы, чтобы все мои манипуляции с АСТ превращались в одну сборку .NET, которая могла бы динамически загружаться с помощью mcs/gmcs/dmcs без необходимости напрямую обрабатывать основной код компилятора.

Любые мысли или указатели на расширение компилятора Mono С# будут с благодарностью получены!

ОБНОВЛЕНИЯ (23 октября 2010 г.)

В ответ на мои вопросы я решил, что начну работать над ветвью Mono, чтобы создать простую модель расширяемости для компилятора. Это на самом раннем этапе, но здесь он находится в GitHub:

http://github.com/rcook/mono-extensibility

И основная фиксация: http://github.com/rcook/mono-extensibility/commit/a0456c852e48f6822e6bdad7b4d12a357ade0d01

Если кто-нибудь заинтересован в сотрудничестве в этом проекте, сообщите мне об этом!

Ответы

Ответ 1

К сожалению, я не могу адекватно ответить на ваш вопрос, но если вы посмотрите на примеры расширений С# в блоге Miguel de Icaza, вы заметите, что все они принимают форму патчей для компилятора, а не плагинов или расширений. Это, по-видимому, указывает на отсутствие такого API.

Обратите внимание, что все эти примеры имеют гораздо меньший объем, чем вы, кажется, работаете:

Это в основном локализованный синтаксический сахар, без "интересного" поведения. Четвертый патч, например, реализует синтаксический сахар Cω для IEnumerable s, но без какой-либо семантики Cω, которые делают этот синтаксис интересным. Если вы посмотрите на патч, вы увидите, что он буквально делает глупое синтаксическое расширение ~TIEnumerable<T>, в отличие от Cω, где доступ элемента и вызов метода должным образом сняты поверх потоков.

Microsoft Research Phoenix Compiler Pipeline когда-то явно рекламировался как решение таких проблем с расширяемостью, но, похоже, сейчас он фокусируется главным образом на оптимизации и анализ на уровне IR в генерации генерации кода. На самом деле, я даже не уверен, что проект еще жив.

Ответ 2

Компилятор mono С# немного взломан. Я провел около недели, выясняя, как использовать информацию из дерева разбора. Компилятор не создает промежуточного представления, и генерация кода может ломать части дерева синтаксического анализа. Тем не менее, парсер и токенизатор могут оказаться полезными для вас, и вы просто возьмете его оттуда. SharpDevelop также предоставляет С# parser. Парсер SharpDevelop проще в использовании, чем синтаксический анализатор моно С#. Если F # также работает для вас, я бы рекомендовал. Источник намного чище, чем моно и доступен под лицензией с открытым исходным кодом.