Основывайте небольшое выражение DSL на DLR или держите его вручную в F#?
Я создаю приложение, подобное электронной таблице, где много небольших вычислений должно быть сшито вместе в древовидной структуре. Эти вычисления определяются пользователем, и мне нужен способ для пользователя ввести их во время выполнения.
мой текущий подход заключается в написании небольшого "выражения DSL" в F#, где я анализирую входные данные с помощью FParsec, строю синтаксическое дерево на основе дискриминируемого объединения, а затем могу оценить выражение. Это работает довольно хорошо.
, Я думая о том, чтобы заглянуть в язык на основе DLR вместо этого. Есть ли какие-либо недостатки, чтобы пойти по этому пути (разбирать вход, генерировать AST с помощью сценариев.АСТ материал вместо моего собственного, и пусть DLR обрабатывает выполнение расчета)?каждый расчет, вероятно, будет довольно небольшой. Зависимость между расчетами будет учитываться на более высоком уровне.
могу ли я ожидать лучшей производительности, так как DLR будет генерировать код CIL для выражение или накладные едят?
(Что касается использования существующего языка, такого как IronPython, это, вероятно, будет сложно, так как я планирую добавить много операторов среза и кости и обработки размерности в синтаксис языка)
1 ответов
трудно ответить на вопрос в таком широком смысле, но вот некоторые из моих мыслей.
использование F# для создания парсера звучит хорошо.
FSParsec-отличная библиотека. Я отчасти неравнодушен к FSLex и FSYacc. В любом случае, в F# есть библиотеки, специально предназначенные для синтаксического анализа, которые экономят ваше время.
генерация кода с DLR звучит нормально.
DLR-отличная платформа для динамического кода поколение. Однако ваше приложение гораздо более конкретное. Если вы ограничиваетесь только вычислением значений, вы должны использовать API деревьев выражений из .NET 3.5. Этот API предназначен для представления произвольных выражений кода. DLR, с другой стороны, разработан как среда выполнения или динамические языки. Я не говорю, что это невозможно, просто это не правильный инструмент для работы.
не компилировать сгенерированный код.
Если вы идете с DLR для представления вашего AST стоимость компиляции и выполнения, вероятно, будет намного больше, чем просто интерпретация дерева. Делать компиляции кода, Если: а) вы выполняете одну и ту же функцию / метод много раз или Б) функция / метод очень сложные.
C# + DLR, IronPython, F# или некоторая комбинация из трех-все это звуковые варианты. В конечном счете "правильный" выбор-это тот, который делает работу как можно быстрее.