ライブラリ・フレームワークの創り方

ライブラリを創るには、大きく分けて、２軸でそれぞれ２つの方法がある。
ライブラリ、フレームワークの設計者の目的と目標を知るとよい。
設計者の目的、目標を知らずに、設計者のエゴだとか言う人がいると笑っちゃう。

よいライブラリ、よいフレームワークは、当初作った設計者以外が使っても便利だから普及する。
設計者のエゴは、ライブラリ、フレームワークの分岐で吸収できる。

特定の人向けの機能などは、自動生成したり、抽出したりすればよい。

大事なのは、最初に設計する人の目的と目標。
時代が変わり、OS、言語、通信規約が変われば、ライブラリ、フレームワークの移植、書き換えをすればよい。

フレームワークが難しいのではない。
フレームワーク設計者と、自分とが作りたいものが違うかもって考えて、
自分が作りたいものに合うフレームワークを選ぶか、移植するか、自分でつくればよい。

既存のライブラリ、既存のフレームワークを使うことを目的とした考察はここでは主題としない。
既存のライブラリ、既存のフレームワークを移植したり、追加・削除したりする活動は主題に含める。

# ライブラリ
## 抽象度
### 下から(Bottom Up)
よく使いそうな具体的な関数をまず一つ作ってみる。
同じ規模・粒度の関連関数を体系的に作ってみる。
この段階では、実際に使う可能性の有無を検討しなくてもよい。
どんどん作ってみて、関数が100個くらいになったら、作っているライブラリを利用したアプリを１０個くらい作ってみる。

Profilerなどで、どの関数をどれくらい呼んだとか、どの関数にどれくらい時間がかかっているかのデータを集める。
よく使う関数は、時間もしくは空間の最適化を検討してみる。
２つに分けるか、２つを１つにするかの検討もしてみる。

関数の呼び出し順番にある類型があれば、より抽象的な関数を作ってみる。
ライブラリを利用しない部分の共通な処理があれば、関数にしてみる。

どんどん作ってみて、関数が200個くらいになったら、作っているライブラリを利用したアプリをさらに１０個くらい作ってみる。

１００個のときと同じような処理をしてみて、分割、統合、追加を検討する。

最終的な関数の数、関数の呼び出し構造の深さについて目安を作り、第一版の全体像をまとめてみる。

### 上から（Top Down)

ライブラリの目的、目標に沿った、抽象的な関数を記述してみる。

関数を１０個くらい書いたら、もし、下から作った既存のライブラリがあれば、そのライブラリとの接合を検討してみる。


上から作ると、将来的に無駄なものを作りすぎる可能性があり、下から創るときの１０分の１の作業ごとに見直しをする。

## 物理層
### ゼロから
ハードウェアの機能、仕様を利用するためのデバイスドライバ群を確認し、まだ存在しなければ、ゼロから書き始める。

割り込み処理として記述するか、周期呼び出しとして記述するかは、ハードウェアの機能と、想定するアプリの性格による。

当初は、ライブラリよりもハードウェアテストフレームワークを作った方がよい場合もある。

ちょっと書いてみて、テストする手段がないと、いつ作業が終われるか目処がたたないかもしれない。

### 既存のライブラリの移植
C言語のライブラリをPascalのライブラリにラッパをかぶせて利用したように、
既存のライブラリを移植して利用するのが手っ取り早いかもしれない。

Qiitaの記事で気になるのは、ある言語のライブラリがその言語で書かれていることを前提とした記述に遭遇することがある。
PythonのライブラリをC言語で書いたり、LISPのライブラリをC言語で書いたり、高速性、小ささが大事な場合は、ライブラリを記述する言語が異なることがあることを心の片隅においておいてもらえるとありがたい。

並列処理のC言語のライブラリがFortranで書かれていたり。

C言語(C++)が必要な人と必要ない人 
https://qiita.com/kaizen_nagoya/items/2afe9e846b55b24cb6f1

自分が記述している言語が便利だからといてt、その言語のライブラリがCとかFORTRANで書かれているのに、CやFORTRANを馬鹿にする人って、プログラマって呼ばないようにするといいかもってなった。

表現は個人の自由だが、調べずに断定的に物を言うのは、確率論が支配する２１世紀では化石時代の人って呼ぼうかなって思うんです。

ある言語のライブラリを、他の言語のライブラリに移植する場合の注意点は、
たとえば、PascalとCのように配列の範囲指定ができるかどうかを、どう補完するかだろうか。

## 論理
アプリが想定する必要そうな論理から出発する。
LISPのような処理から記述するか、Prologのような宣言から記述するかは、得意な方を選んでとしか個人的にはよう言わない。

宣言から書き始めて、ある程度の規模を描いたことがない。

