APIとライブラリとフレームワークは何が違うのか?
要約すると
API (Application Programming Interface)
アプリケーションから呼び出されるインターフェースそのものを指す。
ライブラリ (Library)
非公開部分と公開部分からなる。公開部分はAPIと呼ばれる。
フレームワーク (Framework)
ソフトウェアを開発するための枠組み。ライブラリなどに加え、コンパイラなどの開発ツールなども含む。
解説
API と ライブラリの違い
Web APIに代表されるAPIですが、WindowsのWin32 APIやLinuxのAPIもあります。OSのAPIはシステムコールとも呼ばれます。つまり、APIとはアプリケーションを開発する際に提供される「サービス」です。
ライブラリは、クラスや関数、メッセージ文字列などのデータを、ライブラリという単位にまとめた「データ提供の形式」です。ライブラリのうち、外部に公開され、他のアプリケーションからも利用可能な部分はAPIと呼ばれます。
「フレームワーク」という用語の定義
「フレームワーク」という用語の定義には二つの側面があります。
- ソフトウェア開発の枠組みとしての「フレームワーク」
ソフトウェア開発の枠組みとしての「フレームワーク」は、ライブラリに加え、コンパイラ、デバッグツール、ライブラリ(パッケージと呼ばれる場合もある)管理ツールなどを含んだ、大きなまとまりを指します。 - ライブラリとの対比としての「フレームワーク」
PythonやC言語の標準ライブラリに代表されるライブラリは、それらを呼び出す上位のライブラリを開発することは可能ですが、ライブラリそのものを拡張することを意識して設計されていません。それに対して.NET Frameworkの提供する基本クラスライブラリ(Base Class Library - BCL)は、あたかも基本クラスライブラリが機能拡張されたかのように、機能を追加することができます(hot spot/frozen spot)。
これらのことから「フレームワーク」とは、APIやライブラリを包含する上位概念を示す用語であると言えます。
まとめ
これらの混乱は、.NET Frameworkが「ソフトウェア開発フレームワーク」であり「クラスライブラリ」を提供し「APIを提供」しているが、Angularは「フロントエンドWebアプリケーションフレームワーク」で「クラスライブラリ」を提供するが「APIを提供」しているわけではない、などの状況が招いたものではないかと感じます。APIやライブラリは昔からあり、対象も限定的な用語ですが「フレームワーク」のような比較的新しい用語は非常に大きな包括的概念を含むため、その意味を的確かつ平易に伝えることは難しいなと、この記事を書きながら感じた次第です。
おまけ
変遷する境目と歴史
OS API(System Call)は、そもそも異なるハードウェアで同一のソフトウェアを動作させるために導入された仕組みですが、CP/MやMS-DOSは機能の呼び出し、入出力が機械語ベースで定義されていたため、ライブラリは不要でした(API≠ライブラリ)。また、PCのBIOSもx86ベースのインターフェースであるため、API≠ライブラリであると言えます。 一方、Unix/Linux、Windowsに関してはAPI呼び出しのためには、システムライブラリをリンクする必要ががあるため、現在一般的に使用されているOSではAPI=ライブラリであると言えるでしょう。
一方、フレームワークですが、同じような時代にもApple ][のWizardlyの開発に使用されたUCSD Pascalのような、フレームワークと呼べるようなシステムは存在しましたが、Wikipediaでは「処理系」として記述されています。Web全盛以前は、ライブラリ=比較的小さなもの、フレームワーク=巨大なライブラリの集まりのような印象だったと記憶していますが、Web全盛以降は、アプリケーション開発のエコシステムをフレームワークと呼ぶように言葉の定義が変遷していったと感じます。
これらのことから、それぞれの用語は、歴史と共に変遷してきたと言えるのではないでしょうか。
ソフトウェアフレームワークとアプリケーションフレームワーク
Wikipediaを見ていて、これら二つの表記に「揺れ」があると感じました。用語本来の定義であればソフトウェア⊃アプリケーションなので、ソフトウェアフレームワークはアプリケーションフレームワークを包含する用語として用いられているべきとも思われますが、どうやらそうでもないようです。詳しい方がいらっしゃいましたら、教えて頂きたいなと思います。
.NET Frameworkランタイムは「フレームワーク」なのか
Windowsには.NET Frameworkのランタイムが標準でインストールされていますが、実はランタイムと言いながらコンパイラも含まれていたりするので、Visual Studioが無くてもアプリケーションのビルドができたりするので、フレームワークと呼べる気がします。