gpt4 book ai didi

f# - 是在 DLR 上创建一个小型表达式 DSL 还是在 F# 中手动编写?

转载 作者:行者123 更新时间:2023-12-04 14:52:58 25 4
gpt4 key购买 nike

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

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

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

每次计算可能都非常小。计算之间的相关性将在更高级别上得到处理。

我能否期待更好的性能,因为 DLR 会为表达式生成 CIL 代码,还是开销会消耗掉它?

(至于使用像 IronPython 这样的现有语言,可能会很困难,因为我计划在语言语法中添加大量切片操作符和维度处理内容)

最佳答案

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

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

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

使用 DLR 生成代码听起来没问题。

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

不要编译生成的代码。

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

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

关于f# - 是在 DLR 上创建一个小型表达式 DSL 还是在 F# 中手动编写?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1548172/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com