アーリーバインディングとレイトバインディングの違いは何ですか?


81

アーリーバインディングとレイトバインディングの違いは何ですか?



4
早い=直接関数呼び出し、遅い=関数ポインターを介した関数の呼び出しと言うのは間違っていますか?プログラマーが単純な概念を採用し、それらを実際よりもはるかに複雑に見えるようにする方法を持っていることに驚かされることは決してありません(知性のショーとして?)。プログラミングは、float型の作成方法やコンパイラーの開発などに取り掛かるまで、本質的に非常に簡単な研究分野です。
Bob Blogge 2013

回答:


57

簡単に言うと、アーリー(または静的)バインディングはコンパイル時バインディングを指し、レイト(または動的)バインディングはランタイムバインディングを指します(たとえば、リフレクションを使用する場合)。


8
しかし、遅延バインディングに関するウィキペディアの記事(en.wikipedia.org/wiki/Late_binding)には、「遅延バインディングは動的ディスパッチと混同されることがよくありますが、大きな違いがあります」と書かれています。それで、それらは同じかどうか?それらが同じである場合は、そのウィキペディアのページを変更する必要があります。
アレクサンダーバード

2
ここでは、より良いstackoverflowの答えstackoverflow.com/questions/484214/early-and-late-binding
Baggersの

18

コンパイルされた言語では、違いは明白です。

Java:

//early binding:
public create_a_foo(*args) {
 return new Foo(args)
}
my_foo = create_a_foo();

//late binding:
public create_something(Class klass, *args) {
  klass.new_instance(args)
}
my_foo = create_something(Foo);

最初の例では、コンパイラーはコンパイル時にあらゆる種類のきちんとしたことを実行できます。第二に、あなたはただその方法を使う人は誰でも責任を持ってそうすることを期待する必要があります。(もちろん、新しいJVMはClass<? extends Foo> klass構造をサポートしているため、このリスクを大幅に減らすことができます。)

もう1つの利点は、IDEがクラス定義にホットリンクできることです。これは、クラス定義がメソッド内で宣言されているためです。create_something(Foo)の呼び出しは、メソッド定義から非常に離れている可能性があります。メソッド定義を確認している場合は、実装を確認するとよいでしょう。

遅延バインディングの主な利点は、制御の反転などのほか、ポリモーフィズムやダックタイピングの特定の他の使用法(言語がそのようなものをサポートしている場合)が容易になることです。


6

http://word.mvps.org/fAQs/InterDev/EarlyvsLateBinding.htmから直接取得

自動化(またはOLEオートメーション)を使用して別のアプリケーションをプログラムで制御するには、2つの方法があります。

実行時バインディングは、CreateObjectを使用して、アプリケーションオブジェクトのインスタンスを作成し、それを制御できます。たとえば、遅延バインディングを使用してExcelの新しいインスタンスを作成するには:

 Dim oXL As Object
 Set oXL = CreateObject("Excel.Application")

一方、Excelの既存のインスタンスを操作するには(Excelが既に開いている場合)、GetObjectを使用します(アーリーバインディングとレイトバインディングのどちらを使用しているかに関係なく)。

 Dim oXL As Object
 Set oXL = GetObject(, "Excel.Application")

アーリーバインディングを使用するには、最初に、操作するアプリケーションへの参照をプロジェクトに設定する必要があります。OfficeアプリケーションのVBエディターまたはVB自体で、[ツール] + [参照]を選択し、リストから目的のアプリケーション(「MicrosoftExcel 8.0オブジェクトライブラリ」など)を選択することで、これを実行します。

アーリーバインディングを使用してExcelの新しいインスタンスを作成するには:

 Dim oXL As Excel.Application
 Set oXL = New Excel.Application

いずれの場合も、ちなみに、最初にExcelの既存のインスタンスを取得しようとすると、エラーが返された場合は、エラーハンドラーで新しいインスタンスを作成できます。


3
この返信は古く、どこか別の場所から提供されていることは知っていますが、正確ではありません。遅延バインディングはCreateObjectの使用を意味しますが、CreateObjectは必ずしも遅延バインディングを意味するわけではありません。バインディングは、オブジェクトをインスタンス化するメソッドには適用されず、オブジェクトが宣言される方法にのみ適用されます。オブジェクトを「Excel.Applicationとして」宣言する場合、どのようにインスタンス化するかは問題ではありません。私は常にCreateObjectを使用して、外部ライブラリへのオブジェクト参照をインスタンス化します。これにより、アーリーバインディングとレイトバインディングを切り替えることができ、オブジェクトを宣言する行である1行(2行ではない)を切り替えるだけで済みます。
JimmyPena 2011年

6

ハーバートシルトC ++の本からの同様ですがより詳細な答え:-

