C#如何创建在运行时解释的函数

Kir*_*ril 6 c# genetic-programming genetic-algorithm

我正在制作一个遗传程序,但是我在C#中遇到了限制,我希望在算法中提供新的函数,但是如果不重新编译程序我就无法做到.本质上,我希望程序的用户提供允许的功能,GP将自动使用它们.如果要求用户尽可能少地了解编程,那将是很好的.

我想插入新功能而不将它们编译到程序中.在Python中这很容易,因为它都被解释了,但我不知道如何使用C#来做到这一点.有谁知道如何在C#中实现这一目标?有没有图书馆,技术等?

ito*_*son 13

这取决于您希望程序用户"提供允许的功能".

  • 如果用户正在选择您已经实现的函数,则可以将它们作为委托或表达式树传递.
  • 如果用户要用C#或其他.NET语言编写自己的方法,并将它们编译成程序集,则可以使用Reflection加载它们.
  • 如果您希望用户能够在程序中键入C#源代码,可以使用CodeDom编译它,然后使用Reflection调用生成的程序集.
  • 如果您想为用户提供自定义表达式语言,例如简单的数学语言,那么(假设您可以解析语言)您可以使用Reflection.Emit生成动态程序集并使用 - 您猜对了 - 反射.或者您可以从用户代码构造表达式树并使用LINQ进行编译 - 取决于您需要多大的灵活性.(如果你能负担得起,.NET 4.0中的表达式树可以消除3.5中的许多限制,所以你可以完全避免使用Reflection.Emit.)
  • 如果您很高兴用户使用Python,Ruby或其他DLR语言输入表达式,您可以托管动态语言运行时,它将为您解释用户的代码.

托管DLR(以及IronPython或IronRuby)可能是一个不错的选择,因为您获得了经过良好测试的环境以及DLR提供的所有优化. 这是使用IronPython的方法.

为响应您的性能问题而添加: DLR在优化方面相当聪明.它并不是每次都盲目地重新解释源代码:一旦它将源代码(或者,具体地,给定的函数或类)转换为MSIL,它将继续重用该编译的表示直到源代码改变(例如,功能被重新定义).因此,如果用户继续使用相同的功能但是使用不同的数据集,那么只要你可以保持相同的ScriptScope,你应该获得不错的性能; 如果你担心的是你将在遗传算法中运行相同的功能数千万次,那么同上.托管DLR非常容易,因此要对概念进行验证并测量它是否符合您的需求并不难.


dev*_*vio 7

您可以尝试创建和操作表达式树.使用Linq来评估表达式树.

  • 表达式树比纯eval函数更好. (2认同)