コンピュータプログラミングにおいて、トランポリンという単語にはさまざまな意味があり、通常はジャンプ命令(つまり、異なるコードパスへの移動)に関連付けられます。
低レベルプログラミング
トランポリン(間接ジャンプベクターと呼ばれることもあります)は、割り込みサービスルーチンやI/Oルーチンなどを指すアドレスを保持するメモリ位置です。実行はトランポリンにジャンプし、すぐに飛び出す、つまりバウンスするため、「トランポリン」と呼ばれます。トランポリンには多くの用途があります。
- トランポリンを使用すると、ベクトルを常に固定された場所で見つけることを想定する中央処理装置(CPU) アーキテクチャによって課せられる制限を克服できます。
- 対称型マルチプロセッシング(SMP)マシンでオペレーティングシステムが起動されると、ブートストラッププロセッサと呼ばれる1つのプロセッサのみがアクティブになります。オペレーティングシステムは自身の設定が完了すると、他のプロセッサにトランポリンコードへのジャンプを指示します。トランポリンはプロセッサを初期化し、オペレーティングシステムが各プロセッサ上でスレッドのスケジューリングを開始するまで待機します。
高水準プログラミング
- 一部のLisp実装で用いられるトランポリンとは、サンクを返す関数(継続渡しスタイル)を反復的に呼び出すループである。1つのトランポリンでプログラムのすべての制御遷移を表現することができ、このように表現されたプログラムはトランポリン化、あるいはトランポリンスタイルである。プログラムをトランポリンスタイルに変換することをトランポリン化という。プログラマーは、トランポリン関数を用いて、スタック指向プログラミング言語において末尾再帰関数呼び出しを実装することができる。[ 1 ]
- Javaにおいて、トランポリンとは、イベントリスナーなどの内部クラスの使用を避けるためにリフレクションを使用することを指します。リフレクション呼び出しの時間オーバーヘッドは、内部クラスのメモリオーバーヘッドと交換されます。Javaにおけるトランポリンは通常、 GenericListenerを作成して外部クラスにイベントを渡すことを伴います。[ 2 ]
- Monoランタイムでは、トランポリンは様々なタスクを実行するために使用される小さな手書きのアセンブリコードです。[ 3 ]
- 互換性のない呼び出し規約を持つコード部分をインターフェイスする場合、トランポリンを使用して、呼び出し元の規約を呼び出し先の規約に変換します。
- 組み込みシステムにおいて、トランポリンは他のコードスニペットを起動する短いコードスニペットです。例えば、割り込みハンドラを全てアセンブリ言語で記述するのではなく、割り込みハンドラの大部分をC言語で記述し、短いトランポリンを使ってアセンブリ言語の割り込み呼び出し規約をC言語の呼び出し規約に変換するという選択肢もあります。[ 4 ]
- C関数を呼び出すことを期待するシステムにコールバックを渡す際に、 C++で記述されたクラスの特定のインスタンスのメソッドを実行させたい場合、短いトランポリンを使用してC関数呼び出し規約をC++メソッド呼び出し規約に変換します。このようなトランポリンを書く方法の一つは、サンクを使用することです。[ 5 ]もう1つの方法は、汎用リスナーを使用することです。[ 2 ]
- Objective-Cでは、トランポリンは、送信されたすべてのメッセージをキャプチャして具体化し、それらのメッセージを別のオブジェクトに「バウンス」するメソッドによって返されるオブジェクトです。たとえば、高階メッセージングなどです。[ 6 ]
- GCCコンパイラでは、トランポリンはオプションが有効な場合にネストされた関数へのポインタを実装する手法を指します。 [ 7 ]トランポリンは、ネストされた関数のアドレスが取得されたときにスタック上にオンザフライで構築される小さなコードです。トランポリンは静的リンクポインタを設定し、これによりネストされた関数は外側の関数のローカル変数にアクセスできるようになります。関数ポインタはトランポリンのアドレスになります。これにより、コードアドレスと静的リンクの両方を保持するネストされた関数に「ファット」関数ポインタを使用する必要がなくなります。 [ 8 ] [ 9 ] [ 10 ]しかし、これはセキュリティ上の理由からスタックを実行不可にしたいという要望と矛盾します。
-ftrampolines - 難解なプログラミング言語Befungeでは、トランポリンは制御フロー内の次のセルをスキップする命令です。
実行不可スタック
トランポリンの実装によっては、非実行スタック(NXスタック)が失われる場合があります。特にGNUコンパイラコレクション(GCC)では、ネストされた関数は実行時にスタック上にトランポリンを構築し、スタック上のデータを介してそのネストされた関数を呼び出します。トランポリンを使用するには、スタックが実行可能である必要があります。
GCCでは、非実行スタックとネストされた関数は相互に排他的です。プログラム開発中にネストされた関数が使用されると、NXスタックは暗黙的に失われます。GCCは、-Wtrampolinesこの状況を警告するために警告を表示します。
セキュア開発ライフサイクルを使用して設計されたソフトウェアでは、NXスタックが失われるため、ネストされた関数の使用が許可されないことがよくあります。[ 11 ]
参照
参考文献
- ^ Baker, Henry G. (1995年9月). 「CONSは議論をCONSすべきではない、パートII:チェイニーのMTAに関する見解」ACM SIGPLAN Notices . 30 (9): 17– 20. doi : 10.1145/214448.214454 . S2CID 20720831. 2016年11月11日時点のオリジナルよりアーカイブ。
- ^ a b Muller, Hans (2005年1月31日). 「GUIの制御のアサーション:コマンド、デフォルト、リソースバンドル」 . today.java.net . Trampolines . 2015年11月6日閲覧。[1]
- ^ 「トランポリン」。モノプロジェクト。2022年10月8日。
- ^ Link, Joseph M. (2001-09-01). 「組み込みシステムのためのトランポリン:割り込みハンドラのレイテンシの最小化」 . Dr. Dobb's Journal . 2018年5月27日時点のオリジナルよりアーカイブ。 2018年5月26日閲覧。
- ^ Stangvik, Einar Otto (2006年8月16日). 「C++によるWin32でのThunking」 . 2012年10月15日時点のオリジナルよりアーカイブ。
- ^ Weiher, Marcel (2004). 「Higher Order Messaging (HOM)」(PDF) . 2018年5月27日時点のオリジナルよりアーカイブ(PDF) . 2018年5月26日閲覧。
- ^ fuz (2011-11-18). 「ネストされた関数の実装」 . StackOverflow . 2016年3月29日時点のオリジナルよりアーカイブ。 2018年5月26日閲覧。
- ^ 「ネストされた関数のトランポリン」 GNUコンパイラコレクション(GCC)の使用2018 [2002] 18.11. 2018年5月27日時点のオリジナルよりアーカイブ。 2018年5月26日閲覧。
- ^ 「ネストされた関数」 . GNUコンパイラコレクション(GCC)の使用. 2018 [2002]. 6.4. 2018年5月27日時点のオリジナルよりアーカイブ。2018年5月26日閲覧。
- ^ Breuel, Thomas M. (2013). 「C++の構文クロージャ」(PDF) . 2017年12月12日時点のオリジナルよりアーカイブ(PDF) . 2018年5月26日閲覧。
- ^ Walton, Jeffrey; Manico, Jim; Wall, Kevin (2018-03-02) [2013]. 「Cベースのツールチェーンの強化」 . The Open Web Application Security Project (OWASP). 2018年5月27日時点のオリジナルよりアーカイブ。 2018年3月2日閲覧。