Расширение компилятора 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ω, которые делают этот синтаксис интересным. Если вы посмотрите на патч, вы увидите, что он буквально делает глупое синтаксическое расширение ~T
→ IEnumerable<T>
, в отличие от Cω, где доступ элемента и вызов метода должным образом сняты поверх потоков.
Microsoft Research Phoenix Compiler Pipeline когда-то явно рекламировался как решение таких проблем с расширяемостью, но, похоже, сейчас он фокусируется главным образом на оптимизации и анализ на уровне IR в генерации генерации кода. На самом деле, я даже не уверен, что проект еще жив.
Ответ 2
Компилятор mono С# немного взломан. Я провел около недели, выясняя, как использовать информацию из дерева разбора. Компилятор не создает промежуточного представления, и генерация кода может ломать части дерева синтаксического анализа.
Тем не менее, парсер и токенизатор могут оказаться полезными для вас, и вы просто возьмете его оттуда.
SharpDevelop также предоставляет С# parser.
Парсер SharpDevelop проще в использовании, чем синтаксический анализатор моно С#.
Если F # также работает для вас, я бы рекомендовал. Источник намного чище, чем моно и доступен под лицензией с открытым исходным кодом.