質問

メンバー間の関係を持ついくつかのパブリックユーザー定義クラスと、特定の一般的なシグネチャを持ついくつかのメソッドがあります。

if/then/else、foreach、do/while、変数割り当てなどの基本的な制御ステートメントを使用して、これらのクラス (および CLR クラス) のカスタム制御フローを保存および操作できるようにしたいと考えています。

カスタム制御フローは実行時に作成し、後で使用および操作できるように保存する必要があります。アイデアは、制御フローのデータ表現を、おそらく抽象構文ツリーの形式で持つことです。 厳密に型指定された構文 遺伝的操作を適用できるようにするためです。結果として得られるカスタム コードは、別のプログラムの一部として実行する必要があります。

1) 遺伝的操作を操作するための好ましいコード表現は何ですか。その後、私のクラスを含むコードを実行します。

2) 上記の問題にはどの C# テクノロジを使用する必要がありますか?リフレクション、C# 3.0 の新しい機能 (ラムダ、式ツリー)、CodeDom、DLR ライブラリなどの関連テクノロジがあることはわかっていますが、どのアプローチまたは組み合わせが最も効率的ですか。

3) そのようなパラダイムや実装は利用可能ですか?

編集:プラットフォームには、定義された C# カスタム型のデータ (定数と時間変数の両方) が提供されます。

瞬間ごとにルール (基本条件またはより複雑な関数) がデータに適用され、何らかのアクションの実行が決定されます。

次のことができるようになりたいです:

ルールをツリーやグラフで表現し、フローを実行します。

ユーザーが UI ツールキットを介してカスタム ルール セットを作成する

ツリーやグラフ上で並べ替えてGP操作を適用する

役に立ちましたか?

解決

リフレクションは、すでに生成された型、メソッド、フィールドなどを検査するテクノロジーであるため、現時点ではおそらくあまり役​​に立ちません。

式ツリーはかなり興味深いものですが、私の知る限り、ラムダ式は本体を持つことができないため、複雑なプログラム フローを作成することはできません。そのため、ある程度複雑なものを作成するのはかなり困難になります。

DLR は若干の準備が進んでいます。必要な部分はすべて入手できますが、DLR のサポートが組み込まれているのは次の .NET バージョンだけです。その場でプログラムを作成して実行することは、興味深い代替手段となる可能性があります。

ここでできることは、動的メソッドまたは動的に生成されたアセンブリのいずれかで IL を発行することです。考えられる構成要素はすべて利用できるはずですが、その後の操作はおそらくかなり困難です。

それでも、かなりの IL マジックを実行するプロジェクトが 1 つあり、それはあなたにとって役立つかもしれません。 林福. 。リストによると、Dynamic Object の実装があり、dynamicObject.CreateDuck<InterfaceType>() のようなことを実行できます。

少し重いかもしれませんが、興味深いもう 1 つのルートは、WF (Workflow Foundation) フレームワークです。このようなワークフローはプログラムによって構築可能である必要があり、継続スタイルの動作により興味深いものになる可能性があります。実行中のワークフローをいつでも永続化し、保存した場所から再開できます。

従来のプログラム構造はすべて WF 内で利用できるはずです。

他のヒント

C# などの言語で表現されるブリーディング プログラムは非常に扱いが難しく、順応性を考慮して設計されていないため、加えた変更の大部分が単にプログラムの失敗を引き起こすだけであることがわかります。

次の 2 つの代替アプローチのいずれかを推奨します。

  1. 擬似マシン言語。2 種類の NOP でパターン マッチングを使用して分岐またはループを可能にします。
  2. LISP リンク言語。名前付き関数の再帰を使用して反復を可能にします。

(1) は、命令の線形シーケンスと、何らかの形式の仮想レジスタまたはスタック マシンを使用して表現できます。(2) はツリーを使用して表現でき、何らかの形式の「reduce」アルゴリズムを使用して評価されます。

どのアプローチを使用する場合でも、プログラムはサンドボックス内で実行する必要があります。無限ループがよく発生するため、設定されたサイクル数の後にプログラムを停止できる必要があります。

<のhref = "http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx" rel = "nofollowをnoreferrer">このスペースに地面をカバーするダイナミック式[例] API ...

c# (これをサポートする他の .net 言語では、f# もうまく機能します) を出力し、CodeDomProvider を使用してオンザフライでコンパイルするだけです。指定されたコードを強制的に 1 つのソース ファイルにし、IDynamicEntryPoint を実装する型を含めます (静的メソッドまたはエントリ ポイントで構築後に呼び出される空のコンストラクターを使用)

これは、すぐに試すことができると同時に、長期的に最高のパフォーマンスが得られる可能性が最も高いため、最初に呼び出すポートとして使用する必要があります (動的 IL 出力を除いて、それでもコンパイラーに勝てない可能性があります)。

これには明らかに、取引を妨げる可能性のある 2 つの欠陥があります。

  • 結果として得られるコードはセキュリティ上の悪夢であり、完全に信頼されたユーザーからのコード入力のみを許可する必要があります。
  • 動的にコンパイルされたコードは、コード/インターフェイスの変更 (コードに含める必要がある DLL のセットが変更されるか、一致しない可能性があります) または IDynamicEntryPoint の署名が変更される可能性に関して脆弱です。

趣味で独自の言語/パーサー/コンパイラーを作成することに興味がない場合は、すでに存在するものを使用してください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top