2012-03-23 3 views
3

Я реализую небольшую DSL поверх .NET (4.0), и в настоящее время я использую деревья выражений, чтобы превратить DSL в куски исполняемого кода.Реализация DSL на .NET

DSL предопределен, поскольку мы реализуем поддержку устаревшего формата файла.

Are Expression Trees - наиболее подходящий инструмент для этой работы?

ответ

5

Выражение Деревья бесполезны, если вы хотите генерировать новые типы. И для большинства типичных DSL вам нужно создавать типы. Таким образом, хороший старый System.Reflection.Emit, вероятно, будет лучшим выбором.

+0

Спасибо за ваш ответ, @ SK-logic. Не могли бы вы немного расшириться, пожалуйста. Почему деревья выражений «бесполезны, если вы не хотите генерировать новые типы», и как «Reflection.Emit» будет мне лучше? –

+0

@GregB, я имел в виду противоположное - деревья выражений не могут использоваться для генерации новых типов. Вы можете компилировать их только в делегаты. Представьте себе, скажем, DSL для какой-то ORM, которая будет сопоставлять базу данных с иерархией объектов. Он должен выделять типы для этих объектов, и вы можете делать это только с помощью Reflection.Emit. –

1

Возможно, вы можете взглянуть на Boo и более конкретно на Rhino.DSL, который построен на нем. Чтобы получить представление о том, что Boo приносит на стол, Ayende's posts - отличный стартер.

Boo описывается его inceptors как:

нового объектно-ориентированного статически типизированного языка программирования для Common Language Infrastructure с питона вдохновил синтаксис и особым акцентом на языке и расширяемости компилятора.

В принципе, это альтернатива C#: также скомпилирована, но гораздо более гибкая, чтобы вы могли динамически настраивать новые языковые конструкции. Деревья выражений являются лишь частью того, что задействовано.

Путем размещения Boo где-то в вашем конвейере, как это делает Rhino.DSL, вы развязываете много универсальности, которая даже не нужна раздутая или высокопроизводительная свинга (она по-прежнему компилируется байт-кодом, который запускается).

Если вы посмотрите на the unit tests on Rhino.DSL, вы получите быстрое представление о том, что возможно.

Одно замечание: все упомянутые хранилища в настоящий момент неактивны (в течение последнего года активности не было), но ИМХО, которые не девальвируют их практическое использование.

Надеюсь, это может вам помочь.

Смежные вопросы