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