3

実行時にメソッドが機能する方法を変更することがコア要件となる次のプロジェクトがあります。実際の効果は似ていますが、「あるメソッドを別のメソッドにシャドウイングする」などの高レベルのオブジェクト指向の概念について話しているのではないことに注意してください。

私が求めている主なプロパティは次のとおりです。

  • 新しい式を追加したり、既存の式を削除したり、メソッド内で発生する式を変更したりできるように、メソッドを変更できる必要があります。

  • メソッドを変更した後、そのメソッドを呼び出すと、新しい一連の操作が呼び出されます。(または、言語が毎回評価するのではなくメソッドをバインドする場合は、新しいメソッドのバインドを解除/再バインドする方法を提供してください。)

  • 理想的には、アセンブリを直接操作するのではなく(たとえば、「これら3つのパラメーターをスタックにポップする」)、言語のアトミックユニットを操作したい(たとえば、「fooオブジェクトのメソッドを呼び出すbar」)。言い換えれば、私が構築する操作がその言語で意味的に意味があることを確信できるようにしたいと思います。しかし、私は私が得ることができるものを取ります。

候補言語がこれらの基準を満たしているかどうかわからない場合は、簡単なリトマス試験を次に示します。

cleanwhichと呼ばれる別のメソッドを記述できますか?

  • メソッドmを入力として受け入れます

  • m2と同じ操作を実行する別のメソッドを返しますm

  • m2同じですがm、ご使用の言語(puts、System.Console.WriteLn、printlnなど)でのprint-to-standard-outメソッドの呼び出しは含まれていませんか?

今から予備調査をして、最強の候補者を見つけたいと思います。大規模で活発なコミュニティを持つことは、私がやりたいことを実行することの実用性と同じくらい重要です。バイトコードを直接操作することは通常、公開する必要のある操作ではないため、ここには偽造されていない領域が存在する可能性があることを認識しています。

私が利用できる選択肢は何ですか?可能であれば、あなたが推奨する1つ以上の言語でおもちゃの例を提供できますか、それとも最近の例を教えてください。


更新:私がこの後の理由は、新しい情報に応じて実行時に自分自身を変更できるプログラムを書きたいからです。この変更は、単なるパラメーターや構成可能なデータを超えていますが、動作の本格的で進化した変更です。(いいえ、私はウイルスを書いていません。;))

4

5 に答える 5

1

まあ、本当に強力なマクロサポートを備えた言語(特にLisps)は適格である可能性があります。

しかし、あなたは実際にこれを深くする必要があると確信していますか?あなたが何をしようとしているのかはわかりませんが、実際にメタプログラミングに深く入り込むことなく、それをエミュレートできると思います。たとえば、メソッドを使用してそれを操作する代わりに、関数のコレクションを使用します(状態を共有する何らかの方法で、たとえば、それぞれに渡された状態を保持するオブジェクトを使用します)。

于 2011-02-10T15:38:54.303 に答える
1

そうですね、いつでも.NETと式ライブラリを使用して式を作成できます。メモリ内にコマンドの表現を構築でき、操作やトラバースなどのための優れたライブラリサポートがあるので、これが本当に最善の策だと思います。

于 2011-02-10T15:33:05.923 に答える
1

Groovyはこれができると思います。

例えば

class Foo {
   void bar() {
      println "foobar"
   }
}

Foo.metaClass.bar = {->
    prinltn "barfoo"
}

または、他のインスタンスに影響を与えずにfooの特定のインスタンス

fooInstance.metaClass.bar = {->
    println "instance barfoo"
}

このアプローチを使用して、メソッドから式を変更、削除、または追加できます。後続の呼び出しでは、新しいメソッドが使用されます。GroovymetaClassではかなり多くのことができます。

于 2011-02-10T15:50:00.603 に答える
0

Javaでは、多くのプロフェッショナルフレームワークがオープンソースのASMフレームワークを使用してこれを行います。これは、ASMを含むすべての有名なJavaアプリとライブラリのリストです

数年前、BCELも非常に使用されていました。

于 2011-02-10T15:35:34.380 に答える
0

実際のランタイム変更を可能にする言語/環境があります-たとえば、Common Lisp、Smalltalk、Forth。自分が何をしているかを本当に知っている場合は、そのうちの1つを使用してください。それ以外の場合は、コードの進化する部分にインタープリターパターンを使用するだけで済みます。これは、任意のOOまたは関数型言語で可能です(そして些細なことです)。

于 2011-02-10T15:55:33.257 に答える