web-dev-qa-db-ja.com

モジュール、ライブラリ、フレームワークの違い

人気のあるプログラミングの話では、これらの用語の違いは何ですか、重複は何ですか?

欠落している関連用語はありますか?

60
jetru

これらの3つはすべて機能を提供します。

ただし、重要な違いがあります。

ライブラリjust関連機能のコレクションです。それ以上ではなく、それ以下でもありません。ライブラリの定義特性は、youが制御中であり、youがライブラリを呼び出すことです。

フレームワークの定義特性は、Inversion of Controlです。フレームワークはyouを呼び出しますが、その逆ではありません。 (これはHollywood Principleとして知られています:「電話しないで、電話します。」)フレームワークが制御されています。制御の流れとデータの流れは、フレームワークによって管理されます。

このように考えることができます。どちらの場合も、アプリケーションがあり、このアプリケーションにはコードが省略された場所に穴があり、これらの穴を埋める必要があります。ライブラリとフレームワークの違いは

  • アプリケーションの作成者、
  • 穴は何ですか
  • 穴を埋める人。

ライブラリの場合、youアプリケーションを記述し、boring詳細を省略します。詳細はlibrary

フレームワークでは、framework writerはアプリケーションを記述し、興味深い詳細を省きます。これは you記入してください。

フレームワーク自体にも退屈な詳細が含まれている場合があり、フレームワークの作成者がライブラリに記入し、作成する部分に退屈な詳細が含まれている場合があり、ライブラリに記入し、フレームワークが提供する可能性があるため、フレームワークで適切に動作するか、フレームワークと組み合わせてしばしば必要となるバンドルライブラリのセット。たとえば、Webフレームワークを使用してWebアプリケーションを記述するときにXMLジェネレーターライブラリを使用し、そのXMLライブラリーはフレームワークによって提供されるか、またはその一部である場合があります。

ただし、それはライブラリとフレームワークの間に区別がないことを意味するものではありません。区別は非常に明確です:制御の反転がすべてです。

モジュールの定義特性は、情報隠蔽です。モジュールにはinterfaceがあります。これは、提供する機能と依存する機能の両方を明示的かつ抽象的に指定します。 (多くの場合、exportedおよびimported機能と呼ばれます。)このインターフェイスにはimplementation(または実際には複数の実装)。これは、モジュールのユーザーからはブラックボックスです。

また、ライブラリは関連する機能のコレクションですが、モジュールは単一の機能のみを提供します。つまり、モジュールとライブラリの両方を備えたシステムがある場合、通常、ライブラリには複数のモジュールが含まれます。たとえば、Listモジュール、Setモジュール、Mapモジュールを含むコレクションライブラリがあるとします。

モジュールシステムを使用せずにモジュールを作成することはできますが、理想的には、モジュールを個別にコンパイルし(その概念が理にかなっている言語および実行環境用)、個別にデプロイ可能で、モジュールの構成を安全にする(つまり、モジュールを構成する必要があります)実行前に動作するか、エラーをトリガーしますが、実行時エラーや予期しない動作につながることはありません)。このためには、ラケットのユニット、標準MLのモジュールとファンクター、またはニュースピークのトップレベルクラスなどのモジュールシステムが必要です。

それでは、要約しましょう:

  • ライブラリ:関連機能のコレクション
  • フレームワーク:制御の反転
  • モジュール:明示的なエクスポートとインポートを伴う抽象インターフェース、実装とインターフェースは分離され、複数の実装が存在する可能性があり、実装は非表示
98
Jörg W Mittag

私のASCII他の答えから私が理解したことの芸術解釈:

_+-----------------------------------------------+
|  ...........................  ..............  |
|  : f1() f2()  :  f3()      :  : f4() f5()  :  |
|  :            :            :  :            :  |
|  : l1_module1 : l1_module2 :  : l2_module3 :  |
|  :            :            :  :            :  |
|  --library1-----------------  --library2----  |
|                                               |
|   application.c                               |
|                                               |
|       #include l1_module2                     |
|       #include l2_module3                     |
|                                               |
|       int main() {                            |
|           # case 'reload'                     |
|           f5();                               |
|           # case 'start'                      |
|           f1();                               |
|           # case 'stop'                       |
|           f4();                               |
|       }                                       |
|                                               |
+-----------------------------------------------+

.................................................
: FRAMEWORK_X                                   :
:                                               :
:     application start                         :
:     ...                                       :
:     application reload                        :
:     application stop                          :
:     ...                                       :
:...............................................:
_

何が起こるのですか:

  1. 開発者はlibrary1およびlibrary2をインストールして、これらのモジュール内で提供される機能を使用できるようにします。

  2. 次に、l1_module1およびl2_moduleを含めます。 (今のところl1_module2は必要ありません)。

  3. f1f2f4、およびf5の機能を使用できるようになったため、アプリケーションを作成します。

  4. ここで、彼らはいくつかのFRAMEWORK_X内でアプリケーションを使用したいので、フレームワークがアプリケーションを呼び出すことができるように、このフレームワークが必要とするインターフェースを実装する必要があります。

いくつかのメモ:

  • 実際には、alwaysフレームワークがあります。たとえば、OSはアプリケーションのフレームワークです(これがmain()を定義する理由です)!または、ブートローダーはOSのフレームワークであり、BIOSはブートローダーのフレームワークなどと言えます。
10
Alois Mahdal

フレームワークとライブラリはモジュールだと思います。モジュールはコードからインポートまたはエクスポートされるコードであるため。彼らが言うように、フレームワークはコードを呼び出し、コードはライブラリを呼び出します。いずれにせよ、モジュールが関与しています

2
Joseph Rex

