2009-10-10 8 views
6

Я строю приложение для работы с электронными таблицами, в котором множество древовидных вычислений нужно сшивать вместе в древовидной структуре. Эти расчеты определены пользователем, и мне нужно, чтобы пользователь вводил их во время выполнения.Настройте небольшое выражение DSL на DLR или сохраните его вручную в F #?

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

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

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

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

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

ответ

7

Это трудно ответить на вопрос в таких широких выражениях, но вот некоторые из моих мыслей.

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

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

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

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

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

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

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

+1

Благодарим вас за понимание. Я полностью игнорировал деревья выражения linq. Я попытаюсь изменить свой синтаксический анализатор для генерации деревьев с помощью этого API и выполнить некоторые тесты производительности для их оценки, чтобы сравнить с наивной интерпретацией/оценкой, которую я сейчас делаю в F #. – Rickard

+1

Обратите внимание, что вы можете использовать F # Quotations, а в библиотеке FSharp.PowerPack.Linq вы можете преобразовать выражение F # Quotation в дерево выражений LINQ.Однако в этом нет никакой документации, но вам может быть интересно. –