プログラミング
初心者
ライブラリ
フレームワーク

フレームワークとライブラリの違い

フレームワークとライブラリってどう違うのか?

先日、若手のOさんにライブラリを作る話をしていたら、
フレームワークとどう違うんですか?
との質問を受けました。
インターネットで調べれば、答のある話ですが、
逆にインターネット上の情報で分からなくなっている側面もあるようです。
そこを補足して説明したので、それを記録しておきます。

若手Oさんの考え

.NET Framework は、ライブラリじゃないの?

...うーん、なるほど。
確かに、.NET Framework クラスライブラリ って言葉を聞いたことあるね。

フレームワーク

フレームワークは、簡単に言うと、
「全体の処理の流れが実装されており、その中の一部の具体的な処理を自分で実装して、はめ込めるようになっているシステム」
のこと。
はめ込めるようになっている箇所をホットスポットと呼んだりします。

分かりやすかったのは、
ソフトウエアのフレームワークとはなにか
http://itpro.nikkeibp.co.jp/article/lecture/20070205/260697/
の図1。
詳細はこのページに書いてあったので、しっかりと知りたい人は参照してください。

具体例を検索したところ、
プラグイン・フレームワーク構造型POSパッケージ「NSW-GADGET STORE」
http://www.nsw.co.jp/solution/detail.html?ssid=gadget_store
があった。
私から見るとこれぞ、こてこての、ザ・フレームワークという印象。
フレームワークの図があるので、見てもらうと、具体的なフレームワークのイメージが分かりやすい。

Javaフレームワークで有名なものに、Strutsがある。
Wikipediaの説明をよくみると「Webアプリケーションフレームワーク」とある。
つまり、Webアプリケーションとして機能する枠組みシステムを提供するので、
その中に、ロジックを埋めることでWebアプリケーション構築が楽になるということ(だと思う。使ったことないので...)。
こてこてのフレームワークと比べると、ホットスポットの範囲が広すぎて漠然とした印象が強い。
ただ、フレームワークだとは思う。

また、.NET Frameworkもフレームワークだから調べてみると、
マイクロソフト公式解説書『プログラミング.NET Framework 第4版』のP(7)に

ある意味で、.NET Frameworkそのものがオペレーティングシステムです。

と書いてある。
オペレーティングシステムっぽいフレームワーク、と言われてしまうと、
フレームワークってなんだ? と思ってしまうのも頷ける。
(実は、かなり抽象度の高いフレームワークってことなのだけれど。)
いずれにせよ、
ただ.NETでプログラミングしているだけの人から見たら、フレームワークって感じないよな、
と思います。

ライブラリ

ライブラリは、使いたい部品が入っている道具箱。
一番簡素でイメージが分かりやすいのが、
C言語標準ライブラリ
https://ja.wikipedia.org/wiki/%E6%A8%99%E6%BA%96C%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA

これを見て分かるのは、フレームワークみたいな全体を動かすためのロジックがないということ。
ただの部品の集まり。

C言語はクラスがない言語なので、再利用可能な関数の集まりが、ライブラリ。
C#のようにクラスのある言語で、再利用可能なクラスをまとめたものが、クラスライブラリ。

ライブラリとクラスライブラリの違い

ちなみに、.NET Framework クラスライブラリは、
.NET Framework上で使うための クラスのライブラリ
「フレームワーク = クラスライブラリ」ではない。

まとめ

改めて調べてみると、2017年現在、
いわゆるこてこてのフレームワークではなく、
ホットスポットの見えないフレームワーク & そこで使うためのライブラリのセットに、
フレームワークという名前がついているケースが当たり前みたいで、
20~30歳くらいの人には、フレームワークとライブラリの違いが分かりにくいのだろうな、
ということが分かりました。

単に、フレームワークとライブラリの定義を調べるだけではなくて、
なんで混乱しているのかを考えてみると良いかもしれませんね。

フレームワークという言葉が示すもの自体が、時代によって変わってゆくことはあるとは
思うのですが、その根源が何を示しているのかを忘れては、
せっかくのフレームワークという言葉の意味が失われてしまい、
過去の人たちの思慮深い知識が失われてしまうと、私は思います。
従来よりも幅広い意味でフレームワークという言葉が使われるとしても、
そこは失ってほしくないと思います。