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

C#如何创建在运行时解释的函数,c#,genetic-algorithm,genetic-programming,C#,Genetic Algorithm,Genetic Programming,我在做一个遗传程序,但我遇到了C#的一个限制,我想为算法提供新的函数,但如果不重新编译程序,我就无法做到这一点。本质上,我希望程序的用户提供允许的功能,GP将自动使用它们。如果要求用户尽可能少地了解编程,那就太好了 我想插入新函数,而不将它们编译到程序中。在Python中,这很容易,因为它都是经过解释的,但我不知道如何使用C#实现。有人知道如何在C#中实现这一点吗?有任何库、技术等吗?您可以尝试创建和操作。用于计算表达式树。您可以从代码中访问编译器,然后可以创建已编译代码的实例并使用它们,而无需

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


我想插入新函数,而不将它们编译到程序中。在Python中,这很容易,因为它都是经过解释的,但我不知道如何使用C#实现。有人知道如何在C#中实现这一点吗?有任何库、技术等吗?

您可以尝试创建和操作。用于计算表达式树。

您可以从代码中访问编译器,然后可以创建已编译代码的实例并使用它们,而无需重新启动应用程序。这方面的例子比比皆是


第二个是javascript计算器,但可以很容易地进行调整。

您可以查看System.Reflection.Emit以在IL级别生成代码


或者生成C#,编译成库并动态加载。没有那么灵活。

这取决于您希望程序用户如何“提供允许的功能”

  • 如果用户正在选择已经实现的函数,则可以将这些函数作为委托或表达式树传递
  • 如果用户打算用C#或其他.NET语言编写自己的方法,并将它们编译成程序集,那么可以使用反射加载它们
  • 如果希望用户能够在程序中键入C源代码,可以使用CodeDom编译,然后使用反射调用生成的程序集
  • 如果您想为用户提供自定义表达式语言,例如简单的数学语言,那么(假设您可以解析该语言),您可以使用Reflection.Emit生成动态程序集,并使用(您猜到的)Reflection调用该程序集。或者,您可以从用户代码构造表达式树,并使用LINQ编译它——这取决于您需要多大的灵活性。(如果您可以等待,.NET4.0中的表达式树消除了3.5中的许多限制,因此您可以完全避免Reflection.Emit。)
  • 如果您希望用户使用Python、Ruby或其他DLR语言输入表达式,则可以托管动态语言运行库,它将为您解释用户代码
在这里托管DLR(以及IronPython或IronRuby)可能是一个不错的选择,因为您可以获得经过良好测试的环境和DLR提供的所有优化


在回答您的性能问题时添加:DLR在优化方面相当聪明。它不会每次都盲目地重新解释源代码:一旦它将源代码(或者,具体地说,一个给定的函数或类)转换为MSIL,它将继续重用已编译的表示,直到源代码发生更改(例如,函数被重新定义)。因此,如果用户在不同的数据集上继续使用相同的函数,那么只要您能够保持相同的ScriptScope,您就应该获得良好的性能;如果您担心的只是在遗传算法中要运行相同的函数无数次,也是如此。托管DLR非常容易,因此进行概念验证和度量以确定它是否满足您的需要应该不难。

您还可以使用CodeDom编译和运行函数。 当然,你可以在谷歌上找到一些可能适合你需要的例子。
这似乎可以帮助你。

事实上,生成IL非常容易。请参阅本教程:

这并不能完全回答您的问题,但由于您使用的是.net,您可以在应用程序的该部分使用F#,因为它可以在运行时进行解释。表达式树比纯eval函数更好。我的GP有多个个体,每个个体都有一个函数和常量树。树中的节点可以是函数或常量。。。这是否意味着我应该用表达式树替换给定节点上的函数?用户如何插入其函数?请注意,树实际上并不包含函数,而是包含标识函数的枚举。调用“executor”时,只需查看枚举并调用相应的函数。。。他们可能是我最好的选择。DLR可能是一个很好的替代方案,调用DLR方法时是否存在显著的性能开销?这些方法将被频繁调用,因此我希望使用一个开销尽可能小的选项。我已经添加了一些关于DLR如何通过重复调用代码来提高性能的信息。虽然我没有定量的数据,但是你可能可以在Google上找到一些东西,或者如果没有找到,那么托管DLR并快速运行是非常容易的。耶,我不打算在执行过程中修改源代码,它可能是相同的方法,但使用不同的数据实例,所以DLR可能是一个不错的选择。我还将利用记忆,因此如果相同的参数总是产生相同的结果,那么该方法将不会被不必要地执行。谢谢:)。