web-dev-qa-db-ja.com

フレームワーク対ツールキット対ライブラリ

フレームワーク、ツールキット、ライブラリの違いは何ですか?

297
user364846

最も重要な違い、そして実際には、ライブラリとフレームワークのdefiningの違いは 制御の反転 です。

これは何を意味するのでしょうか?それは、ライブラリを呼び出すときに、youが制御されることを意味します。しかし、フレームワークでは、コントロールが逆になります:frameworkはあなたを呼び出します。 (これは、ハリウッドの原則と呼ばれます。私たちに電話しないで、私たちはあなたに電話します。)これは、ほとんどフレームワークの定義です。 Inversion of Controlがない場合は、フレームワークではありません。 (私はあなたを見ています、.NET!)

基本的に、すべての制御フローはすでにフレームワーク内にあり、コードで埋めることができる事前定義されたホワイトスポットがたくさんあります。

一方、ライブラリは、youが呼び出すことができる機能のコレクションです。

用語ツールキットが本当によく定義されているかどうかはわかりません。 Wordの「キット」は、ある種のモジュール性、つまり、選択して選択できる独立したライブラリのセットを示唆しているようです。それでは、ツールキットが単なる独立したライブラリとは何が違うのでしょうか?統合:独立したライブラリがたくさんある場合、それらがうまく機能するという保証はありませんが、ツールキットのライブラリは一緒にうまく機能するように設計されているため、使用する必要はありませんそれらのすべて

しかし、それは本当に私の言葉の解釈に過ぎません。 areで明確に定義されているライブラリやフレームワークとは異なり、istoolkitの広く受け入れられている定義。

443
Jörg W Mittag

Martin Fowlerは Inversion of Control に関する記事でライブラリとフレームワークの違いについて議論しています。

制御の反転は、フレームワークをライブラリとは異なるものにする重要な部分です。 ライブラリは、本質的には呼び出すことができる関数のセットです。最近では通常、クラスに分類されています。各呼び出しは何らかの作業を行い、制御をクライアントに返します。

フレームワークは、より多くの動作が組み込まれたいくつかの抽象的な設計を具現化します。それを使用するには、フレームワークのさまざまな場所に動作を挿入する必要がありますサブクラス化するか、独自のクラスをプラグインします。 フレームワークのコードは、これらのポイントでコードを呼び出します

要約すると、コードはライブラリを呼び出しますが、フレームワークはコードを呼び出します。

122
Pascal Thivent

前書き

関連するコードのコレクションに関連するさまざまな用語があり、これには歴史的な(この回答の目的のために1994/5以前)と現在の両方の意味があり、特にコンピューティング/プログラミングに関する古典的なテキストを読む場合、読者は両方に注意する必要があります歴史的な時代から。

図書館

歴史的にも現在も、ライブラリは特定のタスク、またはほぼ同じレベルの抽象化で動作する密接に関連するタスクのセットに関連するコードのコレクションです。通常、それ自体には目的や意図がなく、クライアントコードで使用(消費)され、クライアントコードと統合されて、クライアントコードがタスクを実行するのを支援することを目的としています。

ツールキット

歴史的に、ツールキットはより明確な目的を持った、より焦点を絞ったライブラリです。現在、この用語は好まれなくなっており、現在の時代のグラフィカルウィジェットとGUIコンポーネントに(この著者の知る限り)ほぼ排他的に使用されています。ツールキットは、ほとんどの場合、ライブラリよりも高い抽象化層で動作し、多くの場合、ライブラリ自体を消費して使用します。ライブラリとは異なり、ツールキットコードは多くの場合、ウィンドウの構築、ウィンドウのサイズ変更など、クライアントコードのタスクを実行するために使用されます。ツールキット内の抽象化の低レベルは修正されるか、クライアントによって操作されます。禁止された方法でコード。 (ウィンドウスタイルは、修正することも、クライアントコードによって事前に変更することもできます。)

フレームワーク

歴史的に、フレームワークは相互に関連するライブラリとモジュールのスイートであり、「一般」または「特定」のカテゴリに分けられていました。一般的なフレームワークは、クロスプラットフォームメモリ管理、マルチスレッドアブストラクション、動的構造(および一般的な一般構造)などの一般的な機能を提供することにより、アプリケーションを構築するための包括的で統合されたプラットフォームを提供することを目的としていました。歴史的な一般的なフレームワーク(依存性注入なし、以下を参照)は、ほとんどの場合、C++のSTLや非OOのパッケージライブラリなどのOO言語の多態性テンプレート(パラメーター化)パッケージ言語製品に取って代わりました。言語(Solaris Cヘッダーの保証)。一般的なフレームワークは異なる抽象化層で動作しますが、普遍的に低レベルであり、同様のライブラリーはクライアントコードに依存して特定のタスクを実行します。