早期バインディングとは、コンパイル時に発生するイベントを指します。本質的に、早期バインディングは、関数を呼び出すために必要なすべての情報がコンパイル時にわかっている場合に発生します。(言い換えると、アーリーバインディングとは、コンパイル中にオブジェクトと関数呼び出しがバインドされることを意味します。)アーリーバインディングの例には、通常の関数呼び出し(標準ライブラリ関数を含む)、オーバーロードされた関数呼び出し、オーバーロードされた演算子が含まれます。早期バインディングの主な利点は効率です。関数を呼び出すために必要なすべての情報はコンパイル時に決定されるため、これらのタイプの関数呼び出しは非常に高速です。

初期バインディングの反対は、遅延バインディングです。遅延バインディングとは、実行時まで解決されない関数呼び出しを指します。仮想関数は、遅延バインディングを実現するために使用されます。ご存知のように、アクセスがベースポインターまたは参照を介して行われる場合、実際に呼び出される仮想関数は、ポインターが指すオブジェクトのタイプによって決定されます。ほとんどの場合、これはコンパイル時に決定できないため、オブジェクトと関数は実行時までリンクされません。遅延バインディングの主な利点は柔軟性です。遅延バインディングとは異なり、遅延バインディングを使用すると、プログラムの実行中に発生したイベントに応答できるプログラムを作成できます。大量の「緊急コード」を作成する必要はありません。関数呼び出しは実行時まで解決されないため、バインディングが遅れると実行時間が多少遅くなる可能性があることに注意してください。しかし今日、


1
「オブジェクトと関数は実行時までリンクされません」このステートメントは、実行時より前にオブジェクトが存在することを意味しているようです。オブジェクトは純粋にランタイムエンティティではありませんか?コンパイル時に存在するオブジェクトのクラス。これは、「関数呼び出しとその実装は実行時までリンクされない」とより適切に表現できます
プログラマー

遅延バインディングの1つの例は、インターフェイスまたは抽象クラスを使用し、実行時にそれにバインドするポリモーフィズム(OOP)です。
MohamadMirzadeh20年

3

インタープリター言語では、違いはもう少し微妙です。

ルビー:

# early binding:
def create_a_foo(*args)
  Foo.new(*args)
end
my_foo = create_a_foo

# late binding:
def create_something(klass, *args)
  klass.new(*args)
end
my_foo = create_something(Foo)

Rubyは(一般的に)コンパイルされていないので、気の利いた先行作業を行うコンパイラはありません。JRubyの成長は、最近より多くのRubyがコンパイルされることを意味しますが、上記のようにJavaのように動作します。

IDEの問題は依然として存在します。Eclipseのようなプラットフォームは、クラス定義をハードコーディングすると検索できますが、呼び出し元に任せると検索できません。

制御の反転は、おそらく実行時の柔軟性が非常に高いため、Rubyではそれほど人気が​​ありませんが、Railsは遅延バインディングを最大限に活用して、アプリケーションを実行するために必要な構成の量を減らします。


この点は、プラグインまたは動的フレームワークを実装するためにJITでコンパイルされ、実行時に含まれるコンポーネントを含む可能性のあるコンパイル言語にも当てはまります。これのいくつかの標準的な例はJavaに存在し、もちろんRubyとPythonにも存在します。極端な例はErlangで、ランタイムはライブアップグレード/ダウングレードのために任意のモジュールの2つのバージョンを一度にロードできます。したがって、多くのErlangコード(ほとんど?)は静的に型付けされた純粋関数として記述されていますが、実行時の要件により、実行時バインディングと動的型が内部で義務付けられています。
zxq9 2018

0
public class child()
{    public void method1()
     {     System.out.println("child1");
     }
    public void method2()
     {     System.out.println("child2");
     }

}
public class teenager extends child()
{    public void method3()
     {      System.out.println("teenager3");
     }
}
public class adult extends teenager()
{     
    public void method1()
    {    System.out.println("adult1);
         super.method1();
     }
}


//In java
public static void main(String []args)
{    ((teenager)var).method1();
}

これは印刷されます

adult1
child1

早期バインディングでは、コンパイラは子とティーンエイジャーのすべてのメソッドにアクセスできますが、遅延バインディング(実行時)では、実行時にオーバーライドされるメソッドをチェックします。

したがって、method1(子から-早期バインディング)は、実行時に大人からのmethod1によってオーバーライドされます(遅延バインディング)。ティーンエイジャーのmethod1にはmethod1がないため、子からのmethod1を実装します。

子にmethod1がない場合、メインのコードはコンパイルされないことに注意してください。


0

コンパイル時のポリモーフィズムは、同じメソッド名で動作が異なる場合、オーバーロード、早期バインディング、または静的バインディングとも呼ばれます。同じメソッドの複数のプロトタイプを実装することにより、異なる動作が発生します。アーリーバインディングとは、プログラムの最初のコンパイルを指します。しかし、遅延バインディングオブジェクトでは、ランタイムはプログラムで発生します。動的バインディングまたはオーバーライドまたはランタイムポリモーフィズムとも呼ばれます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.