質問
プログラミング (特に C++ ドメイン) で使用されているのを見たことがありますが、それが何であるかはわかりません。おそらくそれはデザインパターンだと思いますが、間違っている可能性があります。誰かがサンクの良い例を挙げることができますか?
解決
あ thunk
通常、関数として呼び出され、小さなことを実行してから実行される小さなコード部分を指します。 JUMP
呼び出し元に戻るのではなく、別の場所 (通常は関数) に移動します。JUMP ターゲットが通常の関数であると仮定すると、関数が返されると、サンクの呼び出し元に戻ります。
サンクを使用すると、多くの便利なものを効率的に実装できます
プロトコル変換 -- ある呼び出し規約を使用するコードから、別の呼び出し規約を使用するコードを呼び出す場合、
thunk
引数を適切に変換するために使用できます。これは、戻り値の規則に互換性がある場合にのみ機能しますが、多くの場合、これが当てはまります。仮想関数の処理 -- C++ で多重継承基本クラスの仮想関数を呼び出す場合、
this
ポインターを使用して、正しい場所を指すようにします。あthunk
これはできます。動的クロージャ -- 動的クロージャを構築するとき、クロージャ関数はそれが作成されたコンテキストを取得できる必要があります。小さな
thunk
いくつかのレジスタにコンテキスト情報を設定し、クロージャの関数を実装する静的なコード部分にジャンプする (通常はスタック上に) 構築できます。ここでのサンクは、呼び出しサイトによって提供されない 1 つ以上の非表示の追加引数を関数に効果的に提供します。
他のヒント
サンクという言葉には、コンピューター サイエンスにおいて少なくとも 3 つの関連する意味があります。「サンク」とは次のようなものです。
- 遅延した計算を実行するためのコード(閉鎖と同様)
- いくつかの仮想関数テーブル実装の機能(ラッパー関数と同様)
- マシンデータのマッピング システム特有の形から別の形へ、 通常は互換性のため
私は通常、これが 3 番目の文脈で使用されているのを見てきました。
の複数または仮想継承の存在下での仮想関数呼び出しの最適化として「サンク」と呼ばれる機能を生成++。Cなどのオブジェクト指向言語のためのいくつかのコンパイラの
から撮影: http://en.wikipedia.org/wiki/Thunk#Thunks_in_object -oriented_programmingする
という用語は、本来サンクpass-のロイヤルレーダー確立の実装によって使用されるメカニズムと呼ばその Algol60 のコンパイラでは、名前で。一般的には明らかに静的オブジェクトを参照するときに動的挙動を誘発する任意の方法を指します。
用語は、「 - - サンクが、あなたが式を評価している。さて、あなたは突然、メモリから値をロードしに行く」と言っ渡しの名前を説明するよう求められブライアンWichmann、によって発明されましたサンクは(KDF9、バローズメインフレームを参照)、ハードウェアに入れています。ソフトウェアでそれらを実装するにはいくつかの方法は、すべての非常に機械、言語およびコンパイラ固有のがあります。
という用語は、明らかに、または名目上の静的データ参照は、動的挙動を誘導する任意の状況を含むように、パスごとの名前を越えて一般化されるようになってきました。関連用語は「トランポリン」と「未来」が含まれます。
の使用にはかなりのばらつきがあります。ほぼ普遍、サンクは、(少なくとも概念的には)の非常に小型でシンプルなその関数です。これは通常、何かまたは他の(一部のデータ、別の関数など)への適切なインターフェイスを提供しますが、少なくとも、少し他にやってと見られているアダプタのいくつかの並べ替えです。
これはシンタックスシュガーは、物事は人間の読者がそれらを見たい道を見えるようになって、サンクは何かが道に見えるようにすることです(通常使用される少なくともとして)ことを除いて、ほとんどのシンタックスシュガーの形のようなものですコンパイラはそれを見たいと思ってます。
私はこのアップを見に行くんだけど、私はのサンクの考えレガシー16ビットのコードを実行するために、32ビットのプロセッサによって使用されるプロセスだった。
私はあなたが話をし、どのようなダムの人と話をするときの言葉は、あなたが使用してどのくらいの速を制限する必要がどのようにのためのアナロジーとしてそれを使用するために使用されます。
うん、それはWikipediaのリンクにあります(32ビット程度の部分ではなく、私ののnerdalogy の)ます。
https://en.wikipedia.org/wiki/Thunkする
相互運用性サンクに関する文献の多くは、MS-DOS、OS / 2、[8]のWindows [9] [10]と.NET、を16ビットから遷移するなど、様々なWintelのプラットフォームに関し32ビットメモリにのアドレッシング。顧客が別のプラットフォームから移行してきたように、サンクは、古いプラットフォーム用に書かれたレガシーソフトウェアをサポートするために必要不可欠となっている。
(私が追加強調)
この質問はすでに見、SOに頼まれています:
'サンク' は、どのようなものですスキームや一般的に使用されるような?の
私が言うことができるものから、は、それはあなたがそれを評価するために必要になるまで値を返すようにしたいかもしれないラムダ計算書、に似ます。あるいはまた、設計によって一層変数のよう遭遇インターフェイス形態を有しながら値を返すために、いくつかのコードを実行するだけでなく、継承によってかどうかをスワップアウトすることができる多型挙動を有するか、またはプロパティゲッターと比較することができます評価し、コンパイル時または環境特性に基づいて実行時に値を返す関数ポインタをスワップアウトすることもできます。
は私が私には歴史的に知られているように、その事実上の使用状況に合致するこの用語の無い一般的な「コンピュータサイエンス」の定義を見つけるために悩まされました。それは実際にOS / 2日と16から32ビットの移行にあったものと呼ばれていた場所を最初に現実の出会いは、私が思い出すことができます。 「サンク」は、その用途に皮肉のように、今日で表示されます。
私のラフ一般的な理解は、サンクは今述べた歴史的な例のようにシステム間の一種で、いくつかの基本的な境界を越えて何かルートを行わないことをスタブルーチンがあるということです。
だから、感覚が他の作り(比喩的に/直喩として)「サンク」の音に1つの環境から削除されているの共感覚のようなものです。
パーカイルシンプソンのの定義、 のサンクののうち非同期コードのの時間の抽象コンポーネントへの道です。