「特定の」フレームワークは、産業システムや初期のネットワークスタック用の「コマンドアンドコントロール」システムなど、単一の(しかししばしば広がる)タスクのために歴史的に開発され、高レベルの抽象化で動作し、同様のツールキットが実行の実行に使用されましたクライアントのコードタスク。

現在、フレームワークの定義は、ガイド原則として他で言及されているように、「制御の反転」原則により焦点を合わせて取り入れられているため、プログラムフローと実行はフレームワークによって実行されます。ただし、フレームワークは特定の出力を対象としています。たとえば、特定のOS(たとえば、MS WindowsのMFC)向けのアプリケーション、またはより汎用的な作業(たとえば、Springフレームワーク)用のアプリケーション。

SDK:「ソフトウェア開発キット」

SDKは、プログラマーがコード/コンテンツを作成および展開するのを支援するツールのコレクションです。コード/コンテンツは、特定のプラットフォームで実行するか、特定の方法で実行することを目的としています。 SDKは、クライアントコードのみが特定の方法で使用する必要があり、バイナリアセットを作成または適応してバイナリアセットを作成するバイナリツールのセット(SDKの)出力。

エンジン

エンジン(コードコレクション用語)は、カスタムコンテンツを実行するか、何らかの方法で入力データを処理するバイナリです。ゲームおよびグラフィックエンジンは、おそらくこの用語の最も一般的なユーザーであり、UDK(Unreal Development Kit)などのエンジン自体をターゲットとするSDKでほぼ普遍的に使用されますが、検索エンジンやRDBMSエンジンなどの他のエンジンも存在します。

エンジンは、常にではありませんが、多くの場合、クライアントの内部にアクセスできるのはごく一部です。ほとんどの場合、異なるアーキテクチャをターゲットにするか、エンジンの出力の表示を変更するか、またはチューニングの目的で使用します。オープンソースエンジンは、定義上、クライアントが必要に応じて変更および変更できるように開かれており、一部の所有権エンジンは完全に修正されています。ただし、世界で最も頻繁に使用されるエンジンは、ほぼ確実にJavascriptエンジンです。あらゆるブラウザに組み込まれ、JavaScriptエンジンのホスト全体があり、JavaScriptを入力として受け取り、処理してから、出力してレンダリングします。

API:「アプリケーションプログラミングインターフェイス」

