主な理由として聞いた話ではC++は処理が早いと聞いたのですが同じオブジェクト指向でもJAVAは何で遅いのかなども気になっています。私はプログラムを独学する程度の知識はありますが、多くの言語を広く浅くという程度なので深く携わった方のご意見も伺えればと思います。
http://q.hatena.ne.jp/1200988823
http://q.hatena.ne.jp/1207318858
など他の質問も見ました。言語の使い分けって余程の規模でない限りは厳密に考えることなく結構曖昧なところかなと思いますが(本職の企業レベルだとプロとしてまた別の話かもしれませんが)。どうぞよろしくお願いします。
1つ目は
C++で書かれた言語はコンパイルするとネイティブコードになります(マシン語)
そのためのそれ用のOSでしか動きませんが早いです。
3つのOSに対応する場合、3つのソースコードが必要な部分があります。
Javaはコンパイルしてもネイティブコードになりません。
JavaVMが理解する中間コードになります。
1度ソースを書けばJAVAVMという仮想マシン上で動くので
どのOSでも基本的に動きます。
ただ、間に1枚処理が入るのでその分が遅いです。
2つ目は
Javaはメモリ管理を基本的にしなくてもかまいません。
使われなくなった変数や領域は自動的にガーベジコレクションによって開放されます。
この処理もJavaのバージョンがあがる度に早くはなっていますが、
処理がしないよりは遅いです。
C++ではガーベジコレクションがないので、自分でメモリ管理をしなければなりません。
使わなくなった変数は自分で開放していかなくてはなりません。
開放は1つも忘れてはなりません。余計な処理をしないため、面倒ですが、早いです。
ただ、この開放忘れはメモリリークといって重大なバグにつながる上、
原因を発見しにくいバグです。
主にビジネスソフトやWebソフトを作るときには少しの速度犠牲の変わりに
開発しやすさを求めてるので上の2つはJavaでOKですが、
ゲームとなると厳しい速度に対する要求があるのでC++が多くなります。
ただ、携帯電話のゲームなどはJavaで多く書かれています。
1つ目は
C++で書かれた言語はコンパイルするとネイティブコードになります(マシン語)
そのためのそれ用のOSでしか動きませんが早いです。
3つのOSに対応する場合、3つのソースコードが必要な部分があります。
Javaはコンパイルしてもネイティブコードになりません。
JavaVMが理解する中間コードになります。
1度ソースを書けばJAVAVMという仮想マシン上で動くので
どのOSでも基本的に動きます。
ただ、間に1枚処理が入るのでその分が遅いです。
2つ目は
Javaはメモリ管理を基本的にしなくてもかまいません。
使われなくなった変数や領域は自動的にガーベジコレクションによって開放されます。
この処理もJavaのバージョンがあがる度に早くはなっていますが、
処理がしないよりは遅いです。
C++ではガーベジコレクションがないので、自分でメモリ管理をしなければなりません。
使わなくなった変数は自分で開放していかなくてはなりません。
開放は1つも忘れてはなりません。余計な処理をしないため、面倒ですが、早いです。
ただ、この開放忘れはメモリリークといって重大なバグにつながる上、
原因を発見しにくいバグです。
主にビジネスソフトやWebソフトを作るときには少しの速度犠牲の変わりに
開発しやすさを求めてるので上の2つはJavaでOKですが、
ゲームとなると厳しい速度に対する要求があるのでC++が多くなります。
ただ、携帯電話のゲームなどはJavaで多く書かれています。
とてもわかりやすい説明をありがとうございます。
携帯ゲーム、アプリですね。自分はそっちの本も数冊持っています。
だからそのあたりで拭い切れない疑問があったのかもしれません、、
つまり譲れない妥協点でオンラインゲームでは処理の早さが上位にあるので
必然的にC++となるのですね。
逆にいうなら、処理の速さをとりあえず置いておけるオンラインゲームなら
他の言語の方が有用かもしれない、と。
最近は携帯アプリも3Dが増えてきて数年前から処理上誤魔化しつつ頑張ってる節が見られますが、
今後は耐え切れずにC++が増えていくかもしれませんね。携帯で動くならw
もしくは逆にJAVAが頑張って処理を上げるか、、楽しみです。
実はJAVAの本で、JAVAでMMORPGは見たこともないし作るのは絶対にムリだ、、
と書いてあったので、そのあたりも気になるところでした。
JAVAVMに処理をまわす分でどれくらい処理が遅くなるのか気になるところです、、
それはどれくらい実感できるものなのかと、いつか検索しても見つからなかったのですが、、、
また探してみようと思います。
ありがとうございました。。
サーバ側はメモリや処理速度を重視してC++になると思います。
あと、処理速度以外の面ではクライアント側のJavaはリバースエンジニアリングが簡単という点も大きいでしょう。
オンラインゲームは不正対策が徹底されている必要があるのでサーバとどのような通信をしているかは出来るだけ秘密にしたいわけです。
その点、Javaのバイトコードは中間言語にコンパイルされているだけなので、どこにでもあるようなツールを使うだけで、元のソースコードにかなり近い形まで簡単に戻すことが出来てしまいます。
そうすると悪巧みをするユーザの手による不正行為が横行しやすくなってしまうという問題点です。
まぁ当然バイトコードの暗号化を行うような製品もありますが…それでもネイティブコードに比べたら解析の容易さの次元が違うと思って差し支えないでしょう。
お返事が遅れてしまい申し訳ないです。
なるほど、使い分けるという意味ではクライアントをJAVA、サーバをC++という手もありますね。
クライアントの3D処理が不安とは思いますが。結局はPC機能への依存という意味ではどれも同じで。
チート対策は結局いたちごっこになるとは思っていましたが入口を狭めるという意味でC++の方が有利とは知りませんでした。
リコンパイラは私も調べたことがありましたが思えばCの方でした。JAVAは容易なのですか。
結局は使い手次第とはいえ、技術の追いかけっこをしなければいけないのは大変ですね。
まぁ 最初からそんなに根詰める程考えなくてもいいのかもしれませんがw
ありがとうございました。
とてもわかりやすい説明をありがとうございます。
携帯ゲーム、アプリですね。自分はそっちの本も数冊持っています。
だからそのあたりで拭い切れない疑問があったのかもしれません、、
つまり譲れない妥協点でオンラインゲームでは処理の早さが上位にあるので
必然的にC++となるのですね。
逆にいうなら、処理の速さをとりあえず置いておけるオンラインゲームなら
他の言語の方が有用かもしれない、と。
最近は携帯アプリも3Dが増えてきて数年前から処理上誤魔化しつつ頑張ってる節が見られますが、
今後は耐え切れずにC++が増えていくかもしれませんね。携帯で動くならw
もしくは逆にJAVAが頑張って処理を上げるか、、楽しみです。
実はJAVAの本で、JAVAでMMORPGは見たこともないし作るのは絶対にムリだ、、
と書いてあったので、そのあたりも気になるところでした。
JAVAVMに処理をまわす分でどれくらい処理が遅くなるのか気になるところです、、
それはどれくらい実感できるものなのかと、いつか検索しても見つからなかったのですが、、、
また探してみようと思います。
ありがとうございました。。