문제

나는 유전자 프로그램을 만들고 있지만 알고리즘에 새로운 기능을 제시하고 싶은 C#에 제한을두고 있지만 프로그램을 다시 컴파일하지 않고는 할 수 없습니다. 본질적으로 나는 프로그램 사용자가 허용 된 기능을 제공하기를 원하며 GP는 자동으로이를 사용합니다. 사용자가 가능한 한 프로그래밍에 대해 거의 알아야한다면 좋을 것입니다.

프로그램에 컴파일하지 않고 새로운 기능을 연결하고 싶습니다. 파이썬에서 이것은 모두 해석되기 때문에 쉽지만 C#으로 수행하는 방법은 없습니다. C#에서 이것을 달성하는 방법을 아는 사람이 있습니까? 라이브러리, 기술 등이 있습니까?

도움이 되었습니까?

해결책

프로그램 사용자가 "허용 된 기능을 제공하기"를 원하는 방법에 따라 다릅니다.

  • 사용자가 이미 구현 한 기능을 선택하는 경우 대의원이나 표현 트리로 주변을 전달할 수 있습니다.
  • 사용자가 C# 또는 다른 .NET 언어로 자신의 방법을 작성하여 어셈블리로 컴파일하려면 반사를 사용하여로드 할 수 있습니다.
  • 사용자가 프로그램에 C# 소스 코드를 입력 할 수 있으려면 Codedom을 사용하여 컴파일 한 다음 반사를 사용하여 결과 어셈블리를 호출 할 수 있습니다.
  • 예를 들어 간단한 수학적 언어 (언어를 구문 분석 할 수 있다고 가정 할 때) 사용자에게 사용자 지정 표현 언어를 제공하려면 Reflection.Emit을 사용하여 동적 어셈블리를 생성하고 사용하여 호출 할 수 있습니다. 반사. 또는 사용자 코드에서 표현식 트리를 구성하고 LINQ를 사용하는 것을 컴파일 할 수 있습니다. 필요한 유연성의 양에 따라 다릅니다. (기다릴 여유가 있다면 .NET 4.0의 표현 나무는 3.5에있는 많은 제한 사항을 제거하므로 반사를 피할 수 있습니다.
  • 사용자가 Python, Ruby 또는 다른 DLR 언어를 사용하여 표현식을 입력하는 것이 기쁘다면 동적 언어 런타임을 호스팅하여 사용자의 코드를 해석 할 수 있습니다.

DLR (및 Ironpython 또는 Ironruby)을 호스팅하는 것은 잘 테스트 된 환경과 DLR이 제공하는 모든 최적화를 얻기 때문에 여기에서 좋은 선택이 될 수 있습니다. Ironpython을 사용하는 방법은 다음과 같습니다.

성과 질문에 대한 응답으로 추가 : DLR은 최적화에 대해 합리적으로 똑똑합니다. 매번 소스 코드를 맹목적으로 다시 상영하지 않습니다. 일단 소스 코드 (또는 특히 주어진 함수 또는 클래스)를 MSIL로 변환 한 후에는 소스 코드가 변경 될 때까지 컴파일 된 표현을 계속 재사용합니다 (예 : 함수가 재정의됩니다). 따라서 사용자가 동일한 기능을 계속 사용하지만 다른 데이터 세트를 통해 동일한 스크립트 스코프를 유지할 수있는 한 괜찮은 성능을 얻어야합니다. 유전자 알고리즘 중에 동일한 기능을 수십만 번으로 실행할 것이라는 우려가 있다면 Ditto. DLR을 호스팅하는 것은 매우 쉽기 때문에 개념 증명을 수행하고 필요에 맞는 지 확인하기가 어렵지 않아야합니다.

다른 팁

당신은 만들고 조작하려고 시도 할 수 있습니다 표현 나무. 사용 LINQ 표현 나무를 평가합니다.

Codedom을 사용하여 함수를 컴파일하고 실행할 수도 있습니다. 확실히 Google에서 귀하의 요구에 맞는 몇 가지 예를 볼 수 있습니다. 그것은 것 같습니다 이 기사 "C# 코드를 동적으로 컴파일하는 방법" 그리고 이 기사 ".NET에서 코드를 동적으로 실행" 당신을 도울 수 있습니다.

코드 내에서 컴파일러에 액세스 할 수 있으므로 컴파일 된 코드의 인스턴스를 생성하고 응용 프로그램을 다시 시작하지 않고 사용할 수 있습니다. 주변의 예가 있습니다

여기

그리고

여기

두 번째는 JavaScript 평가자이지만 쉽게 쉽게 적응할 수 있습니다.

IL 레벨에서 코드를 생성하려면 System.Reflection.emit을 살펴볼 수 있습니다.

또는 C#을 생성하고 라이브러리로 컴파일하고 동적으로로드하십시오. 거의 유연하지 않습니다.

실제로 IL을 생성하는 것은 매우 쉽습니다. 이 자습서를 참조하십시오 : http://www.meta-alternative.net/calc.pdf

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top