バイトコードウィービング対Lispマクロ


11

私は、関数呼び出しのインターセプト、ロギングコードの挿入などを行うためにバイトコードウィービングを使用するJavaやC#のような言語用に書かれたライブラリについて読んでいます。それらの利用方法をよりよく理解しようとする。マクロについてよく読めば読むほど、マクロがバイトコードウィービングライブラリと同じ種類の機能を提供するように見えます。機能とは、コンパイル時にコードを操作できることを意味します。

私が見ているライブラリの例は、AspectJ、PostSharp、Cecilです。

片方でできること、もう片方ではできないことはありますか?彼らは実際に同じ問題を解決していますか、それともリンゴとオレンジを比較していますか?


2
バイトコードの織り方は、動的言語が必要であるが静的に型付けされた言語にこだわっている場合の
回避策

2
@kevinclineあなたはこの古い戦いを真剣に始めようとしていますか?
ジョナサンヘンソン

回答:


10

バイトコードの織り方とマクロは、2つの異なるものです。

バイトコードウィービングは、関数呼び出しをインターセプトする方法です。そのため、関数の実行前または実行後に、何らかの種類の機能(通常、ログ記録などの横断的な関心事)を関数呼び出しに挿入できます。バイトコードウィービングはバイトコードレベルで行われます。つまりコンパイルに発生ます。関数自体は影響を受けません。これは、アスペクト指向プログラミングが使用する手法の1つです。

マクロは、言語の構文を拡張する方法です。最も簡単な形式では、マクロは単にキーストロークを記録し、ホットキーを使用してそれらを再生する方法です。言語マクロも同様に機能します。キーワードまたはその他の構文構成は、何らかのマクロ展開の代わりになります。もちろんこれは単純化されすぎています。Lisp固有のマクロのより良い例は、ここにあります


これがAOPを実装する重要な方法であることに言及して+1。
ジョナサンヘンソン

そしてトランザクション...トランザクションを忘れないでください。
ジョナサンヘンソン

3
LISPマクロは、「キーストロークを記録する方法」のようなものではありません。
ケビンクライン

1
答えIMOにはいくつかの基本的な概念がありません。それらは、AST、リフレクション、メタサーキュラリティです。
アンドレアスシャイナート

2
@AndreasScheinert:OPはこれらのことについて何も尋ねませんでした。これは論文ではありません。OPの質問に対する答えにすぎません。
ロバートハーベイ

5

同じ目的で使用される場合もありますが、LISPマクロはJavaバイトコードウィービングプラグインとはまったく異なります。LISPマクロは、LISPソースコードレベルでLISP構文を拡張します。LISPマクロは他のLISPコードと同じレベルで記述されるため、一般的に使用される言語機能です。

Javaバイトコードウィービングプラグインは、JVMレベルで動作します。多くのJavaプログラマーは、他の人が作成したバイトコードウィービングプラグインを使用する場合がありますが、独自のバイトコードウィービングプラグインを作成するJavaプログラマーはほとんどいません。

Javaコンパイラプラグインによって行われる作業の一部は、動的言語で非常に簡単に行われます。関数呼び出しのインターセプトは特に簡単です。


この2つの技術的な違いを理解しています。私は質問を高レベルの観点から見ようとしていました。両方のツールでコードを操作して同じ目標を達成できますか?マクロがバイトコード操作で解決できない問題はありますか(健全でコスト効率の良い方法で)?それは私が目指していたものです。
モータラペマン

@mortalapeman:JavaとC#でバイトコードの変更を介して可能な操作は、すべてLisp、Ruby、Python、Lua、Javascriptなどの言語で直接行うことができます。 -コード操作、しかし実際には起こりません。
ケビンクライン

4

Lispマクロはソースコードレベルで動作しています。コードの一部にマクロをラップすると、多くのことができます。ソースコードの解析、コードの挿入、コードの書き換えなどを含みます。

関数呼び出しを変更したい場合、Lispは通常2つのメカニズムを使用します:

  • 遅延バインディングシンボル。シンボルにバインドされた関数を変更できます。シンボルを通過するすべての関数呼び出しは、新しい関数を使用します。

  • Lispの実装は時々「アドバイス」と呼ばれる機能を提供します。これにより、呼び出しの前後または前後にコードを実行できます。たとえば、LispWorks:Adviceで

したがって、低レベルのコード操作なしで呼び出しをインターセプトできます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.