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

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

新規登録して質問してみよう
ただいま回答率
85.48%
オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

基本情報技術者

基本情報技術者とは、経済産業省が行う国家資格「情報処理技術者試験」の区分の一つです。試験ではプログラマーやシステムエンジニアなどIT業界で働くために必要とされる基礎知識や情報処理において論理的な考え方ができるか等が問われ、企業から高い評価を獲ることができ、IT業界の入門的な資格として人気があります。

Q&A

解決済

6回答

4760閲覧

「徹底攻略 基本情報技術者教科書」(大滝みや子監修、月江伸弘著)のプログラム言語の分別は妥当か?

AmaiSaeta

総合スコア105

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

基本情報技術者

基本情報技術者とは、経済産業省が行う国家資格「情報処理技術者試験」の区分の一つです。試験ではプログラマーやシステムエンジニアなどIT業界で働くために必要とされる基礎知識や情報処理において論理的な考え方ができるか等が問われ、企業から高い評価を獲ることができ、IT業界の入門的な資格として人気があります。

0グッド

3クリップ

投稿2015/07/30 14:09

「徹底攻略 基本情報技術者教科書 平成27年度」(大滝みや子監修、月江伸弘著、インプレス刊行)という書籍で基本情報処理技術者試験の勉強をしています。次の図は、この書籍の193ページに載せられた図で、プログラム言語の体系を表しています。

プログラム言語の分別図

しかし、私は、この分類には違和感を感じます。
「スクリプト言語」は「低水準言語」「高水準言語」と並べるべき分類ではなく、高水準言語の一部を指す言葉だと理解しています。
また、JavaやC++のようなオブジェクト指向言語(C++をそう呼ぶべきかは……ここではとりあえず無視します)は「非手続型言語」というよりは、「手続型言語」の後継というか発展形ではないかと思っています。もっとも、こちらは、私がC++、Java、C#、JavaScriptあたりの「オブジェクト指向」しか知らず、OOPLの元祖だというSmalltalkの知識が無い所為かもしれませんが……

実際の所、どうなのでしょうか。この分別は正しいのでしょうか。

(因みに、同じページには「スクリプト言語」の説明として「イベント駆動型という特徴を持っている」という言及が有ります。これも、私は違うと思うのですが……)

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

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

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

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

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

guest

回答6

0

この分類には違和感を感じます。

私も違和感を覚えます。とくに高水準言語の外に
「スクリプト言語」があることの違和感が強いです。

「スクリプト言語」が「イベント駆動型という特徴を持っている」
という説明にいたっては、もはやないほうがマシに思えます。

ツリー型の分類をするなら、低水準と高水準に別れ、
高水準のうちコンパイルとインタプリタに分かれる、
くらいまでが妥当だと私も思います。


この分別は正しいのでしょうか。

正しさを求めると不毛になりやすいので別視点から答えますが、
実用上で必要になるのは、分類というより使い分けだと思います。

言語には実行速度と開発速度などのトレードオフがあって、
機械に近い言語は前者が早いが後者が遅く、
人間に近い言語はその逆になっていると。

たとえば組み込みなら、実行環境を考慮して機械に近い言語を取りますし、
(まあ最近の組み込みはJavaを使ったりしますが)
スクリプトは非プログラマのユーザが使うことを考慮して、
たとえ遅くても人間にとって分かりやすい言語を取ります。
(これも最近のV8エンジンがやたら早かったりしますが)

つまりどう分類するかより、どれを使うか、なぜ使うかが、
試験で問う意味のある問題だと思います。


JavaやC++のようなオブジェクト指向言語(略)は
「非手続型言語」というよりは、「手続型言語」の後継というか発展形

先にお断りしておくと、ここからは個人的な思考なので、
試験での正しさとか世間での多数派とは切り離してください。

オブジェクト指向は手続き型のたんなる後継や発展でなく、
パラダイムの大きな転換があったと思います。

それは機械から人間への視点の転換です。

手続きや命令は、機械の手続きや機械への命令を抽象化しています。
いっぽうオブジェクトは、人間にとっての対象や目的を抽象化しています。

