プログラミング(特にC++ドメイン)で使用されているのを見たことがありますが、それが何であるかはわかりません。おそらくそれはデザインパターンですが、私は間違っている可能性があります。誰でもサンクの良い例を挙げることができますか?
thunk
は通常、関数として呼び出され、小さなことを行い、呼び出し元に戻る代わりにJUMP
sを別の場所(通常は関数)に呼び出す小さなコードを指します。 JUMPターゲットが通常の関数であると仮定すると、戻ると、サンクの呼び出し元に戻ります。
サンクを使用すると、多くの便利なものを効率的に実装できます
プロトコル変換-ある呼び出し規則を使用するコードから別の呼び出し規則を使用するコードに呼び出す場合、thunk
を使用して引数を適切に変換できます。これは、戻り規則に互換性がある場合にのみ機能しますが、多くの場合そうです
仮想関数の処理-C++で多重継承ベースクラスの仮想関数を呼び出す場合、this
ポインターを修正して適切な場所を指すようにする必要があります。 thunk
はこれを行うことができます。
動的なクロージャー-動的なクロージャーを作成するとき、クロージャー関数は作成されたコンテキストに到達できる必要があります。小さなthunk
を構築して(通常はスタック上に)、いくつかのレジスタにコンテキスト情報を設定し、クロージャーの関数を実装する静的なコードにジャンプします。ここでのサンクは、呼び出しサイトによって提供されない関数に1つ以上の隠された追加の引数を効果的に提供します。
Wordサンクには、コンピューターサイエンスで少なくとも3つの関連する意味があります。 「サンク」には次のものがあります。
私は通常、3番目のコンテキストで使用されるのを見ました。
C++などのオブジェクト指向言語用の一部のコンパイラは、多重継承または仮想継承が存在する場合の仮想関数呼び出しの最適化として「サンク」と呼ばれる関数を生成します。
から取得: http://en.wikipedia.org/wiki/Thunk#Thunks_in_object-oriented_programming
サンクという用語は、元々 Royal Radar Establishment コンパイラでの名前によるパスの実装で使用されるメカニズムを指していました ALGOL6 コンパイラー。一般的には、明らかに静的なオブジェクトを参照するときに動的な動作を誘発する方法を指します。この用語はブライアン・ウィッチマンによって考案されました。ブライアン・ウィッチマンは、名前渡しを説明するよう求められたとき、「メモリから値をロードし、突然-サンク-そこに式を評価しています」と言いました。
サンクはハードウェアに配置されています(KDF9、バローズメインフレームを参照)。それらをソフトウェアで実装する方法はいくつかありますが、すべてマシン、言語、コンパイラ固有です。
この用語は、名前によるパスを超えて一般化されるようになり、見かけ上または名目上静的なデータ参照が動的な振る舞いを誘発する状況を含むようになりました。関連用語には、「トランポリン」と「未来」が含まれます。
使用にはかなりのバリエーションがあります。ほぼ普遍的に、サンクは(少なくとも概念的には)異常に小さくシンプルな関数です。通常、何らかのアダプター(何らかのデータ、別の機能など)に対する正しいインターフェースを提供しますが、少なくとも他のことはほとんど行われていないように見えます。
(少なくとも通常使用される)構文糖は、人間の読者が見たいように見えるようになっていることと、サンクはコンパイラが望むように見えるようにすることを除いて、構文糖の形にほとんど似ていますそれを参照してください。
これを調べてみますが、thunkingは、レガシー16ビットコードを実行するために32ビットプロセッサで採用されているプロセスだと思いました。
私は、あなたが話す速さを制限する方法と、口のきけない人と話すときに使用する言葉の類推としてそれを使用していました。
ええ、それはウィキペディアのリンクにあります(私のnerdalogyではなく、32ビットに関する部分)。
https://en.wikipedia.org/wiki/Thunk
相互運用性サンクに関する文献の多くは、MS-DOS、OS/2、[8] Windows [9] [10]、および.NETなどのさまざまなWintelプラットフォームと、 16ビットから32ビットのメモリアドレス指定。顧客が1つのプラットフォームから別のプラットフォームに移行するにつれて、古いプラットフォーム用に作成されたレガシーソフトウェアをサポートするためにサンクが不可欠になりました。
(強調は私によって追加されました)
この質問は既にSOで質問されています。
Schemeまたは一般的に使用される「サンク」とは何ですか?
私が言えることから、それはラムダ文に似ており、評価する必要があるまで値を返したくないかもしれません。または、プロパティゲッターと比較することもできます。プロパティゲッターは、値を返すためにいくつかのコードを実行しますが、変数のように見えるインターフェイスフォームを持ちますが、継承またはコンパイル時または環境特性に基づいて実行時に値を評価して返す関数ポインタを交換することにより。
歴史的に知られている事実上の使用法に一致するこの用語の一般的な「コンピューターサイエンス」の定義を見つけられないことに、私は悩みました。最初に実際に出会ったのは、OS/2の時代と16-32ビットへの移行で、実際にどこで呼ばれたかを思い出すことができます。 「サンク」は、今日のアプリケーションでは皮肉のようです。
私の大まかな一般的な理解は、サンクは、言及された歴史的なケースのように、システム間で基本的な境界を何もしないかルーティングするスタブルーチンであるということです。
したがって、感覚は、ある環境から別の環境に落とされて「サンク」サウンドを(比/的に/直mileとして)共感するようなものです。
カイルシンプソン 定義ごとに、サンクはtimeのコンポーネントを抽象化する方法です非同期コードのうち。