2009-11-20 1 views
5

Я рассматриваю возможность включения языка сценариев в один из моих программных проектов и определил два варианта: компиляция C# во время выполнения через CodeDOM и встраивание языка сценариев на основе DLR. Оба варианта предоставили мне полный доступ к .NET Framework.Причины использования языка на основе DLR, а не C# для задач сценариев?

Операция, с которой я буду писать сценарии, будет определяемой пользователем трансформацией DataRow и набора метаданных, приводящих к модифицированному DataRow. Я ожидаю, что эти преобразования будут сложными и часто вызываться. Конечно, я ожидаю, что трансформаторы будут предоставлены и модифицированы конечным пользователем.

С учетом этой рабочей нагрузки существуют ли какие-либо очевидные преимущества для использования одного подхода над другим?

ответ

3

Для пользователей, как правило, лучше использовать языки с более прощающим синтаксисом по понятным причинам. Поэтому я бы рекомендовал использовать язык на основе DLR. Если у вас есть время и ресурсы, специализированный DSL - лучший выбор, потому что вы можете предложить небольшой и простой в освоении синтаксис, и проще заставить пользователя делать то, что им не нужно делать (например, доступ к файловой системе , например ...)

Я не могу говорить по опыту, но, из того, что я видел, DLR может быть довольно быстрым (IronPython лучше, чем собственный Python!). Но динамическая отправка всегда влечет за собой небольшие накладные расходы. На захватной руке кросс-AppDomain звонки довольно дорого. В то время как динамическая стоимость отправки оплачивается везде внутри скрипта, стоимость Cross-AppDomain оплачивается только один раз за вызов скрипта. Какой из них лучше, зависит от того, насколько ваши скрипты будут делать.

Внедрение DLR Scripting Host является not difficult at all. Трудно свернуть собственный DSL, если вы решите пойти именно так.

Вы также можете изучить boo. Это статический язык CLI, который выглядит как Python, благодаря типу вывода. Его компилятор очень расширяем, и у меня был некоторый успех, написав несколько небольших DSL. Вы также можете заглянуть в книгу Одена Writing DSLs with boo.

+0

Есть ли у вас какие-либо соображения относительно относительной производительности двух подходов? Или о проблемах управления AppDomain, которые возникают с опцией C#? Или о сложности внедрения сервера сценариев DLR? (Хорошо, однако, я сделал это). – Dave

+0

«Но это никогда не будет быстрее ...» Вы говорите, что штраф за вызовы метода cross-AppDomain будет меньше, чем динамический диспетчер DLR? У вас есть источники для этого? (В реализации C# мне нужно будет иметь возможность разгружать скомпилированные сборки, следовательно, изолировать AppDomain.) – Dave

+1

@Dave: О, есть эта проблема ... Это наказание выплачивается, когда вы пересекаете AppDomain. Небольшая динамическая стоимость отправки, вы платите ее везде внутри скрипта. Я не уверен, как они будут сбалансированы в вашем случае использования. –