2

静的に型付けされた言語用の小さなコンパイラを作成しました。静的言語がどのように機能するかを理解した後、groovy のような動的言語に頭を悩ませています。

コンパイラを構築しているときに、マシンレベルのコードを生成したら、それを変更する方法がないことを知っています! (つまり、そのrun-time)。

しかし、Groovy は次のようなステートメントの型を推論するなど、この魔法のようなことをどのように行うのでしょうか。

def a = "string"
a.size()

私に関する限り、groovy は、行を実行する前にタイプais ofを見つける必要があります。コンパイル時(ASTの構築中)にそうしているようです!しかし、言語は動的と呼ばれます。stringa.size()

私は混乱しています、親切に私が理解するのを手伝ってください。

ありがとう。

4

1 に答える 1

3

Groovyは単にメソッドを「呼び出す」のではなく、メタオブジェクトプロトコルを介してメソッドをディスパッチします。メソッド呼び出しは、オブジェクトにメッセージとして送信され、オブジェクトはそれに応答するかどうかを決定できます。動的型付けを使用する場合、オブジェクトタイプは、そのメッセージに応答する場合にのみ重要です。これはダックタイピングと呼ばれます。

Groovyコードを逆コンパイルすると、(簡単ではありませんが)それを確認できます。groovyc他のツールを使用してコンパイルおよび逆コンパイルできます。jd-guiをお勧めします。Groovyのメソッドキャッシングのため、メソッドが明示的に呼び出されていることはわかりません(Groovyの優れたパフォーマンスを実現するためにこの方法で実行されます)。

次のような単純なスクリプトの場合:

def a = "abcdefg"
println a.substring(2)

これが生成されたコードになります:

CallSite[] arrayOfCallSite = $getCallSiteArray(); Object a = "abcdefg";
return arrayOfCallSite[1].callCurrent(
    this, arrayOfCallSite[2].call(a, Integer.valueOf(2))); return null;

また、メソッド呼び出しは、直接呼び出されるのではなく、オブジェクトに「ディスパッチ」されます。これは、SmalltalksおよびRubyメソッドディスパッチと同様の概念です。Groovyオブジェクトのメソッドとプロパティアクセスをインターセプトできるのは、そのメカニズムのためです。

Groovy 2以降、Groovyコードは静的にコンパイルできるため、コンパイラーのように機能します。

于 2012-11-24T13:56:54.877 に答える