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

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

ただいまの
回答率

90.61%

  • オブジェクト指向

    274questions

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

  • 基本情報技術者

    46questions

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

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

解決済

回答 6

投稿

  • 評価
  • クリップ 3
  • VIEW 1,868

AmaiSaeta

score 56

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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 6

+1

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

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

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

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

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

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


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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/07/31 10:01

    横から失礼します。

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

    昔(C++が一般的でなかったころ)は、Cでオブジェクト指向していました。
    個人(またはプロジェクト単位)でルールを決めて行けばよいので、それほど面倒ではないですよ。
    C++の方が約束事がたくさんあって、面倒というか窮屈に感じることもあります。

    キャンセル

  • 2015/07/31 10:35

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

    どんな実装か見てみたいです。

    キャンセル

+1

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

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

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

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


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

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

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

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

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


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

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

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


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

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

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


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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/08/01 13:58

    > オブジェクト指向は手続き型のたんなる後継や発展でなく、
    > パラダイムの大きな転換があったと思います。
    >
    > それは機械から人間への視点の転換です。
    >
    > 手続きや命令は、機械の手続きや機械への命令を抽象化しています。
    > いっぽうオブジェクトは、人間にとっての対象や目的を抽象化しています。
    「処理を主と考えるか、データを主と考えるか」という事でしょうか。DDDについての知識は皆無なので、もし間違ってたら申し訳ないですが。

    「機械から人間への視点の転換」という言葉で、下記のエントリを思い出しました。LLmanさんも仰るとおり、本題から外れまくりですが、興味深い考察なので紹介しておきます。
    オブジェクト指向言語が流行した必然性について考える(1) - Programmer’s Log http://d.hatena.ne.jp/amapetas/20110925/1316929859

    キャンセル

  • 2015/08/01 14:18

    >「処理を主と考えるか、データを主と考えるか」
    データ中心指向(DOA)も、OOPの流れのひとつにあるとは思います。

    ただ、DDDでも「ユビキタス言語」といって命名を重視していますが、
    「人間にとっての分かりやすさ」がひとつ重要なポイントだと思います。
    変数や関数の命名は、機械語しか読めない機械には関係ないからです。

    もうひとつ、機械から人間へという流れに、
    人工言語から自然言語への流れはかなり重なっていますが、
    かならずしもイコールではありません。たとえばダイクストラはこう反対しています。

    エドガー・ダイクストラが綴った「”自然言語プログラミング”の愚かしさについて」
    http://postd.cc/on-the-foolishness-of-natural-language-programming/

    自然言語が一番良いなら、日本語プログラミングが一番分かりやすくなるはずで、
    それが普及していないということは、また別の問題があるのだろうと考えます。

    OOで現実をそのままシミュレーションせずモデリングするように、
    自然言語もそのままでは使わず、エッセンスを抽出するのだと思います。

    キャンセル

checkベストアンサー

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/08/01 12:57

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

    > あと、関数型言語を学んだことがない人だと「オブジェクト指向言語は手続型言語ではない」という人が多いが、関数型言語も学んだことがある人だと「オブジェクト指向言語は手続型言語だ」という人が多いように感じます。
    それは知りませんでした。であれば、図の分別に違和感を感じたのは、私がHaskellをちょっと齧った事がある所為なのかもしれませんね。

    キャンセル

0

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

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

「手続型言語」の後継というか発展形ではないかと思っています。
これについては、他の方と同様です。

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

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

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

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

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


投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/08/01 13:23

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

    > 受験対策としては、この参考書を鵜呑みにせず過去問題や他の参考書と比べてみるのがよいでしょう
    そうですね。まさか、何年も続いている試験の参考書で、その必要にかられるとは思いませんでしたが……

    キャンセル

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 はオブジェクト指向言語であると同時に、スクリプト言語でもある。
...

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    Javaのsetterとgetterの意義について

    Javaで実装するときに、以下のようにフィールドをprivateにしてsetterとgetterを実装するということがあるかと思います。 public class Produ

  • 解決済

    占いの機能 Javaの学習中

    ただいま、Javaの初歩の本を利用し、占いの機能を製作したのですがエラーがでてしまいました。 その理由がわからないため質問させていただきたいと思います。 ソースコード publ

  • 解決済

    微動だにしません・・何を間違ったのでしょうか?

    こんにちは 今、processingを使っているのですが、参考書を見ながらうっても画像が左右に動きません。 なにか省略されているものを書いていないのでしょうか・・ もし宜しけれ

  • 解決済

    オブジェクト指向を勉強しているのですが、エラーがでます。

    Paiza.IOを使って、オブジェクト指向を勉強しているのですが、本に書いてあるプログラムを入力しても、エラーが出るのですが、どうしたら良いでしょうか? ポリモーフィズムを勉

  • 解決済

    Javaのエラー(Scanner)

    こんにちは。現在Javaを勉強中の初心者なのですが、下記のコードでエラーが出てしまいます。原因の分かる方がいましたら、ご教示いただけないでしょうか。実行環境はpaiza.ioです。

  • 解決済

    プログラミング上達する上で何をすればよいか

    私は趣味でプログラミングをしています。(本職はNWエンジニア) そもそも、自分がプログラムに興味を持ったのは機械学習を少しでもできるようになってみたいなあと思ったからです。(

  • 解決済

    開発について

    開発する際にこのような設計図を書くと思うのですが、word,excelなどどこでどのように書くのでしょうか? それとも手書きでしょうか? 主観的な意見で構いません。 ](

  • 受付中

    ER図について

    つぶやきアプリを作っているのですが、 ER図を作るとする例えばどんなものがありますか?? サンプル程度でいいので教えていただきたいです

同じタグがついた質問を見る

  • オブジェクト指向

    274questions

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

  • 基本情報技術者

    46questions

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