プロが教えるわが家の防犯対策術!

最近プログラミングをかじり始めた初心者です。
C/C++とjavaの本当に基礎的な部分だけ学んだのですが、まだ大規模なプログラムなどを組んだ経験がなく、それぞれの長所短所というものがいまいち分かりません。
自分で感じたりネットで調べた限りでは
・javaはOSなどに左右されず動くことが最大の利点
・コンパイル方式の関係でC/C++の方が動作が速い
・組み込み系では細かく管理できコンパクトに収められるC言語が有利
くらいなのですが、これ以外に大きな違いなどはあるでしょうか?
それと「昔はjavaが遅いと言われていたが、最近ではそれほどでもなくゲーム開発でも使われ始めた」というようなことも聞いたのですが、そのように昔言われていたが今では違うというようなことはあるでしょうか?
ご回答よろしくお願いします。

A 回答 (2件)

大体間違ってないんじゃないですかねぇ。



基本的には、

・C++/Javaはオブジェクト指向言語
・Cは手続き型言語

と言うパラダイムの違いはあります。
Java自体はBetter C++となる、と言う目的の為に作られました。
そしてC++はCの上位互換を目指してデザインされました(ただし、今は言語仕様上必ずしもそうはなっていません)。

> ・javaはOSなどに左右されず動くことが最大の利点

はい、一般的にはそう言われています。
ただ、Javaと言う言語仕様と実装、ってのは別次元の話で、これは実装の話、しかもOracleと言うJavaの権利を握っている会社が提供してる「公式の」Javaの話ですね。
実はJavaの言語仕様に則ったOracle以外の別の実装もあることはあって、「Javaと言う言語(仕様では)」って事でもないんです。
「公式の」Javaの場合、コンパイルして吐き出すコード、「ネイティヴ」と呼びますが、要するにコンピュータ自体が直接解釈実行するマシン語ではないんです。
対象はJava仮想マシン(Java Virtual Machine = JVM)と言うソフトウェアなのです。
つまり、「公式の」Javaの場合、その仮想マシンがプラットフォーム別(例えばWindows、MacOS、Linux等)に用意されてて、そこは変えないといけないわけですが、その上で走る「Javaのコードは共通である」って言う設計をしてるんですね。
つまり、マシンの差は「仮想マシンが吸収する」と言うやり方なんです。
ただ、例えば互換のgcj(GNU Compiler for Java)なんかはネイティヴ・コードを吐き出したりも出来ます。
(ただ、最新のJava8にはまだ追っついてないとは思います)

GCJ:
https://gcc.gnu.org/java/

OpenJDK:
http://openjdk.java.net

> コンパイル方式の関係でC/C++の方が動作が速い

これも大体その通りだと思います。
C/C++とJavaの差は、Javaは仮想マシン前提の設計ですが、「一般的には」C/C++は直接マシン語(と言うか実際はアセンブリ言語)を吐き出します。要するに、(公式のJavaと比べた場合、)コンピュータ全体の作業が一段階少ないわけですね。
ただ、実の事を言うと、言語仕様上はC/C++は「コンパイラです」とは指定されてません。
で、探せばC/C++のインタプリタなんかもあるんで、必ずしもC/C++が「確実に速い」とも言えないんです(一般的にはインタプリタはコンパイラより遅い、と言われてます)。

例: Cling(C++インタプリタ):
https://root.cern.ch/cling

> 組み込み系では細かく管理できコンパクトに収められるC言語が有利

これもその通りだと思います。

> そのように昔言われていたが今では違うというようなことはあるでしょうか?

あります。
CPUも速くなってますし、メモリもJavaが登場した90年代のコンピュータより多く積んでますし、あとはJVM、つまり先ほど書いた仮想マシンですよね、その実装も良くなってるでしょう。

・1995年の一般的なコンピュータのメモリ:32Mb〜64Mb -> 2016年の一般的なコンピュータのメモリ:Gbレベル(最低でも32倍以上)
・1995年の一般的なコンピュータのCPUの周波数: 66MHz辺りから -> 2016年の一般的なコンピュータのCPUの周波数: 1GHz突破〜2GHz以上(最低でも15倍以上)

つまり今は、別にJavaに限らないですが、昔のコンピュータの「リソースがとにかくすぐ足りなくなる」と言うような状況と違って

「何が何でも速度を稼ぐ為にC/C++を使わなければいけない」

と言うようなクリティカルな状況はそうそうなくなってきました。
本当に速度が必要な、って状況じゃなければ、組み込みでもない限り、そんなにC/C++を使わなくちゃいけない、と言うような必然性は薄れては来てると思います。
    • good
    • 0
この回答へのお礼

一つ一つに丁寧なご回答ありがとうございます

お礼日時:2016/08/17 16:45

>・コンパイル方式の関係でC/C++の方が動作が速い



最近はJITコンパイラという技術もあって、さらに実行即速度の格差がなくなってきていますね。
https://ja.wikipedia.org/wiki/%E5%AE%9F%E8%A1%8C …


> これ以外に大きな違いなどはあるでしょうか?

・ガベージコレクションの機能が言語仕様として存在するか否か
 C/C++は言語仕様に存在しないので、動的にメモリを確保する場合はしっかりと管理して適切に開放を行わないとメモリーリークが発生します。

https://ja.wikipedia.org/wiki/%E3%82%AC%E3%83%99 …
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!