宣言的プログラミング
「宣言的」という用語がよくわからないのは、この言葉がカバーする範囲が広すぎるからだと思う
みんな使ってるけど、みんな別の定義で話してる、みたいな感じになってない?
「宣言的」と言えるためには、この要素は必須、みたいなのはありそう
そういうのを特徴と呼ぶのか
状態を持たない、とかそういうの
重要な点として、あくまでも相対的な指標である、というのはありそう
なので、「Aは宣言的だ」というのではなく、「AはBより宣言的だ」という方が適切
宣言的とはなにか?という問いも重要だが、
宣言的だと何が嬉しいのか?という問いも必要
可読性の高さ?
「宣言的とは、詳細のラッパー」とみなして良いのか?は気になる
最終的にプロセッサに対する命令をするところまで宣言的に書けるものなのか?
宣言的なアセンブリ言語的なものは書けるのか?
無理な気がする?
いやでも、ラムダ計算が計算モデルとして成立してることを考えるとできそうな気がするmrsekut.icon
↓は変なことを書いてる箇所がある
Declarative = What you want
Imperative = How you want
宣言型プログラミングというパラダイムの中に以下が含まれる?
副作用が含まれない?
副作用とかは関係ないのではmrsekut.icon
例
SQL
Haskell
GUIで応用したもの
etc.
宣言的プログラミングがうまくハマるのはDSL的な場所なのか? 使うドメインが決まっているので抽象化がうまくきくみたいな
内部で手続き的にごにょごにょした操作はすでに誰かが書いている
DBの開発者、Reactの開発者が手続き的に命令を書いている
それを使う人達はそのへんを意識せずに抽象を扱うことが出来る
細かいパフォーマンスチューニングとかはできないが、細かいところを気にせずに使える
ある出力を得るにあたってそれを作成する方法ではなく、出力の性質を記述することを「宣言型」
「性質」というのが何を指しているのかわからない
SQL
「具体的なBtreeの操作の手続き」ではなく、「何が欲しいか」を記述する
どういう手順で取ってくるかには口出ししない
宣言型が抽象度高い何かだということはわかってきたけど、
その抽象度のレベルってどんなもんなんだろ
極論を言えば「こういうアプリが欲しいです」って一行で書けるものが一番抽象度高い宣言じゃん
実際の宣言型プログラミングはもっと具体的なので、どのレベルを基準に取るかで「これは宣言型プログラミングだ」とも「命令型プログラミング」とも言える気もするんだが、どうなんでしょう
そうだよね、相対的な概念なんだよな
だから「宣言的」という言葉を使うときは「hogeと比較して」や、「piyoを基準にして」という前提を添える必要があるのでは?
そうじゃないと、各人の「常識的な抽象度」がズレていると、その「宣言的な旨さ」が全く伝わらない気がする
C言語はHaskellに比べれば命令的だが、アセンブリ言語に比べれば宣言的である
再帰を書くときのイメージなのかなと、一瞬思った
再帰関数を書くときは、その関数の定義の中で、未実装の自身を使用する感じで書く
例えばfibという再帰関数の定義内でfib関数を使う、fibはまだ未実装なのに使用する感じになる
Reactでもそういうイメージで、データが入っているかどうかに関わらず、こういう感じで表示する、を書く
これが宣言的と近しい感覚なのか?って思った
全然違うかもmrsekut.icon
わかるようでわからない
手続き
計算ロジックと出力(副作用)がべったり
というか混在している
出力ロジックのなかに計算ロジックがある
パフォーマンス的には良い
なんで?
テストがしづらい
IO(副作用)が絡むので?
テストは出力込みのものになる
入力と、「標準出力の出力結果」をassertする
出力ロジックと計算ロジックが混在している
for文でリストを作るのが「手続き的」
一方「宣言的」なら[1,2,3,..,9]と全部列挙してリストを作成
この記事内では他の方法としてIntStreamを使っている
これの内部実装がどういうものか知らないが、自作でIntStreamというメソッドを作ってそれを別の場所でprivateにし、その中で同じ様にfor文でリストを作成していた場合、それは宣言型と呼べるのか
for文は手続き的でmapとかは宣言的」って言える?いえない?
宣言的のほうが記述量が減っている
なんで?抽象化がうまいから?
参考