束縛 (コンピュータ)

名前束縛から転送)

束縛またはバインディング: binding)は、主に「対応付け」や「関連付け」などの意味で用いられるコンピュータ用語である。コンピュータ関連で「束縛」という語が使われるものはいくつかあり、それぞれ具体的な内容は異なるので、以下いくつかの例を示す。

言語束縛

編集

言語束縛または言語バインディング (language binding) とは、ライブラリOSサービスのAPIが特定のプログラミング言語向けに提供されていることを指す。

多くのライブラリは、C言語C++などのシステムプログラミング言語で書かれている。そのようなライブラリをJavaのような高級言語で使うには、そのライブラリのJavaバインディングなどが作成されなければならない。

ライブラリの言語束縛を各種用意するのは、ソフトウェアの再利用のためであり、ライブラリそのものを複数の言語で作成するよりも効率的である。また、システム言語と同じ機能を高級言語で記述できないためという場合もある。

名前束縛

編集

名前束縛 (name binding) あるいは名前結合とは、識別子に対応付けることを意味する。値に束縛された識別子を、その値への参照と呼ぶ。コンピュータ自体には識別子という概念は存在しないため、機械語レベルでの束縛は存在しない。つまり、名前束縛はプログラミング言語による抽象化の一種である。束縛とスコープには密接な関連があり、スコープによって束縛がどの時点で発生するかが決定される。

識別子の束縛のためにその識別子がプログラム内に出現する箇所を「定義」と呼ぶ。それ以外の箇所でその識別子が出現する場合、その識別子は束縛済みであり、値への参照として使用されていると見ることができる。

定義時

編集

スコープに着目して、名前束縛を分類することがある。静的スコープにおいては、名前束縛はプログラム実行前に行われる。これを静的束縛 (static binding) もしくは早期束縛[注釈 1] (early binding) と呼ぶ。動的スコープにおいては、名前束縛はプログラム実行中に行われる。これを動的束縛 (dynamic binding) もしくは遅延束縛 (late binding) と呼ぶ。[要出典]

C++Javaなどの静的型付けオブジェクト指向言語における、仮想関数テーブルを利用した動的ディスパッチ英語版の意味で動的束縛や遅延束縛といった言葉が使われることもある。しかし、仮想関数テーブルの構造はコンパイル時に静的に確定するものであり、これは静的束縛/事前束縛の一種である[1][2][3]

Pythonなどの動的プログラミング言語や、C#/VB.NETなどの動的型付けの機能もサポートする静的型付け言語において、動的束縛や遅延束縛という用語が使われることもある[4][2]。この動的束縛は、スコープによる分類とは無関係である[注釈 2]

コンパイルされたプログラムはメモリ上でリロケータブル(再配置可能)であることが多い。従って、メモリ参照は基本的に動的束縛である。各変数や関数への参照は、何らかのベースアドレスからのオフセットで示され、実行時までそのアドレスは確定できない。これは細かい区別であるが、プログラミング言語レベルでの束縛とマシンレベルのそれとは異なる。

再束縛とミューテーション

編集

再束縛 (rebinding) とミューテーション (mutation) とは異なる。再束縛とは、参照している識別子を変化させることであり、ミューテーションとは、参照されている値を変化させることである。次のようなJavaコードを見てみよう。

LinkedList<String> list;
list = new LinkedList<String>();
list.add("foo");
list = null;

識別子listは当初何も参照していない(未初期化状態)[注釈 3]。そして、あるオブジェクト(文字列の連結リスト)に再束縛される。次に、このlistから参照されている連結リストに対するミューテーションとして、文字列が追加される。最後にlistnullに再束縛される。

コマンドバインディング

編集

コマンドバインディングまたはキーバインディングとは一般に、アプリケーションソフトウェアにおいて上級者向けに提供されるキーボードマクロや、機能とキーの関連付けを指す。多くの場合、バインディングは変更や追加が可能だが、削除はできない(つまり、キー押下の組合せと機能の関連付けをなくすることはできない)。

コマンドバインディングの例として、Mac OSの多くのアプリケーションでは、セーブ動作にショートカットキーCommand-Sが関連付けられており、GUIによるメニュー操作なしでセーブ機能が使えるようになっている。Emacsでは "save-buffers-kill-emacs" コマンドがCtrl-X Ctrl-Cという一連のキー押下に対応しており、セーブして終了するというよく使う機能に対して毎回 "save-buffers-kill-emacs" と入力する必要がない。Microsoft Excelのようなアプリケーションでは、一連の操作をマクロとして生成でき、それを起動する簡単なコマンドとバインディング可能である。

コンピュータゲームにも同様のバインディングは存在する。例えば、「撃つ」という動作を任意のキーに関連付けるのもバインディングである。反射神経が必要なゲームでは、コントローラの各ボタンへの機能割り当てをユーザーがカスタマイズできることが多い。

ソケットのバインド

編集

ネットワークソケットにおいて、ソケットのファイル記述子とローカルポート番号およびIPアドレスを関連付けることをバインドと呼ぶ[5][6]

BSDソケットではbind()関数を用いる。Winsock 1.x/2.xにも互換APIが実装されている[7][8]

脚注

編集

注釈

編集
  1. ^ 「事前束縛」とも。
  2. ^ PythonやC#/VB.NETは動的スコープをサポートせず、静的スコープ(レキシカルスコープ)のみをサポートする言語である。
  3. ^ Javaでは、フィールドに関してはコンパイラが型に応じて適切な既定値を割り当てるが、ローカル変数に関しては既定値は割り当てられない。

出典

編集

関連項目

編集