20

コンピュータ言語の進化について議論するとき、Alan Kay は彼の Smalltalk の最も重要な属性の 1 つはレイト バインディングであると述べています。言語に可鍛性と拡張性を与え、不適切な結合を時間の経過とともにリファクタリングできるようにします。同意しますか?どちらかを使用できるドメインの 2 つのパラダイムのうち、早期バインディングが優勢であると思われる理由を説明する、早期バインディングの利点を補うものはありますか?

javascript、jQuery、jsext、actionscript、php、java、RoR、およびasp.netを使用したWebアプリケーションの実装に基づく私の個人的な経験(信頼できるほど広くも深くもありません)は、遅延バインディングと肥大化の間に正の相関があることを示唆しているようです割引。アーリー バインディングは、いくつかのタイプ セーフ エラーの検出と防止に役立つと確信していますが、オートコンプリート、優れた IDE、および一般的な優れたプログラミング プラクティスも同様です。そのため、リスク回避側が私の合理的な視点を回復する前に、遅延拘束側を応援していることに気付く傾向があります。

しかし、トレードオフのバランスをとる方法については、私には本当に良い感覚がありません。

4

6 に答える 6

15

高性能ソフトウェア (ゲーム、数値処理など) とパフォーマンス ニュートラル ソフトウェア (Web サイト、その他ほとんどすべて) の両方の私の経験では、レイト バインディングの大きな利点が 1 つあります。

事前バインディングには主に 2 つの利点があります。最初:

  • 実行時のパフォーマンス

は一般的に受け入れられていますが、ほとんどの場合、問題にハードウェアを投げることが可能であり、安価であるため、一般的には無関係です。もちろん、例外もあります (たとえば、実行しているハードウェアを所有していない場合など)。

事前バインディングの 2 つ目の利点:

  • 開発の容易さ

過小評価されているようです。開発者が他の人のコンポーネントで作業している大規模なプロジェクトでは、IDE は早期バインディングを読み取り、それらを使用して開発者に通知できます (オートコンプリート、ドキュメントなどを使用)。バインディングは実行時に作成されるため、これは遅延バインディングではあまり実用的ではありません。IDE がコードから構造定義を推測できる場合は、遅延バインディング言語でも可能ですが、構造は実行時に常に変更される可能性があるため、信頼性は高くありません。

開発の容易さは大きな問題です。高価なプログラマーの時間を最小限に抑えます。また、開発チームが大きくなればなるほど、その重要性は増します。遅延バインディング言語で得られる柔軟性とのバランスを取る必要があります。

于 2009-01-19T20:13:13.367 に答える
12

従来、アーリーバインディングの大きな利点はパフォーマンスにあります。レイトバインディング言語は、実行時にすべてのデータに関する型情報を保持する必要があり、コンパイル時にいくつかの最適化を行う機会を失います。ただし、コンピューターの速度が向上し、VMがオンザフライでの最適化についてよりスマートになるにつれて、この違いはそれほど重要ではなくなりました。

于 2008-12-15T04:02:48.950 に答える
4

レイトビンギングにより、実行中のシステムがそれ自体を拡張できます。たとえば、システムはオオカミについて知って起動します。時間が経過すると、Wolf(?) で evolveDomesticate() メソッドが Dog という名前の新しいクラスをスピンし、それをインスタンス化して、Dog ができました。Smalltalk は SYSTEM イメージ全体を保存するため、シャットダウンして再起動すると、Dogs は再起動後も存在します。特定のハードウェア上で実行され、メッシュ ネットワークに接続されたオブジェクトに進化すると、エコシステム全体が実際にシャットダウンされることはありません (Sun が崩壊するまでは)。これは、アラン・ケイが神になるという晩成の利点について話していたことだと思います。

于 2013-10-14T23:14:04.977 に答える
3

アーリー バインディングとレイト バインディングは、実際には言語アーキテクチャの機能です。アーリーバインディングとは、マシン命令がアドレスにジャンプしてそこから実行を開始するコードを構築できることを意味します (おそらくルックアップテーブルを介して)。レイト バインディングでは、アクセスごとにシンボルと型の参照を検索する必要があり (通常はハッシュ テーブルの検索)、言語の速度が低下します。

Java などの一部の VM ベースの言語はアーリー バインドされていますが、ネイティブ マシン コードはアーリー バインディングを直接行うことしかできません。遅延バインディングを行うには、動的言語インタープリターと同じ種類のハッシュ ルックアップを行う必要があります。レイト バインディングでは、アドレスを取得するためにコードのチャンクを実行する必要があります (これが OLE オートメーションのしくみです)。CPU が直接実行することはできません。コードを実行する必要があります。

レイト バインディングを実行するコードには、実際には、ハッシュ ルックアップ関数などに独自のアーリー バインド ブランチ ターゲットがあることに注意してください。したがって、この観点から、CPU によって直接実行されるコードにはアーリー バインディングが必要です。遅延バインディングはソフトウェアで行う必要があります。

アーリー バインディングは、さまざまなコードの最適化にも必要です。

C などのアーキテクチャは、いわば、金属に近いコードを書くのに適しています。これを行う場合、早期バインディングの側面は、言語のアーキテクチャにほとんど固有のものです。Python などの遅延バインディング言語では、遅延バインディングも固有のものです。両方を提供する言語もありますが、使用される特定の型は、実行される特定の構造に結び付けられます。

于 2009-01-06T00:55:12.543 に答える
2

制御の反転、依存性注入、ファクトリなど、不適切な結合を回避するためのより良い方法/パターンがあると思います...

でも、レイトバインディングの「使いやすい」バージョン非依存が好きです
Just use

var excel = CreateObject("Excel.Application");

遅延バインディングは、Excel.Application の種類と、それをどこから取得するかを把握します...

于 2008-12-15T12:54:40.793 に答える
-1

コンパイル時にリンクが実行されるコンパイル時バインディングは、アーリーバインディングと呼ばれます。

関数が呼び出されたときに実行中に実行される関数のリンクが遅延バインディングと呼ばれる動的バインディング

于 2011-10-16T06:14:04.470 に答える