6

我正在构建一个类似电子表格的应用程序,其中许多小计算需要以树状结构拼接在一起。这些计算是用户定义的,我需要一种方法让用户在运行时输入它们。

我目前的方法是在 F# 中编写一个小的“表达式 DSL”,在其中我使用 FParsec 解析输入,基于可区分联合构建语法树,然后可以评估表达式。这工作得很好。

但是,我正在考虑以 DLR 为基础的语言。沿着这条路走下去有什么好处吗(解析输入,使用 Scripting.AST 而不是我自己的东西生成 AST,让 DLR 处理计算的执行)?

每个计算可能会非常小。计算之间的依赖关系将在更高级别上得到处理。

由于 DLR 将为表达式生成 CIL 代码,我是否可以期待更好的性能,或者开销会吃掉它吗?

(至于使用像 IronPython 这样的现有语言,这可能会很困难,因为我打算在语言语法中添加很多切片和切块运算符和维度处理的东西)

4

1 回答 1

7

很难用如此广泛的术语回答一个问题,但这里有一些我的想法。

使用 F# 构建解析器听起来不错。

FSParsec 是一个很棒的库。我有点偏向 FSLex 和 FSYacc。无论哪种方式,在 F# 中都有专为解析而设计的库,可以节省您的时间。

使用 DLR 生成代码听起来不错。

DLR 是动态代码生成的绝佳平台。但是,您的应用程序要具体得多。如果您将自己限制为仅计算值,则应使用 .NET 3.5 中的表达式树 API。此 API 旨在表示任意代码表达式。另一方面,DLR 被设计为运行时或动态语言。我并不是说这是不可能的,只是它不是适合这项工作的工具。

不要编译生成的代码。

如果您确实使用 DLR 来表示您的 AST,那么编译和执行的成本可能远高于简单地解释树。如果出现以下情况,请编译代码:A.)您多次执行相同的函数/方法或 B.)函数/方法非常复杂。

C# + DLR、IronPython、F# 或三者的某种组合都是不错的选择。最终,“正确”的选择是在尽可能快的时间内完成工作的选择。

于 2009-10-10T17:13:57.073 回答