もちろん、人間の現実をそのままシミュレーションするというのではありません。
DDDなどのようにドメインに注目してモデリングするのです。この区別は重要です。

それから、C++での抽象データ型が中心にあるOOと、
Smalltalkでのメッセージング中心のOOでは考えが異なります。

ただ、この話を続けても本題から外れていくでしょうし、別の機会にゆずります。

投稿2015/07/30 20:45

LLman

総合スコア5592

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

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

AmaiSaeta

2015/08/01 04:58

> オブジェクト指向は手続き型のたんなる後継や発展でなく、 > パラダイムの大きな転換があったと思います。 > > それは機械から人間への視点の転換です。 > > 手続きや命令は、機械の手続きや機械への命令を抽象化しています。 > いっぽうオブジェクトは、人間にとっての対象や目的を抽象化しています。 「処理を主と考えるか、データを主と考えるか」という事でしょうか。DDDについての知識は皆無なので、もし間違ってたら申し訳ないですが。 「機械から人間への視点の転換」という言葉で、下記のエントリを思い出しました。LLmanさんも仰るとおり、本題から外れまくりですが、興味深い考察なので紹介しておきます。 オブジェクト指向言語が流行した必然性について考える(1) - Programmer’s Log http://d.hatena.ne.jp/amapetas/20110925/1316929859
LLman

2015/08/01 05:18

>「処理を主と考えるか、データを主と考えるか」 データ中心指向(DOA)も、OOPの流れのひとつにあるとは思います。 ただ、DDDでも「ユビキタス言語」といって命名を重視していますが、 「人間にとっての分かりやすさ」がひとつ重要なポイントだと思います。 変数や関数の命名は、機械語しか読めない機械には関係ないからです。 もうひとつ、機械から人間へという流れに、 人工言語から自然言語への流れはかなり重なっていますが、 かならずしもイコールではありません。たとえばダイクストラはこう反対しています。 エドガー・ダイクストラが綴った「”自然言語プログラミング”の愚かしさについて」 http://postd.cc/on-the-foolishness-of-natural-language-programming/ 自然言語が一番良いなら、日本語プログラミングが一番分かりやすくなるはずで、 それが普及していないということは、また別の問題があるのだろうと考えます。 OOで現実をそのままシミュレーションせずモデリングするように、 自然言語もそのままでは使わず、エッセンスを抽出するのだと思います。
guest

0

基本情報処理技術者試験の教科書としては問題ないとおもいます。
javascriptはスクリプト言語であるかは問われますが、オブジェクト指向言語かは問われないからです。

さて、AmaiSaetaさんがたずねているのは、そういう話ではなく厳密な意味での話だとおもいます。
その点に関しては私も疑問があります。

まず、実行形式の話と言語のパラダイムの話を経列に分類しています。
実行形式は、低水準言語と高水準言語に別れ、高水準言語にコンパイル方式とインタプリタ方式が
あります。この点は、表と違いますが覚えやすさのためわざとだと思います。近年インタプリタ方
式の言語を実行時にコンパイルする方式は、”実行時に”という部分でまあ些細なことかもしれませ
ん。

ここから更に細かい分類をします。

また、コンパイル方式もC言語のようにマシン語までコンパイルする形式と、JavaのようにVM用の
中間言語へコンパイルする形式があります。さて、JavaのVMで実行されるPythonはさてどの分類
になるのでしょうか。(笑)

言語パラダイムに関してですが、オブジェクト指向は手続き型の発展形ではありません。
もともとの考え方がちがいますし、わかりやすい例としては、関数型言語でも、オブジェクト
を定義します。

また、C言語などは変数のポインタと、関数のポインタ両方をもっているので、バリバリの
オブジェクト指向でかけます。コーディングはかなり面倒なことになりそうですが。。。

”非手続き型言語”という呼び方は強烈に違和感を感じます。試験でそのように定義されている
のであればしかたがないのでしょうけど。

(因みに、同じページには「スクリプト言語」の説明として「イベント駆動型という特徴を持っている」という言及が有ります。これも、私は違うと思うのですが……)

これに関しては明らかに誤りですね。。。

投稿2015/07/30 18:13

iwamoto_takaaki

