問題タブ [dynamic-dispatch]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
language-agnostic - 動的ディスパッチの実装
現在、動的ディスパッチを実装するさまざまな方法を探しています。
私の知る限り、これを実装するには 2 つの「簡単な」方法があります。
- C++ のような仮想関数テーブル
- SmallTalk のようなメッセージ ディスパッチャー (メソッドを に属性として格納するという Python の考え方に多少似ています
__dict__
)
私が知る限り、VFT が選択された理由は、パフォーマンスが合理的で実装が簡単だった (また、C++ の個別のコンパイル モデルに適していた) ためであり、可能な限り最速の方法だったからではありません。
私はすでにいくつかの記事や出版物を読んだことがありますが、そのほとんどは「古い」ものであり (最後に読んだ(*) Pentium 200MHz を使用して言及されていました ... うーん)、それらが最新技術を表しているとは思えません。研究が停滞しない限り。
私は、に興味を持っています:
- ダイナミック ディスパッチ戦略は、複数の方法をサポートしている場合に適しています。
- さまざまな戦略のベンチマーク
私は特に最近の記事や非凡な戦略に興味があります (たとえそれらが効率的であるとは証明されなかったとしても)。
出版物は大歓迎です。自由に入手できればよりよいでしょう。それ以外の場合は、提示された技術の要約と結果が素晴らしいものになるでしょう。
実際のコンパイラの実装に関する技術記事も歓迎します。
(*) Eiffel に関するこの記事は、プログラム全体の分析が仮想呼び出しサイトの除去にどのように役立つかを示しています。
monkeypatching - 汎用タイプのタグ関数テーブルにモンキーパッチを適用する方法
sicpで機能的な動的ディスパッチを実行できる方法の1つを読むのは興味深いと思いました。タグ+名前のタイプのテーブルを使用して->フェッチまたは追加できる関数を使用します。
私は疑問に思っていました、これは動的な非OO言語の典型的なタイプディスパッチメカニズムですか?
また、テーブルの連鎖リストを使用して、これをモンキーパスする一般的な方法は何でしょうか(最初のテーブルに見つからない場合は、次のテーブルを再帰的に試してください)。ローカルスコープ内のテーブルを変更されたコピーに再バインドしますか?電気ショック療法?
java - In Java: Code reuse possible for a chain of method calls up an inheritance hierarchy?
I have some class inheritance SubClass < MidClass < SuperClass and want to perform some TASK upward for all these classes. TASK is quite complex with only minor changes in the 3 classes, which I moved into the private methods m2().
My current solution is very boiler plate:
Can I exploit some code reuse mechanism instead of copying TASK?
Something like the following, with m1() only in SuperClass, does not work:
because super.m1() does not refer to execution of the same inherited method in the context of a super class, but to the overridden method implementation. Since m1() does not exist in Object, I additionally get a compiler error...
Putting TASK in a protected final helper() method in SuperClass and calling helper() instead of copying TASK won't work, since then always SuperClass.m2() gets called.
The only alternative I can think of is slow, complicated and unsafe: using a type token as parameter, i.e. protected final void m1(Class<? extends SuperClass> clazz)
in SuperClass, and fulfilling TASK via reflection (requires to make m2() public static or use setAccessible(true) on m2()).
Do you know some better solution? AOP? Maybe some framework where you can inject a method into classes (as in C#)? Or am I missing something???
java - これはダイナミックディスパッチですか?
これは動的ディスパッチですか:
完全に別のクラスで:
動作が両方のサブクラスで同じであるため、これが動的ディスパッチであるかどうかはわかりませんか?
そうでない場合、動作がサブクラスごとに定義されている場合、動的ディスパッチになりますか?
java - Java、「if not null」ステートメントを置き換える賢い方法は?
SがVector
いっぱいですlong
。
getFirstElement()
常にVector を呼び出してからアクションを実行できるようにしたいと考えていますaddToOtherVector()
。元のベクトルから実際に返される値があるかどうかを気にしないようにしたいです。私は次のようにオーバーライドすることでそれを行うことができると思いますaddToOtherVector()
:
null
しかし、パラメーターとして受け入れられないため、何かのために何をする必要があるのか わかりませんか?
これを行う理由は、取得しようとするたびにベクトルのサイズを確認する必要がないためです。
function - タイプに基づいてジェネリック関数に異なる関数本体を提供する
いくつかの一般的な関数があるとします
しかし、特定のタイプについては、はるかに効率的な方法genericFunc
があります。
これら 2 つの関数本体を同じ に結合する最良の方法genericFunc
はParticularType
何doSomeEasyWork
ですかdoSomeHardWork
? 私は特に、別の名前または別のモジュールを使用するオプションを除外しています。
これは型クラスで実行できると思いますが、言語プラグマを使用するソリューションにもっと興味があります。これは言語プラグマで実行できるという漠然とした考えがありますが、方法がわかりません。これらのアプローチ、および/または他の可能なアプローチを比較対照すると、ボーナスポイントになります。
jvm - アーリーコールによるメソッドディスパッチキャッシュのプリロード?
キャッシングは、VM が静的な「v-table」ベースのメソッド ルックアップに匹敵する動的メソッド ディスパッチを作成するために使用する通常の戦略です。これを利用して、アプリケーションが作成すると予想されるさまざまなオブジェクトのメソッドをインテリジェントに「事前に呼び出す」ことができますか?これにより、そのメソッドが「通常の」実行フローでプログラムによって実際に使用されるときにキャッシュ ミスを回避できると期待できますか? このプラクティスが奨励されているか、何らかの方法で簡単になっている VM を使用する言語はありますか? プログラムが多くの作業を行っていないときに、VM 自体でこのプロセスを自動化できますか?
java - Javaでの動的ディスパッチ
A
メソッドを定義するクラスがあるとしますbar()
。このメソッドbar()
は別のメソッドを呼び出しますfoo()
。次に、拡張A
しB
てオーバーライドし、オーバーライドfoo()
しませんbar()
(したがって、継承されます)。これらの2つのケースでどちらfoo()
が呼び出されていますか?
c++ - O'Reilly の「Objective-C Pocket Reference」では、C++ は Dynamic Dispatch をサポートしていないと主張していますが、これは本当ですか?
4ページに次のように書かれています。
Objective-C は、レシーバーのクラスと親クラスを検索することによって、実行時にどのコードがメッセージを処理するかを動的に決定します。(Objective-C ランタイムは、パフォーマンスを向上させるために検索結果をキャッシュします。) 対照的に、C++ コンパイラは、コンパイル時にディスパッチ テーブルを静的に構築します。
私は StackOverflow とウィキペディアで多くのことを読んできましたが、C++ が Dynamic Dispatch (Dynamic Binding の実装であると言う人もいます) をサポートしているかどうかについて、完全に混乱していると言えば十分です。
Dynamic Dispatch、Dynamic Binding、および C++ がこれらのいずれかまたは両方をサポートしているかどうかの違いを明確にできる人はいますか? 私は C++ や Objective-C の専門家ではなく、Java、Python、および PHP の世界から来ました。