私が答えている最後の用語は私の個人的なバグです:APIは、それ自体が独立して実行できる、または少なくとも必要なクライアントの介入なしにタスクを実行できるアプリケーションまたは環境の外部インターフェースを記述するために歴史的に使用されていました最初の実行後。データベース、ワードプロセッサ、Windowsシステムなどのアプリケーションは、内部フックまたはオブジェクトの固定セットを外部インターフェイスに公開し、クライアントはこれを呼び出し/変更/使用するなどして、元のアプリケーションが実行できる機能を実行できます。 APIは、APIを介して利用できる機能の量と、クライアントコードが(再)使用するコアアプリケーションの量とで異なります。 (たとえば、Word処理APIでは、クライアントコードの各インスタンスが実行されるときに、アプリケーション全体をバックグラウンドでロードする必要があります。または、リンクされたライブラリの1つだけである場合があります。一方、実行中のウィンドウシステムは、代わりに使用するクライアントコードにハンドルを渡します。

現在、APIという用語の範囲ははるかに広く、この回答内の他のほぼすべての用語を説明するためによく使用されます。実際、この用語に適用される最も一般的な定義は、APIが別のソフトウェア(APIへのクライアントコード)への契約された外部インターフェイスを提供することです。実際には、これはAPIが言語に依存し、ライブラリ、ツールキット、フレームワークなどの上記のコードコレクションの1つによって提供される具体的な実装を持っていることを意味します。特定の領域、プロトコル、たとえばAPIを見ると、一連のルールを表すより一般的な用語であるプロトコルとは異なりますが、外部インターフェイスを他のソフトウェアに公開する特定のプロトコル/プロトコルスイートの個々の実装ほとんどの場合、APIと呼ばれます。

リマーク

上記のように、上記の用語の歴史的および現在の定義はシフトしており、これは、基礎となるコンピューティングの原理とパラダイムの科学的理解の進歩、およびソフトウェアの特定のパターンの出現にまで及んでいることがわかります。特に、90年代前半のGUIおよびウィンドウシステムは、これらの用語の多くを定義するのに役立ちましたが、OSカーネルとウィンドウシステムの大規模な汎用オペレーティングシステム(Linuxなど)の効果的なハイブリッド化、および依存性注入/ライブラリとフレームワークを消費するメカニズムとしての制御の反転、これらの用語はそれぞれの意味を変更する必要がありました。


追伸(一年後)

1年以上にわたってこの主題について慎重に考えた後、フレームワークとライブラリの明確な違いとしてIoCの原則を拒否します。それはそうだと言う人気のある作家がたくさんいますが、そうではないと言う人はほぼ同数です。 IoCを使用しない「フレームワーク」が非常に多く、それが定義原則であると言っているわけではありません。組み込みまたはマイクロコントローラーフレームワークを検索すると、IoCを使用しない余剰が明らかになり、.Net言語とCLRは「一般」フレームワークの許容可能な子孫であると考えています。 IoCが定義的特性であると言うことは、私が恐れていることを受け入れるにはあまりにも硬すぎて、上記のような歴史的表現と一致するフレームワークとしてそれ自体を前進させるものを拒否します。

非IoCフレームワークの詳細については、上記のように、多くの組み込みフレームワークとマイクロフレームワーク、および言語を介したコールバックを提供しない言語の歴史的フレームワークを参照してください(OK。現代のデバイスでコールバックをハッキングできます。システムを登録しますが、平均的なプログラマーではありません)、そして明らかに、.netフレームワークです。

59
user2654834

あなたがより視覚的な学習者である場合、ここにそれを明確にする図があります:

(クレジット: http://tom.lokhorst.eu/2010/09/why-libraries-are-better-than-frameworks

58

メンザニとバラスが提供する回答 はおそらく最も完全なものです。ただし、説明はより明確に簡単に述べることができます。ほとんどの人は、これらがすべてネストされた概念であるという事実を見逃しています。だからあなたのためにそれをレイアウトさせてください。

コードを書くとき:

  • 最終的に、プログラム内で繰り返し使用しているコードのセクションを発見したため、それらをFunctions/Methodsにリファクタリングします。
  • 最終的に、いくつかのプログラムを作成した後、すでに作成した機能を新しいプログラムにコピーしていることに気づきます。時間を節約するために、これらの関数をLibrariesにバンドルします。
  • 最終的には、特定のライブラリを使用するたびに、同じ種類のユーザーインターフェイスを作成することになります。したがって、作業をリファクタリングし、汎用メソッド呼び出しからUIをより簡単に作成できるToolkitを作成します。
  • 最終的に、同じツールキットとライブラリを使用する非常に多くのアプリを作成し、この定型コードの汎用バージョンが既に提供されているFrameworkを作成しましたそのため、ユーザーが行う必要があるのは、UIの外観を設計し、ユーザーインタラクションから発生するイベントを処理することだけです。

一般的に、これは用語間の違いを完全に説明します。

57
Arkain

ライブラリは、コードプロジェクトにインポートして再利用できるパッケージにラップされたメソッド/関数のコレクションです。

フレームワークは、コードの「基盤」を提供する堅牢なライブラリまたはライブラリのコレクションです。フレームワークは、Inversion of Controlパターンに従います。たとえば、.NETフレームワークは、アプリケーションを上に構築する凝集ライブラリの大規模なコレクションです。フレームワークとライブラリの間に大きな違いはないと主張することができますが、人々が「フレームワーク」と言うとき、それは通常、アプリケーションの不可欠な部分を演じるライブラリのより大きくより堅牢なスイートを意味します。

ツールキットは、SDKと同じように考えます。文書、例、ライブラリ、ラッパーなどが付属しています。繰り返しますが、これはフレームワークと同じであり、おそらくそうするのが正しいでしょう。

それらはほとんどすべて同じ意味で使用できます。

13
Jordan Parmer

フレームワークは非常によく似ており、通常、フレームワークはライブラリよりも開発および完成度が高く、ツールキットは単純に同様のライブラリとフレームワークのコレクションになります。

本質的にはほんの少し主観的なものかもしれませんが、私ができる最高の答えについてだと思います。

5
Jake Kalstad

ライブラリ

ライブラリがすでにコード化されたコードであり、再度コード化する必要がないように使用できることは、全会一致だと思います。コードは、必要な機能を検索して独自のコードから使用できるように編成する必要があります。

ほとんどのプログラミング言語には標準ライブラリ、特にある種のコレクションを実装するコードが付属しています。これは、これらのことを自分でコーディングする必要がないという便利さのためです。同様に、ほとんどのプログラミング言語には、動的リンク、名前空間などを使用して、ライブラリから機能を検索できる構造があります。

そのため、再利用が必要な場合が多いコードは、ライブラリ内に配置するのに最適なコードです。

ツールキット

特定の目的に使用されるツールのセット。これは全会一致です。問題は、ツールと見なされるものとされないものです。固定の定義はありません、それはツールキットと呼ばれるもののコンテキストに依存します。ツールの例としては、ライブラリ、ウィジェット、スクリプト、プログラム、エディター、ドキュメント、サーバー、デバッガーなどがあります。

注意すべきもう1つのことは、「特定の目的」です。これは常に当てはまりますが、目的の範囲はツールキットの作成者に基づいて簡単に変更できます。そのため、簡単にプログラマーのツールキットにすることも、文字列解析ツールキットにすることもできます。 1つは非常に幅が広​​く、プログラミング関連のすべてに触れるツールを使用できますが、もう1つはより正確です。

SDKは一般にツールキットであり、ツールのセット(多くの場合複数の種類)を1つのパッケージにまとめようとします。

共通のスレッドは、ツールがあなたのために完全に何かをする、またはそれを手助けするということだと思います。また、ツールキットは、特定のアクティビティセットを実行または実行するのに役立つすべてのツールのセットです。

フレームワーク

フレームワークは、完全に一致して定義されているわけではありません。これは、コードを組み立てることができるものを表す包括的な用語のようです。つまり、コードの基礎となる、またはサポートする構造です。

これは、コードに対してライブラリをビルドするのに対して、フレームワークに対してコードをビルドすることを意味します。

しかし、Wordフレームワークは、ツールキットやライブラリと同じ意味で使用されることもあるようです。 .Net Frameworkは、ライブラリであるFCLと仮想マシンであるCLRで構成されているため、ほとんどがツールキットです。したがって、WindowsでのC#開発のツールキットであると考えてください。 Monoは、LinuxでのC#開発用のツールキットです。しかし、彼らはそれをフレームワークと呼びました。コードをフレーム化するので、このように考えるのも理にかなっていますが、フレームはより多くのものをサポートして保持し、あらゆる種類の作業を行う必要がありますので、これはあなたが使うべきではないという意見です語。

そして、私は、業界がフレームワークという意味に移行しようとしていると思う。ツールキットとライブラリは、「フレームワーク」の他の使用法の非常に正確な用語なので、これは良いことだと思います。

3
Didier A.

Framework:マシンにインストールされ、マシンと対話できるようになります。フレームワークがないと、プログラミングコマンドをマシンに送信できません

ライブラリ:は、特定の問題(または同じカテゴリに関連するいくつかの問題)を解決することを目的としています

Toolkit:複数の問題で複数の問題を解決できる多くのコードのコレクション(ツールボックスのように)

2
ymz

少し主観的だと思います。ツールキットが最も簡単です。使用できるクラスのメソッド、クラスです。
ライブラリとフレームワークの質問の違いは、それらを使用する方法によって異なります。私はずっと前にどこかで完璧な答えを読んだ。フレームワークはコードを呼び出しますが、一方でコードはライブラリを呼び出します。

2
Péter

他の人は、.netはフレームワークとライブラリの両方であり、使用する部分に応じてツールキットになる可能性があると指摘していますが、おそらく例が役立ちます。データベースを処理するためのEntity Frameworkは、制御パターンの反転を使用する.netの一部です。あなたはそれをあなたのモデルに知らせ、それがそれらをどうするかを理解します。プログラマーとしては、「フレームワークの心」、またはより現実的にはデザイナーの心と彼らがあなたの入力で何をしようとしているのかを理解する必要があります。一方、datareaderと関連する呼び出しは、テーブル/ビューとの間でデータをやり取りして利用できるようにするための単なるツールです。親子関係を取得してオブジェクトからリレーショナルに変換する方法を理解することは決してないでしょう。それを行うには複数のツールを使用します。ただし、そのデータの保存方法、タイミング、トランザクションなどをはるかに制御できます。

0
billpennock

Mittagからの正しい答えに関連して:

簡単な例。クラスの1つにISerializableインターフェイス(.Net)を実装するとします。ライブラリの品質ではなく、.Netのフレームワークqualityを使用します。あなたは「ミットタグが言ったように」「白い斑点」を埋めて、スケルトンを完成させます。フレームワークがコードとどのように「反応」するかを事前に知っておく必要があります。実際には.net ISフレームワークであり、ここでMittagの見解に反対します。

あなたの質問に対する完全な完全な回答は、 この本 、これは非常に良い本です(まったく「Smalltalkのため」ではありません)。

0
Dimi_Pel