【问题标题】:Reasons for using a DLR-based language rather than C# for scripting tasks?使用基于 DLR 的语言而不是 C# 来执行脚本任务的原因是什么?
【发布时间】:2010-12-18 20:56:50
【问题描述】:

我正在考虑将脚本语言嵌入到我的一个软件项目中,并确定了两种选择:通过 CodeDOM 在运行时编译 C# 和嵌入基于 DLR 的脚本语言。这两个选项都可以让我完全访问 .NET Framework。

我要编写脚本的操作将是用户定义的 DataRow 转换和一组元数据,从而产生修改后的 DataRow。我希望这些转换将是可组合的并且经常被调用。当然,我希望最终用户能够提供和修改转换。

考虑到这种工作负载,使用一种方法比另一种方法有什么明显的优势吗?

【问题讨论】:

    标签: c# scripting ironpython dynamic-language-runtime


    【解决方案1】:

    对于用户而言,出于显而易见的原因,通常最好使用语法更宽松的语言。所以我建议使用基于 DLR 的语言。如果你有时间和资源,专门的 DSL 是最好的选择,因为你可以提供一种小而易学的语法,并且更容易让用户避免做他们不应该做的事情(比如访问文件系统) ,例如...)

    我不能凭经验说话,但就我所见,DLR 可以相当快(IronPython 比原生 Python 做得更好!)。但是动态调度总是需要一点点开销。令人抓狂的是,跨 AppDomain 调用非常昂贵。虽然动态调度成本在脚本内随处支付,但跨 AppDomain 成本仅在每次脚本调用时支付一次。哪个更好取决于你的脚本能做多少。

    嵌入 DLR 脚本主机是 not difficult at all。如果您选择这样做,困难的是推出自己的 DSL。

    您也可以查看boo。由于类型推断,它是一种看起来像 Python 的静态 CLI 语言。它的编译器是高度可扩展的,我在上面写了一些小的 DSL 也取得了一些成功。你也可以看看奥伦的书Writing DSLs with boo

    【讨论】:

    • 您对这两种方法的相对性能有什么想法吗?或者关于 C# 选项出现的 AppDomain 管理问题?或者关于嵌入 DLR 脚本主机的难度? (好点,我确实赞成)。
    • “但它永远不会更快......”你是说跨AppDomain方法调用的惩罚会小于DLR动态调度机制吗?你有这方面的资料吗? (在 C# 实现中,我需要能够卸载已编译的程序集,因此需要 AppDomain 隔离。)
    • @Dave:哦,有那个问题...当您跨过 AppDomain 时会支付罚款。轻微的动态调度成本,你在脚本中到处支付。我不确定这些将如何在您的用例中取得平衡。
    • 您应该从这个 PDC 检查这个会话,它描述了如何使用 IronPython/IronRuby 在应用程序中启用脚本:ecn.channel9.msdn.com/o9/pdc09/wmv/FT30.wmv
    猜你喜欢
    • 2011-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-31
    • 1970-01-01
    相关资源
    最近更新 更多