総合スコア2883

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

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

mie

2015/07/31 01:01

横から失礼します。 >また、C言語などは変数のポインタと、関数のポインタ両方をもっているので、バリバリの >オブジェクト指向でかけます。コーディングはかなり面倒なことになりそうですが。。。 昔(C++が一般的でなかったころ)は、Cでオブジェクト指向していました。 個人(またはプロジェクト単位)でルールを決めて行けばよいので、それほど面倒ではないですよ。 C++の方が約束事がたくさんあって、面倒というか窮屈に感じることもあります。
iwamoto_takaaki

2015/07/31 01:35

おおっ。実際にCでOOPしたことがある人の話がうかがえるとはうれしいです。 どうやってやるんだろうといろいろ考えたことがありましたが、機会にめぐまれず。。。 どんな実装か見てみたいです。
guest

0

確かに,誰もが納得するような分類ではないと思います.
しかし厳密になればなるほど,木構造が深くなり,理解の妨げにはなると思います.

またツリーにするということは,
コードの書き方では,手続き型と非手続き型,オブジェクト指向であるか,…
型の扱いについては,静的型付けと動的型付け,強い型付けと弱い型付け,…
実行の方法では,コンパイラ方式とインタプリタ方式(とハイブリット方式),
などといった分類に優先順位を付けなければならなくなります.
高水準・低水準を先に分けるくらいなら誰も文句を言わないと思いますが,
それ以降はどれから分けても泥沼になりそうです.

個人的には,スクリプト言語などとは書かずに,
プログラミング言語={低水準言語,高水準言語}
高水準言語={コンパイラ方式,インタプリタ方式}
くらいで止めた方が良いかなと思っています.

投稿2015/07/30 14:57

KenTerada

総合スコア751

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

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

0

質問文にある

「スクリプト言語」は「低水準言語」「高水準言語」と並べるべき分類ではなく、高水準言語の一部を指す言葉だと理解しています

については私も同感です。

この分別は正しいのでしょうか。

これについては、正しくない とおもいます。
コンピュータ関係の学校での試験にこの問題が出たとして、この回答ではほんどの先生は合格点をくれないとおもいます。

理由は 「スクリプト言語」,「低水準言語」,「高水準言語」という分類が不適だからです。
さらに 非手続型言語に java, c++, plolog が挙げられている事です。
java / c++ / plolog と、c / cobol を別の分類に入れるという分類軸は、私には理解できないです。

google で "プログラム言語 分類" を検索して、画像の結果を見てみました。
ツッコミところ満載の絵がたくさんでてきます。

プログラミング言語をいろんな視点で分類してみた http://atmarksharp.com/posts/programming-compare.html
では、分類軸を定めた上でいろいろ分類をしています。

wikipedia プログラミング言語 https://ja.wikipedia.org/wiki/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E#.E5.88.86.E9.A1.9E
にはこんな記載があります。

...
プログラミング言語の完全な分類法は存在しない
...
さらに事を複雑にするのは、言語は様々な観点から分類可能という点である。例えば、Javaはオブジェクト指向言語であると同時に、並行性言語でもある(言語仕様としてスレッドを複数並行して生成可能であるため)。Python はオブジェクト指向言語であると同時に、スクリプト言語でもある。
...

投稿2015/08/02 17:21

katoy

総合スコア22324

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

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

0

ベストアンサー

低水準・高水準と同じならびに「スクリプト言語」というのはありえません。分類としては間違っていると思います。明らかに観点の異なる分類を混同しているので。例えば犬の分類で、大型犬・小型犬・猟犬種と3分類にするようなものです。

JavaやC++のようなオブジェクト指向言語は「非手続型言語」というよりは、
「手続型言語」の後継というか発展形ではないかと思っています。

そうですね。私もそう思います。Cでもオブジェクト指向っぽくかけますし、逆にJavaで非オブジェクト指向っぽくかけます。その好例はPHPだと思います。

PHP5以降から一応クラスを使えオブジェクト指向言語になったとは言われますが、クラスを全く使用しない書き方も多く見かけます。なので、そこは言語の特徴というより、書き方の問題でしかないと考える方が自然だと思います。

