Pergunta

Estou fazendo um programa genético, mas estou atingindo uma limitação com C#, onde quero apresentar novas funções ao algoritmo, mas não posso fazê -lo sem recompilar o programa. Em essência, quero que o usuário do programa forneça as funções permitidas e o GP os usará automaticamente. Seria ótimo se o usuário for necessário saber o mínimo de programação possível.

Quero conectar as novas funções sem compilá -las no programa. No Python, isso é fácil, pois tudo é interpretado, mas não tenho idéia de como fazê -lo com C#. Alguém sabe como conseguir isso em C#? Existem bibliotecas, técnicas, etc?

Foi útil?

Solução

Depende de como você deseja que o usuário do programa "forneça as funções permitidas".

  • Se o usuário estiver escolhendo funções que você já implementou, você pode passá -las como delegados ou árvores de expressão.
  • Se o usuário escrever seus próprios métodos em C# ou outro idioma .NET e compilá -los em uma montagem, você poderá carregá -los usando a reflexão.
  • Se você deseja que o usuário seja capaz de digitar o código -fonte C# em seu programa, você pode compilar esse uso do CodEdom e ligue para a montagem resultante usando a reflexão.
  • Se você deseja fornecer uma linguagem de expressão personalizada para o usuário, por exemplo, uma linguagem matemática simples, então (supondo que você possa analisar o idioma), você pode usar a reflexão. Reflexão. Ou você pode construir uma árvore de expressão a partir do código do usuário e compilar que o uso do LINQ - depende de quanta flexibilidade você precisa. (E se você puder esperar, a expressão de árvores no .NET 4.0 remove muitas das limitações que estavam em 3,5, para que você possa evitar o reflexo.
  • Se você estiver feliz por o usuário inserir expressões usando o Python, Ruby ou outro idioma DLR, poderá hospedar o tempo de execução dinâmico do idioma, que interpretará o código do usuário para você.

Hospedar o DLR (e IronPython ou IronRuby) pode ser uma boa escolha aqui, porque você obtém um ambiente bem testado e todas as otimizações que o DLR oferece. Aqui está como usar o Ironpython.

Adicionado em resposta à sua pergunta de desempenho: O DLR é razoavelmente inteligente sobre a otimização. Ele não reinterprete cegamente o código-fonte todas as vezes: uma vez que ele transformar o código-fonte (ou, especificamente, uma determinada função ou classe) para MSIL, continuará reutilizando essa representação compilada até que o código-fonte mude (por exemplo, o função é redefinida). Portanto, se o usuário continuar usando a mesma função, mas em diferentes conjuntos de dados, desde que você possa manter o mesmo scriptscope, você deve obter perf decente; O mesmo vale para a sua preocupação, você vai executar a mesma função zilhões de vezes durante o algoritmo genético. Hospedar o DLR é muito fácil de fazer, por isso não deve ser difícil fazer uma prova de conceito e medir para ver se depende de suas necessidades.

Outras dicas

Você pode tentar criar e manipular Árvores de expressão. Usar Linq para avaliar árvores de expressão.

Você também pode usar o CodEdom para compilar e executar uma função. Com certeza você pode pesquisar no Google para ver alguns exemplos que podem atender às suas necessidades. Parece que Este artigo "Como compilar dinamicamente o código C#" e Este artigo "executando o código dinamicamente no .net" poderia ajudá -lo.

Você tem acesso ao compilador a partir do código, pode criar instâncias do código compilado e usá -las sem reiniciar o aplicativo. Existem exemplos disso ao redor

Aqui

e

Aqui

O segundo é um avaliador de JavaScript, mas pode ser adaptado com bastante facilidade.

Você pode dar uma olhada no System.reflection.emit para gerar código no nível da IL.

Ou gerar C#, compilar em uma biblioteca e carregar isso dinamicamente. Não tão flexível.

Na verdade, é muito fácil gerar IL. Veja este tutorial: http://www.meta-alternative.net/calc.pdf

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top