私の観点からframeworkにはlibrariesが含まれ、両方ともmodulesです。

E.g。 Swift a moduleはコード配布の単一ユニットです。frameworkまたは単一ユニットとしてビルドおよび出荷されるアプリケーションです。

2
Jakub Truhlář

おおまかに言って、このように考えます。モジュールは機能のインポート可能な「原子」です。使用できるグループ化された機能の最小サブセットを定義します(機能の最小単位ではないことに注意してください。クラス(または機能によって異なります))。このアプローチでは、ライブラリはモジュールのセットになります。ライブラリの一部であるすべてのモジュールを使用せずにライブラリを使用できます。フレームワークは、ライブラリが(おそらく)依存する環境です。上記のすべてが機能するベースライン環境を構成します。

これらの用語は多少代用可能であり、これらの定義はすべての状況で常に堅実ではないことに注意してください。これは、私が出くわした一般的な使用法のいくつかの単なる解釈です。

2
Paul Sonier

ライブラリ:名前空間化/モジュール化されたコードのコレクション。

フレームワーク:フレームワークは、再利用可能なコードの一部(コンパイラー、デザインパターンなど)であり、開発者が車輪を再発明する必要がないように生活を楽にします。

モジュール:たとえばJavaScriptでは、モジュールは単なるパブリックプロパティを持つオブジェクトです。よくわかりませんが、モジュールという用語に対する一般的な答えはないと思います。

0
Ini

私の意見では、モジュールはライブラリのサブセットになり、ライブラリはフレームワークのサブセットになります。しかし、これには例外があり、特に用語モジュールに関しては、コンテキストに基づいたさまざまな解釈があると確信しています。

0
GWW

モジュール

module は、さまざまな粒度のコンポーネントである modular design の出力です。

modular programming のコンテキストでは、モジュールは、ソリューションにプログラマビリティ(通常、プログラミング言語またはハードウェア記述言語)を導入するコーディング言語で表現できるエンティティです。

一部の言語は、モジュールの概念を明示的にサポートし、言語機能として提供します。注目すべき初期のインスタンスは Modular-2 です。この機能にもかかわらず、ユーザーは、ソースファイルやソースファイルのディレクトリなど、ソフトウェア設計とプロジェクト管理の粒度が異なる規則によって、他の種類のモジュールを指定できます。組み込みの言語機能は、異なる粒度のモジュールの必要性を排除するものではありませんが、言語機能のあいまいさを避けるために、異なる用語を使用する場合があります。

他の言語ではmoduleという特定の機能を提供していませんが、ユーザーはプログラムの一部をモジュールとして指定することを選択できます。たとえば、C言語にはモジュールはありませんが、ユーザーは関数、ソースファイル、翻訳単位(ヘッダーを含むソースファイル)、または必要に応じてモジュールとしてファイルの束を指定できます。このような場合のモジュールは、ソース、ソースからのバイナリコード、またはリンケージ互換性保証が他の場所で提供されるコード、または混合コードなど、さまざまな形式のコードを使用できます。

「モジュール」の唯一の本当の制限は、モジュール設計の結果に反映する必要があるということです。そのため、モジュール内のコンポーネントは、境界を明確にするためにいくつかの類似点を共有する必要があります。モジュールは通常、ユーザーにいくつかの種類のexportedインターフェイスを提供する必要があります。オプションでimport外部プログラムコンポーネントからの依存関係があります。一部のモジュールは、他のモジュールのサブモジュールになります。

コード管理ツールは、モジュールに関連する概念を利用できます。たとえば、Gitにはサブモジュールの概念があり、これは本質的にリポジトリ内のコードのバージョン付きサブディレクトリです。

図書館

ライブラリは、いくつかのencapsulatedで使用される(サブ)モジュールのコレクションを含む(より具体的にはowning)特殊な種類のプログラムモジュールです(つまり、後で使用)方法で直接変更します。通常、ライブラリは再利用されるに設計され、不揮発性ストレージ内に展開されます。通常、ライブラリは、いくつかの安定した永続的な形式の1つまたは複数のオンディスクファイルとして提供されます。このようなライブラリは、アーカイブ、動的オブジェクト、パッケージなどと呼ばれます。外部プログラムデータベースのサポートにより、ライブラリはファイル名やその他のファイルベースのプロパティ以外の手段でも識別できます。たとえば、 [〜#〜] cli [〜#〜]ライブラリアセンブリ を提供し、 [〜#〜] gac [〜#〜]

フレームワーク

フレームワークは、コードのさまざまな事前設計された機能を含む別の特殊なプログラムモジュールです。フレームワークは、1つまたは複数のライブラリの形式で展開できます。フレームワークとプログラム内の他の種類のモジュールとの違いは、前者がいくつかの一般的な作業のほとんど完全でフリーズですが、適応性と拡張性のあるソリューションを強調しているためです。さまざまなライブラリをまとめて流themに動作させるためのグルーコードを記述する代わりに、ドメイン固有およびプロジェクト固有の問題。ただし、これにはプロジェクト全体の設計の複雑さのコストがかかります。特に、多く(すべてではない)フレームワークは、 IoC スタイルに従ってユーザーのコードを強制します。結果として、同じ種類で異なるフレームワークを慣用的かつ自然な方法でスムーズにまとめることはほとんど不可能です。 第一級の制御効果 を持つ言語を使用すると、IoCはフレームワークで明示的に要求されません。ただし、これは、フレームワークの機能を持つ通常のライブラリの組み合わせが簡単に実現できることを意味します。そのため、多くの場合、柔軟性を容易に損なう従来のフレームワークのようなプログラムモジュールを編成する必要はありません。

0
FrankHB