手続き型プログラミング、
関数型プログラミング、
宣言的プログラミング、
命令型プログラミング。
世の中にはたくさんのXXX型プログラミング、YYY的プログラミングという言葉があり、
新しいのが出てくるのは良いけれどどういう方向に進んでいるのか見えないとつらいよなと思って調べていました。
点と点がつながっていかないと理解も浅くなるので、そのための整理でもあります。
命令型プログラミング
- 手続き型
宣言型プログラミング
- 関数型プログラミング
- 論理型プログラミング
事実と規則,そして質問の3つで構成で論理が構成される。
Prologが良い例である。自然言語処理などのAI分野では、今はPythonがメジャーだが、Prologがメジャーな時代もあった。
SQLも論理型プログラミングである。
SQLをPrologで書き換えることが可能かという調査もあった。
https://core.ac.uk/download/pdf/59180865.pdf
DeepLearningとPrologを組み合わせるというアイデアもあり、今後論理型プログラミングが再燃する可能性は全然あるんじゃなかろうか。
https://qiita.com/sym_num/items/2e676275be838b5aaf79
- 制約型プログラミング
考えられたきっかけとして、論理プログラミングに制約をつけて制約論理プログラミングがある。実はこちらが起源。
これはちょっとわかりやすかった。
http://www.math-model.co.jp/Scheduling_sympo_2008_Tutorial_Doc.pdf
1円と5円と10円を合計10枚もっている。それぞれは2枚以上である。 合計金額は100円である。
それぞれの硬貨を何枚もっているか?
これを数式で書くと
x ∈ { 2..6 }
y ∈ { 2..6 }
z ∈ { 2..6 }
x + y + z = 10
x + 5y + 10z = 100
を満たすx, y, zを求めよ。
例えばこのような宣言的プログラミングで表せる。
define x = [2,3,4,5,6]
define y = [2,3,4,5,6]
define z = [2,3,4,5,6]
calc x + y + z = 10
calc x + 5y + 10z = 100
resolve(x, y, z) # => {
情報が混じる原因
関数型プログラミングと命令型プログラミングが絶妙に調和された新しい言語を作りました。
https://www.ruby-lang.org/ja/about/
こういうのが原因ともいえる。
階層構造化された概念は把握しやすいが、階層化されてない概念は理解が難しい。(点と点が交差するため)
宣言的プログラミングは何が良いか?
論理的プログラミングでは、変数やループ処理の記載がいるため、実装時にミスが起きやすい。
一方、宣言的では必要な情報のみを書くので、記載量が圧倒的に少なく、ミスしづらい。
宣言的プログラミングでは変数の作成やループ処理などはブラックボックス化しているのである。
そのため、慣れればより直感的にかけるようになると言えるだろう。
言い換えると、処理の流れ(制御構造)は勝手にプログラミングエンジンが対応してくれるというわけである。
prologとかlispとかの宣言的プログラミング言語はあったのに、なぜ今はRubyやPython,Javascript、goやrustが主流なのか
「swiftやkotlinが乗ってねーのなんで?」みたいなのあると思いますが、あくまで今使われている言語の例なのでそこはスルーしてください。
ひとえに、性能やユーザーインターフェースの完成度がよくなかったからじゃないですかね。
でも、今は音声プログラミングというネタもあるよう。
探してみるとけっこうネタがあるもの。
http://書物の回想.コム/archives/10568#AI
人類は今もこの方向性の抽象化を頑張っているわけですね。
これ達成した瞬間、よほどの性能を求める物でない限りはこれで実装できるようになるわけですよね。
現実的には、音声レベルでプログラミングコードを書くのは大変そうですが、SaaSの組み合わせでNo Code的にシステムを音声で構築する世界はありうるのかもしれません。
マイクロサービスとかコンポーネント指向という部分がつながってきそうですね。
一方で、現在は手続き型と宣言的プログラミングの中間のバランスを模索しているともいえます。
SQLなんかはまさに理想と現実のバランスをとった、言語と言えますよね。
PrologとSQLは動作原理的にはほとんど同じという記事もあります。
一階述語論理という部分が同じみたいですね。
そう理解すると、論理型プログラミングは学ぶ価値のないものではなく、恩恵を授かれるものと言って良いと思います。
まとめ
自分はプログラマーとして社会人になってからもう7年ぐらいたっている気がしますが、その経験値にこだわりすぎずに時代の潮流を理解するのも大事だなと考えています。
むしろ、プログラミングという具体例によって学んだ知識や考え方、そして思考回路は応用がきくものです。ソフトウェアの設計や開発マネジメント、開発手法やサービス開発においては様々な知恵と工夫がつまっているので、役に立たないことはないでしょう。
少なくとも、手を動かすだけでなく、「どうすればより良いか」を模索し、概念の抽象化やメタ思考ができれば応用が易いものじゃないかなと思っています。
プログラミングは本気を出せばまじで難しい領域です。その領域で取り組んだことは無駄にはならないでしょう。
プログラミングが実験と試行錯誤を繰り返しながら新たな未来を開拓していくツールである限り、その学びが無駄になることはないはずです。
それでも、ダーウィンのいう「種の起源」のように、「変化に最も対応できる生き物が生き残る」というのは同じく無視できない考えでもあるので、時代の変化はきっちり把握しておこうかなと。
コメント