使用基于DLR的语言而不是C#编写脚本任务的原因?

使用基于DLR的语言而不是C#编写脚本任务的原因?,c#,scripting,ironpython,dynamic-language-runtime,C#,Scripting,Ironpython,Dynamic Language Runtime,我正在考虑在我的一个软件项目中嵌入一种脚本语言,并确定了两种选择:在运行时通过CodeDOM编译C#,以及嵌入一种基于DLR的脚本语言。这两个选项都可以让我完全访问.NET Framework 我编写脚本的操作是用户定义的数据行转换和一组元数据,生成修改后的数据行。我希望这些转换是可组合的,并且经常被调用。当然,我希望最终用户能够提供并修改转换 考虑到这种工作量,使用一种方法比使用另一种方法有什么明显的优势吗?对于用户来说,出于明显的原因,通常最好使用语法更宽容的语言。所以我建议使用基于DLR的

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

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


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

对于用户来说,出于明显的原因,通常最好使用语法更宽容的语言。所以我建议使用基于DLR的语言。如果您有时间和资源,那么一个专门的DSL是最佳选择,因为您可以提供一个简单易学的小语法,并且可以更容易地阻止用户做他们不应该做的事情(例如访问文件系统…)

我不能从经验中说,但是,从我所看到的,DLR可以非常快(IronPython比原生Python做得更好!)。但是动态调度总是需要一些开销。另一方面,跨AppDomain调用非常昂贵。虽然动态调度成本在脚本中的任何地方都要支付,但跨AppDomain的成本在每个脚本调用中只支付一次。哪一个更好取决于你的脚本能做多少

嵌入DLR脚本主机是非常困难的。如果您选择这样做,那么很难推出自己的DSL


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

你对这两种方法的相对性能有什么想法吗?或者关于C#选项引起的AppDomain管理问题?或者关于嵌入DLR脚本主机的困难?(尽管这一点很好,但我还是投了赞成票。)“但它永远不会更快…”你是说跨AppDomain方法调用的惩罚将小于DLR动态调度机制吗?你有什么消息来源吗?(在C#实现中,我需要能够卸载已编译的程序集,从而实现AppDomain隔离。)@Dave:哦,这就是问题所在。。。当您穿越AppDomain时,将支付该罚金。轻微的动态调度成本,在脚本中的任何地方都要支付。我不确定这些将如何在您的用例中平衡。您应该从这个PDC检查这个会话,它描述了如何使用IronPython/IronRuby在应用程序中启用脚本: