JAVAのオブジェクト指向を勉強・練習している者です。
説明が下手ですいませんが、「スッキリわかるJava入門 第2版 (スッキリシリーズ) 」の(P281)「手続き型プログラミングとの違い」のところを復習を兼ねて読み直しているのですが、「手続き型プログラミング」とは
コンピュータがどのように動けばよいかという手順を考え、プログラムの先頭から順番に命令として記述していく方法です。
と書かれているのですが、JAVAも、同じようにプログラムの先頭から順番に命令として記述していき、実行していくと私は思うんですが、(違っていたらすいません)オブジェクト型プログラミングと手続き型プログラミングは厳密には何がどう違うのでしょうか?
又、オブジェクト型と手続き型ではコンピュータ上ではどう動くのですか?
例えばオブジェクト型はコンピュータ上ではクラスのソースコードをコンピュータのメモリ上に展開するのですが、手続き型はコンピュータ上ではどう動くのでしょうか?
わかりやすく教えてくれませんか?
よろしくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答5件
0
「オブジェクト指向型言語」と「手続き型言語」の区分は、論者によっても違ってきます。
- 言語として「メソッド」が登場しない、C言語のような言語だけが手続き型言語
- メソッド以外の関数・コードが書ける、PHPやC++のような言語も手続き型言語に含まれる
- Javaのような、「メソッドの中身を手続き型で書いていく」言語も手続き型言語に区分する
Javaの場合、すべてのコードは何かしらのメソッドとしてオブジェクトに属させるしかありませんが、メソッド内部では実行することを順に書いていくという、手続き型の概念で成立しています。
一方で、「手続き型でない」プログラミングパラダイムとしては、以下のようなものがあります。
- 副作用のない関数を組み合わせてプログラムを構築する「関数型言語」
- 解が満たすべき条件だけを与えて、実際の算出はエンジンに任せる、「制約型言語」(SQLもこの部類です)
(たまに特殊なCPUがありますが)ふつうのコンピュータは「オブジェクトは何か」ということを認識できません。実際に実行する命令は「このアドレスに何を書き込む」とか「このメモリに入っているコードに飛ぶ」といった、ごく簡単な機能のものばかりです(C++のコンパイラは、オブジェクト指向で書かれたコードを、このような形に変換します)。アセンブラといって、実際の機械語を人間が読み書きしやすい形にもできますが、大きなプログラムをアセンブラで直接書くのは現実的ではありません。
一方、Javaのコードは直接マシンで実行するのではなく、Java仮想マシンの上で動きます。この仮想マシンはオブジェクトの概念を理解して動作します。
投稿2017/04/15 08:33
総合スコア145930
0
こんにちは。
Javaのクラスはメソッド(関数の一種)を持っています。
そして、関数は「その関数がどのように動けばよいかという手順を考え、関数の先頭から順番に命令として記述していく方法です。」
つまり、関数=手続き型プログラミングと言っても良いです。
一般に関数は何らかのデータを取り扱います。そして、複数の関数が1つのデータの塊を操作することにより、何らかの機能を実現することは多いです。(良く出てくる例では、線形リストやソートなどなど)
それらをひとかたまりとしてプログラミングすることが「オブジェクト指向型プログラミング」の本質と思います。関数=手続きだけでなくデータ構造もセットにするという考え方です。(人によって捉え方は異なります。もう少し様々な機能を使わないとオフジェクト指向とは言えないと言う人もいるかも知れません。)
そして、C言語のような手続き型言語でも、データ領域の獲得と初期化、その領域の解放、それぞれのデータを使って駆動する関数群を定義することはできますし、やっている人は多いです。メジャーなものではlinuxのカーネルなど。
しかし、それらをまとめるための統一的な方法がなく、プリフィックス等の付け方を決めてプログラマが個別に用意します。その実現方法も様々な方法があるので、様々な仕組みが存在しメンテナンスする人はたいへんです。
これに対して、データ構造と関数をまとめてクラスとして定義し、一貫した方法で記述できるような支援のある言語がオブジェクト指向型言語です。そして、現代の多くのオブジェクト指向型言語の考え方はかなり似通っているので、1つのオブジェクト指向型言語を学べば、その知識を他の同様な言語に活かしやすいです。
投稿2017/04/15 08:43
総合スコア23272
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
ベストアンサー
オブジェクト指向と手続き型は相反するものではありません。大雑把に述べれば、オブジェクト指向プログラミングはマクロな考え方、手続き型はミクロな考え方のプログラミングです。
javaでもすべての処理をMainメソッド内に記述しても文法上の誤りはないです。ただし、こうなるともうオブジェクト志向と呼ぶより手続き型に近いものになってしまします。そもそも、オブジェクト指向言語であっても、ソースを書き下す過程は手続き型の考え方が必要です。
逆にC言語(C++やObjective Cは含まない)の中でも、構造体とポインタを駆使し、独自ルールをチーム内で作っていけばオブジェクト指向に相当するプログラミングもできるはずです。
投稿2017/04/15 11:23
総合スコア4830
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/04/16 01:33
2017/04/16 03:39
2017/04/16 04:19
0
他の方も述べられているように別物って訳じゃないですね。
ある時、手続型hogehoge があらわれた。
いま、オブジェクト指向hogehoge に進化した。
って感じでしょか。
要するにできることが増えたってことスな。
個人的には間に 構造化hogehoge を入れたいところ。
こういう連綿と連なっている変化をながめると
なぜそのような形で現在に至るかが分かりやすいと思ってます。
投稿2017/04/15 14:46
総合スコア7460
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
オブジェクト指向型プログラミングと、手続き型プログラミングの厳密な違いについては、「オブジェクト指向プログラミングとは~」といった結論の出ない問いを土台にしており、回答することは難しいです。
せいぜい、Javaはオブジェクト指向型、Cは手続き型、のようにプログラミング言語で「やんわり」理解するのがよいでしょう。
オブジェクト型と手続き型ではコンピュータ上ではどう動くのですか?
この問いに対しての直接的な回答は「コンピュータ上での動きに違いはない」です。
現行のコンピュータはすべてノイマン型コンピュータであり、その動作はプログラム言語の違いによってなんら影響を受けません。
オブジェクト型はコンピュータ上ではクラスのソースコードをコンピュータのメモリ上に展開する
コンピュータのメモリ上にどのようにプログラムを展開するかは各言語のコンパイラなりに依存しており、オブジェクト指向型だから~といった決まりはありません。
オブジェクト指向型とか手続き型とは、プログラムを作る上での方法論のことです。
なので、最初のステップとしては Java 言語でプログラミングをしているのであれば(とりあえず)オブジェクト指向型でプログラムを組んでいると考えて先に進めばよいでしょう。
投稿2017/04/15 09:59
総合スコア938
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。