束縛またはバインディング(英: Binding)とは、情報工学において、より大きく複雑で頻繁に使われる何かへの単純な参照の生成を意味する。単純な参照を大きなものを反復する代わりに使うことができる。束縛とはそのような参照を指す。また、そこから転じて、何らかの「関連付け」を束縛またはバインディングと称する。
目次
1 言語束縛
2 名前束縛
2.1 定義時
2.2 再束縛とミューテーション
3 コマンドバインディング
4 関連項目
//
言語束縛または言語バインディング(Language binding)とは、ライブラリやOSサービスのAPIが特定のプログラミング言語向けに提供されていることを指す。
多くのライブラリは、C言語やC++などのシステムプログラミング言語で書かれている。そのようなライブラリをJavaのような高級言語で使うには、そのライブラリのJavaバインディングなどが作成されなければならない。
ライブラリの言語束縛を各種用意するのは、ソフトウェアの再利用のためであり、ライブラリそのものを複数の言語で作成するよりも効率的である。また、システム言語と同じ機能を高級言語で記述できないためという場合もある。
名前束縛(Name binding)とは、値を識別子に対応付けることを意味する。値に束縛された識別子を、その値への参照と呼ぶ。コンピュータ自体には識別子という概念は存在しないため、機械語レベルでの束縛は存在しない。つまり、名前束縛はプログラミング言語による抽象化の一種である。束縛とスコープには密接な関連があり、スコープによって束縛がどの時点で発生するかが決定される。
識別子の束縛のためにその識別子がプログラム内に出現する箇所を「定義」と呼ぶ。それ以外の箇所でその識別子が出現する場合、その識別子は束縛済みであり、値への参照として使用されていると見ることができる。
静的スコープにおいては、名前束縛はプログラム実行前に行われる。これを静的束縛と呼ぶ。動的スコープにおいては、名前束縛はプログラム実行中に動的に行われる。これを動的束縛と呼ぶ。
静的束縛の例として、C言語での関数コールがある。C言語では、識別子によって参照される関数を実行時に変更することはできない。動的束縛の例としては、C++の仮想メソッド呼び出しがある。ポリモーフィズムの方式によっては、実行する前にオブジェクトを決定することはできないため、実行すべき関数は動的に束縛される。例として次のような Java コードを挙げる。public void foo(List<String> list) { list.add("bar");}
ここでの list は、LinkedList への参照かもしれないし、ArrayList への参照かもしれない。また、List の何らかの派生型かもしれない。add によって参照されるメソッドは、実行時まで確定できない。C言語などでは、実際の関数が実行前に確定できる(あくまでも名前束縛の話であって、関数ポインタを使った技法はここでは無関係である)。
コンパイルされたプログラムはメモリ上でリロケータブル(再配置可能)であることが多い。従って、メモリ参照は基本的に動的束縛である。各変数や関数への参照は、何らかのベースアドレスからのオフセットで示され、実行時までそのアドレスは確定できない。これは細かい区別であるが、プログラミング言語レベルでの束縛とマシンレベルのそれとは異なる。
再束縛(rebinding)とミューテーション(mutation)とは異なる。再束縛とは、参照している識別子を変化させることであり、ミューテーションとは、参照されている値を変化させることである。次のような Java コードを見てみよう。LinkedList<String> list;list = new LinkedList<String>();list.add("foo");list = null;
識別子 list は当初何も参照していない(nullを参照している)。そして、あるオブジェクト(文字列の連結リスト)に再束縛される。次に、この list から参照されている連結リストに対するミューテーションとして、文字列が追加される。最後に list は null に再束縛される。
コマンドバインディングまたはキーバインディングとは一般に、アプリケーションソフトウェアで上級者向けに提供されるキーボードマクロや、機能とキーの関連付けを指す。多くの場合、バインディングは変更や追加が可能だが、削除はできない(つまり、キー押下の組合せと機能の関連付けをなくすることはできない)。
コマンドバインディングの例として、Mac OS の多くのアプリケーションでは、セーブ動作にショートカットキー Command-S が関連付けられており、GUIによるメニュー操作なしでセーブ機能が使えるようになっている。Emacs では "save-buffers-kill-emacs" コマンドが Ctrl-X Ctrl-C という一連のキー押下に対応しており、セーブして終了するというよく使う機能に対して毎回 "save-buffers-kill-emacs" と入力する必要がない。Microsoft Excel のようなアプリケーションでは、一連の操作をマクロとして生成でき、それを起動する簡単なコマンドとバインディング可能である。
コンピュータゲームにも同様のバインディングは存在する。例えば、「撃つ」という動作を任意のキーに関連付けるのもバインディングである。反射神経が必要なゲームでは、コントローラの各ボタンへの機能割り当てをユーザーがカスタマイズできることが多い。
この「束縛 (情報工学)」は、ソフトウェアに関連した書きかけです。
関連項目
プログラミング
コマンド
オブジェクト
XMLデータバインディング
これは便利!
本屋の在庫も探せます