Основать небольшое выражение DSL на DLR или держать его в F #? - PullRequest
6 голосов
/ 10 октября 2009

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

Мой текущий подход заключается в написании небольшого «DSL-выражения» на F #, где я анализирую ввод с помощью FParsec, строю синтаксическое дерево на основе различаемого объединения и затем могу вычислить выражение. Это работает очень хорошо.

Однако, я думаю о том, чтобы вместо этого основать язык на DLR. Есть ли какие-либо плюсы, чтобы пойти по этому пути (проанализировать входные данные, сгенерировать AST, используя материал Scripting.AST вместо моего собственного, и позволить DLR обрабатывать выполнение расчета)?

Каждый расчет, вероятно, будет довольно маленьким. Зависимость между расчетами будет учтена на более высоком уровне.

Можно ли ожидать более высокой производительности, поскольку DLR сгенерирует CIL-код для выражения или это изменит издержки?

(что касается использования существующего языка, такого как IronPython, это, вероятно, будет сложно, так как я планирую добавить множество операторов слайсов и кубиков и средства обработки размерности в синтаксис языка)

1 Ответ

7 голосов
/ 10 октября 2009

Сложно ответить на вопрос в таких общих терминах, но вот некоторые из моих мыслей.

Использование F # для создания парсера звучит хорошо.

FSParsecотличная библиотекаЯ немного неравнодушен к FSLex и FSYacc.В любом случае, в F # есть библиотеки, специально разработанные для синтаксического анализа, которые экономят ваше время.

Генерация кода с помощью звуков DLR в порядке.

DLR - отличная платформадинамическая генерация кода.Тем не менее, ваше приложение гораздо более конкретным.Если вы ограничиваете себя только вычислением значений, вам следует использовать API-интерфейсы Expression Trees из .NET 3.5.Этот API предназначен для представления произвольных выражений кода.DLR, с другой стороны, разработан как среда выполнения или динамические языки.Я не говорю, что это невозможно, просто это не правильный инструмент для работы.

Не компилируйте сгенерированный вами код.

Если вы это сделаетеесли вы будете использовать DLR для представления вашего AST, стоимость компиляции и выполнения, вероятно, будет намного выше, чем просто интерпретация дерева.Скомпилируйте код, если: A.) вы выполняете одну и ту же функцию / метод много раз или B.) функция / метод очень сложная.

C # + DLR, IronPython, F #или какая-то комбинация из трех - все это выбор звука.В конечном счете, «правильный» выбор - это тот, который выполняет работу как можно быстрее.

...