### 言語ライブラリ
プログラミング言語は、文法＋ライブラリで構成することがある。
C言語では、Freestanding Environmentと、POSIXライブラリも使うHosted Environmentがある。
Standard Libraryは、Hosted Environmentのライブラリである。

言語の標準的なライブラリが複数の段階に分かれている言語はいくつかある。

COBOL
https://www.ibm.com/docs/ja/i/7.4.0?topic=support-cobol-standard

### OS ライブラリ
C言語とUNIXは、AT&Tという組織で同年代に作られている。
C言語はUNIXを記述する言語でもあるし、Cコンパイラを記述する言語でもある。
C言語が持つライブラリか、UNIXが持つライブラリか、その境界に厳密で意味のある定義があるかどうかはよく調べていない。

C言語ライブラリは、UNIXのライブラリを両方から挟む(sandwitch)するように２種類に分離している。
ハードウェアの機能を抽象化するのがI/Oライブラリだとすれば、言語で持つか、OSが持つかは選択可能かもしれない。

# フレームワーク
ライブラリとフレームワークの違いは、関数だけと、関数呼び出しの仕組みがあるものの違いとしてみる。

ここでは厳密な境界を議論しない。

ツールとフレームワークの境界を議論しない。

自動生成機能を含むか含まないかを考慮しない。

フレームワークにTemplateを想定すかどうかを考慮しない。

## 機能・種類
フレームワークには、入力を文字か、図か、それ以外の何かかで違いがあるかもしれない。
出力が、Webか、通信か、制御かで違いがあるかもしれない。

機能としては、検証、妥当性確認、試験、デバッグ、品質指標計算、統計作成など、何を含むかによる。

自分が一番触ったことがあるのは、.NET Framework。
そのために記述に偏りがあるのは自覚しています。ごめんなさい。

Raspberry PI(14) & TOPPERS。docker(134)名古屋のIoTは名古屋のOSで
https://qiita.com/kaizen_nagoya/items/4c46153324a8081fe18c

Microsoftとの歴史　Basicに始まり、Cコンパイラ、Windows95、Git(9)hubまで
https://qiita.com/kaizen_nagoya/items/d7c0cc257e99de0573cf

# 関連記事
フレームワークとは
https://qiita.com/Shirosan10/items/549f86f91c955b651b59

フレームワークとは
https://qiita.com/hish_1ne/items/a9e040397cf60966aae6

久しぶりのフレームワーク
https://qiita.com/gksdyd88/items/b683d23b3b62a3d5ca18

フレームワークの学び方！なぜフレームワークは難しい？
https://qiita.com/ming_hentech/items/93242dd7329727a31856

ライブラリとフレームワーク
https://qiita.com/tako_tako/items/5ed2efc4f7fde7f59b86

Javaのフレームワークとは？代表的なフレームワークの解説
https://qiita.com/e-tak/items/3ad403b04bf79a9ead62

java フレームワーク
https://qiita.com/savaniased/items/5b000a2ab917811acc50

JavaScriptのフレームワーク
https://qiita.com/akari_0618/items/5cf08025984662974aa5

[Python] フレームワーク
https://qiita.com/Jochun/items/99375eddcde2b7739da1

【python】フレームワーク
https://qiita.com/MK32A/items/0d1f6451a3aa2c507f22

Golangのフレームワーク
https://qiita.com/GpAraki/items/7bf6c1794d50f0fc27aa

Gin フレームワーク チートシート
https://qiita.com/automatedtomato/items/6237ae0d6a29a4557f57

Gin フレームワークの基礎
https://qiita.com/y-t0910/items/31603287de48bb9d6762

PHPフレームワーク
https://qiita.com/Yujiro3/items/0f6c31b35bb41cce8bca

フレームワークとしての Kubernetes
https://qiita.com/shmurata/items/58d7b010babf6476bb79

CSSフレームワーク
https://qiita.com/giogiokuma/items/f42fed3124c953338f07

Webフレームワーク Honoとは？
https://qiita.com/TA-YO/items/8e2c9ba393f4d9996153

Hono🔥 フレームワーク基礎
https://qiita.com/y-t0910/items/ed0fec7820dc9a6a46d6

サーバ開発におけるフレームワーク
https://qiita.com/H_Stephen/items/550391b74c74d72e9c8d

SwiftUIのCombineフレームワークについて？
https://qiita.com/inoue_tips/items/b7a0fd48905fc2e382a5

ejectフレームワーク
https://qiita.com/ytsuyuzaki/items/14452d4bc6d366b11b02

MVCフレームワークって？
https://qiita.com/morikuma709/items/3e7964482414666672c8

Aura フレームワーク
https://qiita.com/Keiji_otsubo/items/f28a2f8ee39b4ad1367d

ORMフレームワークについて
https://qiita.com/takuma16/items/485d7e492013281a16e5