late-bindingとは? わかりやすく解説

LateBinding クラス


LateBinding クラス

名前空間: Microsoft.VisualBasic.CompilerServices
アセンブリ: Microsoft.VisualBasic (microsoft.visualbasic.dll 内)
構文構文

Public NotInheritable Class
 LateBinding
public sealed class LateBinding
public ref class LateBinding sealed
public final class LateBinding
継承階層継承階層
System.Object
  Microsoft.VisualBasic.CompilerServices.LateBinding
スレッド セーフスレッド セーフ
この型の public static (Visual Basic では Shared) メンバはすべて、スレッド セーフです。インスタンス メンバ場合は、スレッド セーフであるとは限りません。
プラットフォームプラットフォーム
バージョン情報バージョン情報
参照参照
関連項目
LateBinding メンバ
Microsoft.VisualBasic.CompilerServices 名前空間

LateBinding コンストラクタ (String, Object)


LateBinding コンストラクタ


オーバーロードの一覧オーバーロードの一覧

名前 説明
LateBinding (String)  
LateBinding (String, Object)  
参照参照

関連項目

LateBinding クラス
LateBinding メンバ
Microsoft.JScript 名前空間

LateBinding コンストラクタ (String)


LateBinding フィールド


LateBinding メソッド


LateBinding メソッド


LateBinding メンバ

LateBinding データ型公開されるメンバを以下の表に示します


パブリック コンストラクタパブリック コンストラクタ
  名前 説明
パブリック メソッド LateBinding オーバーロードされます。  
パブリック フィールドパブリック フィールド
  名前 説明
パブリック フィールド obj  
パブリック メソッドパブリック メソッド
プロテクト メソッドプロテクト メソッド
参照参照

関連項目

LateBinding クラス
Microsoft.JScript 名前空間

LateBinding メンバ


ダイナミックバインディング

(late-binding から転送)

出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2023/09/11 01:52 UTC 版)

動的バインディング: dynamic binding)、遅延バインディング: late binding[1]あるいは動的リンケージ: dynamic linkage[2][3]は、コンピュータプログラミングにおいて、オブジェクトに対して呼ばれるメソッドあるいは引数を伴い呼び出される関数を、その名前に基づいて実行時に探索 (look up) するというメカニズムである。それぞれ動的束縛遅延束縛動的結合とも邦訳される。しかし、動的ディスパッチ英語版の意味でこれらの用語が使われることもある[2][4]

対義語は静的バインディング: static binding)あるいは事前バインディング: early binding)であり、コンパイル時に確定する静的なオフセット情報などをもとにして関数実体のアドレスを取得する。

概要

静的型付けのプログラミング言語において、変数や式の型はコンパイル時に確定する。関数(メソッド)の存在確認は、コンパイル時にその名前(識別子)や引数リストの型、所属する名前空間および型などに基づいて事前に検査される。プログラマによって記述された関数呼び出しを、実際に関数が実装されているコードに一致させるプロセスのことをバインディングと呼ぶ[5]

C++Javaといった静的型付けのオブジェクト指向言語では、オブジェクトの型に基づいて実際に呼び出される関数(メソッド)が実行時に選択される「仮想関数」(仮想メソッド)を使った動的ディスパッチ: dynamic dispatch)によりポリモーフィズムを実現する。コンパイル時には、所望の関数を呼び出すためのアドレス情報が(バイナリ)プログラム内に仮想関数テーブルにおけるメモリオフセットとして保持される[5][6]。実行時に格納されたメモリオフセットすなわちアドレス情報(関数ポインタ)を使って所望の関数が呼び出される。この方式は、仮想関数テーブルの構造が事前に分かっているという点で、事前バインディングの一種である[5]

遅延バインディングでは、コンパイラは仮想関数テーブルに所望の仮想関数が存在するかどうかを確認するために十分な情報を読み取らず、代わりに名前を用いて実行時にルックアップする。Component Object Model (COM) プログラミングにおける遅延バインディングの主要な利点は、コンパイラがオブジェクトの型情報を含むライブラリ(DLL)を参照する必要がないということである。名前ベースの柔軟なプログラミングが可能となることで、ライブラリのバージョン衝突に対してコンパイル処理に耐性がもたらされる[7]。遅延バインディングのデメリットとして、実行時に名前解決を試みるために、統合開発環境によるコード補完などの支援や、コンパイル時の静的な型チェック機構が働かず、実行時になって初めてプログラミングミスが発覚する可能性が高くなること、またコンパイラ最適化が働かず、オーバーヘッドが大きくなり実行速度が低下することが挙げられる[8]

動的プログラミング言語のシンボル探索は基本的に名前ベースで、実行時に解決する動的バインディング方式である。ダック・タイピングも参照のこと。

