declativeとimperativeという言葉に出くわしました。日本語の訳をググったところ、それぞれ宣言的、命令的とありました。
これらは具体的にどういった意味で、それぞれのメリット、デメリットは何なのでしょうか?
どちらか一方が良いもので、そちらを目指そうといった類のものなのでしょうか?
□宣言的
頼めば後は上手いこと求めてること結果を出してくれる
ファサード的な?
□命令的
自分でどうやって自分の求めている結果を導くかまで書く必要がある。
□メモ
どちらか一方になるというよりは、宣言的寄りであったり、命令的寄りだったり、度合いがあるもの。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/08/15 23:20
回答3件
0
ベストアンサー
ググってWikipediaを見て簡単に理解できるほど優秀な方が多いようですが、私は最初全く理解できなかったので、優秀な方が多すぎてなんか落ち込んでしまいました。
さて、命令型プログラミングでよく見られる命令的な書き方やそのメリット・デメリット、宣言型プログラミングでよく見られる宣言的な書き方やそのメリット・デメリットという話だという前提でお話します。ただ、これから述べる命令型プログラミング言語と言われている言語で宣言的な書き方ができない、宣言型プログラミング言語と言われている言語で命令的な書き方ができない、という訳ではないということを始めに述べさせていただきます。
まずもって、私は命令型プログラミング言語から学習しました。最初はJavaとかRubyとかです。その頃は宣言的な書き方というか宣言型プログラミングなんて物は知りませんでした。それらをある程度理解できるようになったのは、宣言型の中の一種で純粋関数型プログラミング言語と言われるHaskellを学んだ後です。その後、同じく関数型の中の一種で論理プログラミング言語と言われるPrologをちょっと学んでさらに理解を深めました。「宣言型とはSQLのクエリのようなもの」の一言で理解できる人達って本当にスゴイですね。私は逆に混乱して、全く理解できなかったのですから。
さて、命令型プログラミング言語の代表としてRuby、宣言型プログラミング言語の代表としてHaskellを例に取りながら、何が違うかを見に行きたいと思います。
Ruby
1x = 1 2y = x + 2 3print y
Haskell
1x = 1 2y = x + 2 3main = print y
どちらも3を出力します。一見どちらも同じに見えます。しかし、それぞれ命令か宣言かの違いがあります。違いが見えるように1行目と2行目を逆にしてみましょう。
Ruby
1y = x + 2 2x = 1 3print y
Haskell
1y = x + 2 2x = 1 3main = print y
Ruby側はエラーになってしまいましたが、Haskellは3を出力します。これが違いです。
よくわからない?それなら、Rubyを宣言的に書いてみましょう。
Ruby
1Y = -> { X[] + 2 } 2X = -> { 1 } 3MAIN = -> { print Y[] } 4MAIN[]
逆にHaskellを命令的に書いてみましょう。
Haskell
1main = do 2 x <- return 1 3 y <- return $ x + 2 4 print y
Rubyは逆になっても大丈夫ですが、Haskellは逆にするとエラーになります。
これらについて説明するととても長くなりますし、私の言葉では全て説明できる自信がありません。私が言えることは、命令型プログラミング言語と宣言型プログラミング言語をそれぞれ学び、それぞれの標準的な書き方を知って、初めて理解できるということです。たぶん、いくらここで説明しても、Wikipediaを読んだだけで理解できる天才でなければ無理だと思います。
タグで挙げられている言語は全て命令型プログラミング言語です。これらを眺めて宣言型プログラミングは理解できるようになるのは本当の天才だけです。私と同じく凡才であれば、宣言型プログラミング言語であるところの、HaskellやProlog等を学ぶ事をお勧めします。なお、ErlangやF#、LISP、Ocalm、Scala等も宣言型の一種である関数型プログラミング言語ではありますが、非純粋と言われるもので、命令的にも簡単に書けてしまうので、宣言的な書き方を学ぶという目的では最初に選択するのは避けた方が良いと思っています。
メリット・デメリットの話を忘れていましたが、私のような凡才には一言で言うのはちょっと難しいです。
投稿2017/08/16 10:19
総合スコア21739
0
命令的か宣言的かというのは、人間がコンピュータに意図を伝える方法、もう少し一般的には意図を定型的に書き下ろす方法には大きく2種類ありますよという分類です。
どういう分類かの前に、ちょっとプログラミングから離れます。
特許文書って読んだことありますか? 私も特許文書を初めて読む前には誤解していたのですが、特許文書って料理のレシピみたいなものだと思っていました。「用意したこれこれを、こうして、こうして、こうして、ああすればこんなものができあがります」、っていう。
違うんですね。特許文書は「〜〜で、〜〜が付いていて、〜〜がああなっていて、〜〜なモノ」という、全体で一個の名詞句になっている記述です。どんな長い特許でも一個の名詞句なので読点が途中に一個もないし読むのが本当にしんどいんだ⋯
料理のレシピと特許文書の違い、これが命令的な記述方法と宣言的な記述方法の違いにだいたい対応しています。
- 命令的な記述方法というのは、順番のある命令列を書き連ねることで、その最終成果物がほしい、という形で意図を表現します
- 宣言的な記述方法というのは、〜〜なモノ、という形でほしいものを記述できるようにしたものです
一長一短があることがわかります。
命令的な記述方法は命令の並べ方、つまりプログラミング次第でどんな複雑な内容でも記述でき強力です。
反面、人間の言葉で言うと何がほしいのか、というのが読み取りにくくなります。プログラムを追ってみて、ああなるほどこういうものが出てくるねと理解する必要があります。
コンピュータにとっても静的に分析しにくい記法です。実際に実行してみることが必要なのですが、プログラムである以上有限時間内に終わる保証がありませんし。
宣言的な記述方法は、こういうもの、という記述なので人間が読んだとき意図が理解しやすいです。
コンピュータにとっても静的な分析がしやすいと言えます。
では記述力が弱いのか。実はそんなことはありません。命令的な記述方法と同程度に強力な記述力を持つ宣言的な記述ルールを作れることは保証されています。
ただそんな記述力を実現するような記述ルール・文法を使い出すと読解や静的分析の困難さは一気に上がって、宣言的に書くメリットは薄まりがちです。
文字列の書式を検証するとき、文字列に条件式をあてはめて書式にあうかチェックするプログラムを書くこともできますし、正規表現を書き下ろしてチェックさせることもできます。
前者が命令的な書式ルールの記述、後者が宣言的な書式ルールの記述だと言えます。
投稿2017/08/16 04:17
総合スコア5570
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/08/17 00:01
0
宣言型プログラミング
mts10806 さんのアドバイス通り、Wikipedia を参照しました。
第1の定義によれば、ある出力を得るにあたってそれを作成する方法ではなく、出力の性質を記述することを「宣言型」と称する。一例を挙げるならば、(プログラミング言語ではないが)SQLのクエリは「どのようなデータが欲しいか」を記述するものであり、例えば具体的なB木の操作などといった「いかにしてデータベースにアクセスするか」といったことには関与しない。
私はこの説明で納得しました。
Re: hayatomo さん
投稿2017/08/16 03:18
総合スコア18189
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。