「手続型言語」と並ぶ概念として、「関数型言語」は必ず挙げるべきだと思います。私からすると、C, Java, JavaScript, PHPはほとんど違いがないと感じますが、LISP, Haskellは概念が大きく異なります。「C, Java, LISP」の3つをを2つに分類しろと言われたら、

「手続型言語」C
「非手続型言語」Java, LISP

よりも

「手続型言語」C, Java
「関数型言語」LISP

の方が適切だと思います。

あと、関数型言語を学んだことがない人だと「オブジェクト指向言語は手続型言語ではない」という人が多いが、関数型言語も学んだことがある人だと「オブジェクト指向言語は手続型言語だ」という人が多いように感じます。

「スクリプト言語」の説明として「イベント駆動型という特徴を持っている」
という言及が有ります。これも、私は違うと思うのですが

これはひどいですね…。

投稿2015/07/31 05:37

miu_ras

総合スコア902

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

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

AmaiSaeta

2015/08/01 03:57

> 「手続型言語」と並ぶ概念として、「関数型言語」は必ず挙げるべきだと思います。 ここで問題とする範囲からは外れるので載せていませんでしたが、質問に挙げた図のページの次のページに、「非手続型言語の種類」という表が在り、そこには関数型言語としてLispが紹介されています。なので、図の 「Java, C++, Prolog など」 の部分は、あくまで「3つ例を挙げた」程度の物で、「関数型言語に全く触れていない」という事は無いです。 因みに、Lispの他にはRPG、Prolog、Smalltalk、C++、Java、SQL、JavaScript、EcmaScriptが表に載せられていました。OOPLを非手続型言語と分類するならば、(全く引っかからないとは言えないものの)まあ妥当なリストアップかなとは思います。 > あと、関数型言語を学んだことがない人だと「オブジェクト指向言語は手続型言語ではない」という人が多いが、関数型言語も学んだことがある人だと「オブジェクト指向言語は手続型言語だ」という人が多いように感じます。 それは知りませんでした。であれば、図の分別に違和感を感じたのは、私がHaskellをちょっと齧った事がある所為なのかもしれませんね。
guest

0

私は、この分類には違和感を感じます。

「基本情報処理技術者」の試験勉強をしている方が、こういう鋭い感覚を持っていることに感心しました。

「受験数学と本当の数学は違う」というのと同様かもしれませんね。
試験用の参考書として書かれたものですので、
・著者が本当にこのような認識を持って書いた
・過去問題や解答から引きうつしただけ
の2通り考えられるかと思います。
受験対策としては、この参考書を鵜呑みにせず過去問題や他の参考書と比べてみるのがよいでしょう。
(せっかく買ったのにね)

「手続型言語」の後継というか発展形ではないかと思っています。

これについては、他の方と同様です。

オブジェクト指向は、コンピュータ・ソフトウェアの歴史の中で、「データの取り扱い方、データ構造の記述の仕方」が進化してきた過程で生まれたものだと思います。

必要なデータをただ羅列する

コンピュータにとって処理しやすい形に並べる

人間が見て解りやすいように並べる

人間の思考に近づける
☆ここで生まれたのがオブジェクト指向……と私は思っています。

投稿2015/07/31 01:46

mie

総合スコア229

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

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

AmaiSaeta

2015/08/01 04:23

> ・著者が本当にこのような認識を持って書いた > ・過去問題や解答から引きうつしただけ > の2通り考えられるかと思います。 気がかりなのは正にそこで、「図の分別の認識をしているのは、この本の筆者だけなのか、或いは基本情報技術者試験での定義がそうなのか。」「そもそも、この分別に違和感を感じるのは自分だけなのか、世の大勢なのか(=自分の認識の方が間違っている可能性は無いか)」と不安になったのが、この質問を投稿した動機です。この質問に付いた回答を読むと、後者については心配しなくて良さそうなので、若干胸をなでおろしています。 > 受験対策としては、この参考書を鵜呑みにせず過去問題や他の参考書と比べてみるのがよいでしょう そうですね。まさか、何年も続いている試験の参考書で、その必要にかられるとは思いませんでしたが……
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問