質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.44%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

3回答

14568閲覧

宣言的と命令的の意味、違いは?

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

3クリップ

投稿2017/08/15 22:34

編集2017/08/15 23:53

declativeとimperativeという言葉に出くわしました。日本語の訳をググったところ、それぞれ宣言的、命令的とありました。

これらは具体的にどういった意味で、それぞれのメリット、デメリットは何なのでしょうか?

どちらか一方が良いもので、そちらを目指そうといった類のものなのでしょうか?

□宣言的
頼めば後は上手いこと求めてること結果を出してくれる

ファサード的な?

□命令的
自分でどうやって自分の求めている結果を導くかまで書く必要がある。

□メモ
どちらか一方になるというよりは、宣言的寄りであったり、命令的寄りだったり、度合いがあるもの。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2017/08/15 23:01

日本語訳以外にはググらなかったのでしょうか?どちらも○○型プログラミングという名称でwikiありますが・・。
退会済みユーザー

退会済みユーザー

2017/08/15 23:20

ググりました。
guest

回答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

raccy

総合スコア21735

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/08/16 23:59

詳細なご回答ありがとうございました!読んでもよく理解出来なかったので、両方の型の言語を学んだ方が良いのでしょうね。ちなみに、宣言的、命令的というものに出くわしたのは、JavaScriptでのモジュール、ライブラリ設計の中での話でした。
m.ts10806

2017/08/17 00:00

私の場合は読んで理解できる情報がすぐ見つかるから調べてみてってことを言ったのではなくて、まず調べてから質問しましょうってところだけで、自分が完璧に理解できたわけではありません^^;
guest

0

命令的か宣言的かというのは、人間がコンピュータに意図を伝える方法、もう少し一般的には意図を定型的に書き下ろす方法には大きく2種類ありますよという分類です。

どういう分類かの前に、ちょっとプログラミングから離れます。
特許文書って読んだことありますか? 私も特許文書を初めて読む前には誤解していたのですが、特許文書って料理のレシピみたいなものだと思っていました。「用意したこれこれを、こうして、こうして、こうして、ああすればこんなものができあがります」、っていう。
違うんですね。特許文書は「〜〜で、〜〜が付いていて、〜〜がああなっていて、〜〜なモノ」という、全体で一個の名詞句になっている記述です。どんな長い特許でも一個の名詞句なので読点が途中に一個もないし読むのが本当にしんどいんだ⋯

料理のレシピと特許文書の違い、これが命令的な記述方法と宣言的な記述方法の違いにだいたい対応しています。

  • 命令的な記述方法というのは、順番のある命令列を書き連ねることで、その最終成果物がほしい、という形で意図を表現します
  • 宣言的な記述方法というのは、〜〜なモノ、という形でほしいものを記述できるようにしたものです

一長一短があることがわかります。

命令的な記述方法は命令の並べ方、つまりプログラミング次第でどんな複雑な内容でも記述でき強力です。
反面、人間の言葉で言うと何がほしいのか、というのが読み取りにくくなります。プログラムを追ってみて、ああなるほどこういうものが出てくるねと理解する必要があります。
コンピュータにとっても静的に分析しにくい記法です。実際に実行してみることが必要なのですが、プログラムである以上有限時間内に終わる保証がありませんし。

宣言的な記述方法は、こういうもの、という記述なので人間が読んだとき意図が理解しやすいです。
コンピュータにとっても静的な分析がしやすいと言えます。
では記述力が弱いのか。実はそんなことはありません。命令的な記述方法と同程度に強力な記述力を持つ宣言的な記述ルールを作れることは保証されています。
ただそんな記述力を実現するような記述ルール・文法を使い出すと読解や静的分析の困難さは一気に上がって、宣言的に書くメリットは薄まりがちです。

文字列の書式を検証するとき、文字列に条件式をあてはめて書式にあうかチェックするプログラムを書くこともできますし、正規表現を書き下ろしてチェックさせることもできます。
前者が命令的な書式ルールの記述、後者が宣言的な書式ルールの記述だと言えます。

投稿2017/08/16 04:17

yuba

総合スコア5568

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/08/17 00:01

コンピュータにhow toかwhat toのどちらで指示を出すかということなのですよね。前者はより柔軟に、でも、手間もかかるし複雑に。後者はやれることの制約は多いけど、楽ちん。
guest

0

宣言型プログラミング

mts10806 さんのアドバイス通り、Wikipedia を参照しました。

第1の定義によれば、ある出力を得るにあたってそれを作成する方法ではなく、出力の性質を記述することを「宣言型」と称する。一例を挙げるならば、(プログラミング言語ではないが)SQLのクエリは「どのようなデータが欲しいか」を記述するものであり、例えば具体的なB木の操作などといった「いかにしてデータベースにアクセスするか」といったことには関与しない。

私はこの説明で納得しました。

Re: hayatomo さん

投稿2017/08/16 03:18

think49

総合スコア18172

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.44%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問