動的ディスパッチの例

C++では以下のように仮想関数を派生クラスにてオーバーライドすることで、実際に呼び出される関数の実体をオブジェクトの型に応じて実行時に選択することができる。これを動的ディスパッチと呼ぶ。

#include <iostream>

class Base {
public:
    // 基底クラスにて virtual 指定を外すと、動的ディスパッチではなくなる。
    virtual void MemberFunc() {
        std::cout << "Base::MemberFunc() is called." << std::endl;
    }
};

class Derived : public Base {
public:
    // 派生クラスでの virtual 指定の有無は、オーバーライドとは無関係。
    // C++11 規格以降は override キーワードを後置することで、正しくオーバーライドされているかどうかコンパイラにチェックさせることもできる。
    virtual void MemberFunc() {
        std::cout << "Derived::MemberFunc() is called." << std::endl;
    }
};

// Base クラスから派生していない型のインスタンスを Base& で受け取ることはできない。コンパイラの静的な型チェックによりエラーとなる。
// つまり、MemberFunc() の存在有無は静的に検証される。
void CallMemberFunc(Base& obj) {
    obj.MemberFunc();
}

int main() {
    Base b;
    CallMemberFunc(b);
    Derived d;
    CallMemberFunc(d); // Base& で受け取って MemberFunc() を呼び出しているが、実際に呼ばれるのは Derived::MemberFunc() のほう。
}

仮想関数テーブルを利用した動的ディスパッチは、前述のように事前バインディングの一種であり、真の意味での動的バインディング/遅延バインディングとは異なる。しかし、動的ディスパッチの意味でこれらの用語が使われていることもある[2]

遅延バインディングの例

VB.NETにおける遅延バインディングの例を示す。

Option Strict Off

Class SomeClass1
    Public Sub SomeMethod
        Console.WriteLine("SomeClass1.SomeMethod() is called.")
    End Sub
End Class

Class SomeClass2
    Public Sub SomeMethod
        Console.WriteLine("SomeClass2.SomeMethod() is called.")
    End Sub
End Class

Public Class LateBindingExample
    Shared Sub CallSomeMethod(obj As Object)
        ' Option Strict On を指定するとコンパイルエラーになる。
        obj.SomeMethod()
    End Sub

    Shared Function Main As Integer
        CallSomeMethod(New SomeClass1())
        CallSomeMethod(New SomeClass2())
        Return 0
    End Function
End Class

VB.NETにおけるObject型は、.NETの基本クラス型System.Object[9]であり、あらゆる型の最上位基底クラスであるが、Object型自体には上記のSomeMethodという名前を持つメソッドは定義されていない。しかし、Option Strict Offを指定することで、コンパイル時にメソッドの存在有無を確認しなくなり、実行時に探索を試みる。これが遅延バインディングである。もし該当メソッドが見つからなかった場合、実行時に例外System.MissingMemberExceptionがスローされる[注釈 1]

なお、VB.NETのコンパイラでは、デフォルトでOption Strict Offとなっており、遅延バインディングが許可されている[10]

JavaやC#ではリフレクションを使って遅延バインディングを実現することもできる。C# 4.0以降はdynamic型を使用した遅延バインディングも可能となっている[11]Visual Basic .NET (VB.NET) ではOption Strict Offによって遅延バインディングが可能である[12]

Windows APIGetProcAddress()[13]や、POSIXdlsym()[14]は、関数名の文字列に基づいてモジュール内の関数ポインタを探索する。これらを使うことで、遅延バインディングを実現することもできる。

脚注

注釈

  1. ^ 内部的にはVB.NETのコンパイラサービスによる遅延バインディング機能Microsoft.VisualBasic.CompilerServices.LateBindingが使用されている。

出典

関連項目



英和和英テキスト翻訳>> Weblio翻訳
英語⇒日本語日本語⇒英語
  

辞書ショートカット

すべての辞書の索引

「late-binding」の関連用語

late-bindingのお隣キーワード
検索ランキング

   

英語⇒日本語
日本語⇒英語
   



late-bindingのページの著作権
Weblio 辞書 情報提供元は 参加元一覧 にて確認できます。

   
日本マイクロソフト株式会社日本マイクロソフト株式会社
© 2025 Microsoft.All rights reserved.
ウィキペディアウィキペディア
All text is available under the terms of the GNU Free Documentation License.
この記事は、ウィキペディアのダイナミックバインディング (改訂履歴)の記事を複製、再配布したものにあたり、GNU Free Documentation Licenseというライセンスの下で提供されています。 Weblio辞書に掲載されているウィキペディアの記事も、全てGNU Free Documentation Licenseの元に提供されております。

©2025 GRAS Group, Inc.RSS