「徹底攻略 基本情報技術者教科書 平成27年度」(大滝みや子監修、月江伸弘著、インプレス刊行)という書籍で基本情報処理技術者試験の勉強をしています。次の図は、この書籍の193ページに載せられた図で、プログラム言語の体系を表しています。
しかし、私は、この分類には違和感を感じます。
「スクリプト言語」は「低水準言語」「高水準言語」と並べるべき分類ではなく、高水準言語の一部を指す言葉だと理解しています。
また、JavaやC++のようなオブジェクト指向言語(C++をそう呼ぶべきかは……ここではとりあえず無視します)は「非手続型言語」というよりは、「手続型言語」の後継というか発展形ではないかと思っています。もっとも、こちらは、私がC++、Java、C#、JavaScriptあたりの「オブジェクト指向」しか知らず、OOPLの元祖だというSmalltalkの知識が無い所為かもしれませんが……
実際の所、どうなのでしょうか。この分別は正しいのでしょうか。
(因みに、同じページには「スクリプト言語」の説明として「イベント駆動型という特徴を持っている」という言及が有ります。これも、私は違うと思うのですが……)
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答6件
0
この分類には違和感を感じます。
私も違和感を覚えます。とくに高水準言語の外に
「スクリプト言語」があることの違和感が強いです。
「スクリプト言語」が「イベント駆動型という特徴を持っている」
という説明にいたっては、もはやないほうがマシに思えます。
ツリー型の分類をするなら、低水準と高水準に別れ、
高水準のうちコンパイルとインタプリタに分かれる、
くらいまでが妥当だと私も思います。
この分別は正しいのでしょうか。
正しさを求めると不毛になりやすいので別視点から答えますが、
実用上で必要になるのは、分類というより使い分けだと思います。
言語には実行速度と開発速度などのトレードオフがあって、
機械に近い言語は前者が早いが後者が遅く、
人間に近い言語はその逆になっていると。
たとえば組み込みなら、実行環境を考慮して機械に近い言語を取りますし、
(まあ最近の組み込みはJavaを使ったりしますが)
スクリプトは非プログラマのユーザが使うことを考慮して、
たとえ遅くても人間にとって分かりやすい言語を取ります。
(これも最近のV8エンジンがやたら早かったりしますが)
つまりどう分類するかより、どれを使うか、なぜ使うかが、
試験で問う意味のある問題だと思います。
JavaやC++のようなオブジェクト指向言語(略)は
「非手続型言語」というよりは、「手続型言語」の後継というか発展形
先にお断りしておくと、ここからは個人的な思考なので、
試験での正しさとか世間での多数派とは切り離してください。
オブジェクト指向は手続き型のたんなる後継や発展でなく、
パラダイムの大きな転換があったと思います。
それは機械から人間への視点の転換です。
手続きや命令は、機械の手続きや機械への命令を抽象化しています。
いっぽうオブジェクトは、人間にとっての対象や目的を抽象化しています。
もちろん、人間の現実をそのままシミュレーションするというのではありません。
DDDなどのようにドメインに注目してモデリングするのです。この区別は重要です。
それから、C++での抽象データ型が中心にあるOOと、
Smalltalkでのメッセージング中心のOOでは考えが異なります。
ただ、この話を続けても本題から外れていくでしょうし、別の機会にゆずります。
投稿2015/07/30 20:45
総合スコア5592
0
基本情報処理技術者試験の教科書としては問題ないとおもいます。
javascriptはスクリプト言語であるかは問われますが、オブジェクト指向言語かは問われないからです。
さて、AmaiSaetaさんがたずねているのは、そういう話ではなく厳密な意味での話だとおもいます。
その点に関しては私も疑問があります。
まず、実行形式の話と言語のパラダイムの話を経列に分類しています。
実行形式は、低水準言語と高水準言語に別れ、高水準言語にコンパイル方式とインタプリタ方式が
あります。この点は、表と違いますが覚えやすさのためわざとだと思います。近年インタプリタ方
式の言語を実行時にコンパイルする方式は、”実行時に”という部分でまあ些細なことかもしれませ
ん。
ここから更に細かい分類をします。
また、コンパイル方式もC言語のようにマシン語までコンパイルする形式と、JavaのようにVM用の
中間言語へコンパイルする形式があります。さて、JavaのVMで実行されるPythonはさてどの分類
になるのでしょうか。(笑)
言語パラダイムに関してですが、オブジェクト指向は手続き型の発展形ではありません。
もともとの考え方がちがいますし、わかりやすい例としては、関数型言語でも、オブジェクト
を定義します。
また、C言語などは変数のポインタと、関数のポインタ両方をもっているので、バリバリの
オブジェクト指向でかけます。コーディングはかなり面倒なことになりそうですが。。。
”非手続き型言語”という呼び方は強烈に違和感を感じます。試験でそのように定義されている
のであればしかたがないのでしょうけど。
(因みに、同じページには「スクリプト言語」の説明として「イベント駆動型という特徴を持っている」という言及が有ります。これも、私は違うと思うのですが……)
これに関しては明らかに誤りですね。。。
投稿2015/07/30 18:13
総合スコア2883
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/07/31 01:35
0
確かに,誰もが納得するような分類ではないと思います.
しかし厳密になればなるほど,木構造が深くなり,理解の妨げにはなると思います.
またツリーにするということは,
コードの書き方では,手続き型と非手続き型,オブジェクト指向であるか,…
型の扱いについては,静的型付けと動的型付け,強い型付けと弱い型付け,…
実行の方法では,コンパイラ方式とインタプリタ方式(とハイブリット方式),
などといった分類に優先順位を付けなければならなくなります.
高水準・低水準を先に分けるくらいなら誰も文句を言わないと思いますが,
それ以降はどれから分けても泥沼になりそうです.
個人的には,スクリプト言語などとは書かずに,
プログラミング言語={低水準言語,高水準言語}
高水準言語={コンパイラ方式,インタプリタ方式}
くらいで止めた方が良いかなと思っています.
投稿2015/07/30 14:57
総合スコア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
総合スコア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
総合スコア902
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/08/01 03:57
0
私は、この分類には違和感を感じます。
「基本情報処理技術者」の試験勉強をしている方が、こういう鋭い感覚を持っていることに感心しました。
「受験数学と本当の数学は違う」というのと同様かもしれませんね。
試験用の参考書として書かれたものですので、
・著者が本当にこのような認識を持って書いた
・過去問題や解答から引きうつしただけ
の2通り考えられるかと思います。
受験対策としては、この参考書を鵜呑みにせず過去問題や他の参考書と比べてみるのがよいでしょう。
(せっかく買ったのにね)
「手続型言語」の後継というか発展形ではないかと思っています。
これについては、他の方と同様です。
オブジェクト指向は、コンピュータ・ソフトウェアの歴史の中で、「データの取り扱い方、データ構造の記述の仕方」が進化してきた過程で生まれたものだと思います。
必要なデータをただ羅列する
↓
コンピュータにとって処理しやすい形に並べる
↓
人間が見て解りやすいように並べる
↓
人間の思考に近づける
☆ここで生まれたのがオブジェクト指向……と私は思っています。
投稿2015/07/31 01:46
総合スコア229
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/08/01 04:23
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/08/01 04:58
2015/08/01 05:18