Javaの最新のレビュー[終了]


58

私は数年前からプログラミングをしていて、Javaを始めました。そして、Javaが何らかの形で劣った言語であると主張するさまざまなソースを見つけました。各言語には長所と短所があることをよく知っていますが、Javaについて読んだ多くのことは時代遅れのようです。

Javaが劣っている最もよく挙げられる理由は、たとえばC ++など、他のネイティブにコンパイルされた言語よりもJavaがはるかに遅いことです。多くの人々は、パフォーマンス部門が明らかに不足しているため、Javaの使用についてゲームデザイナーのノッチ(Minecraftを開発した)を批判しています。当時はJavaの方がはるかに低速でしたが、それ以来、特にJITコンパイルでは多くの改善が見られました。

今日、言語としてのJavaについて客観的な意見を聞きたいと思います。したがって、私の質問には4つの部分があります。

  1. パフォーマンス。

    a。今日のJavaの速度はC ++と比較してどうですか?

    b。Javaを使用して最新のAAAタイトルを作成することは可能でしょうか?

    c。JavaがC ++より遅いのは、具体的にどのような分野ですか?(つまり、数値演算、グラフィックス、またはその周辺)

  2. Javaは現在、コンパイル言語またはインタープリター言語と見なされていますか?

  3. 初期の頃から対処されてきたJavaの主な欠点は何ですか?

  4. まだ対処されていないJavaの主な欠点は何ですか?

編集:

明確化の目的のために、私はこのJava対C ++を作成していません。明らかに、平均してc ++はJavaよりも少し高速です。この時点で、Javaを言語としての成熟度に関して比較するものが必要です。C ++は永遠に存在しているので、私は比較の良い点になると思いました。



4
私は10歳の何かがもはや現代的ではないという事実が好きです。
cwallenpoole

4
Java を単なる言語ではなくフレームワーク/プラットフォームとして見ると、Javaの外観は大きく異なります。たぶん問題は両方の名前が本質的に「Java」であることです。
ジョーインターネット

1
対照的に、Minecraftは最近300万件の売り上げを記録しました。Javaの欠点が販売に大きな影響を与えるほどゲームを傷つけたとは思わない。
マイケルK

3
絶対に、どの 言語も「何らかの形で」劣っています。定義により。
SKロジック

回答:


62

a。今日のJavaの速度はC ++と比較してどうですか?

測定が難しい。実装の速度の大部分であるメモリアロケータは、JavaとC ++の非常に異なるアルゴリズムであることは注目に値します。コレクターの非決定的性質により、C ++の決定論的メモリー管理と比較して、意味のあるパフォーマンスデータを取得することが非常に困難になります。コレクターの状態を確認できないためです。意味のある比較をするかもしれません。一部のメモリ割り当てパターンはGCではるかに高速に実行され、一部はネイティブアロケーターではるかに高速に実行されます。

ただし、Java GCはあらゆる状況で高速に実行する必要があるということです。ただし、ネイティブアロケーターは、より適切なものに交換できます。私は最近、C#が同等のものと比較して(私のマシンでは0.45ミリ秒で)実行できる理由についてSOに質問をしましたDictionarystd::unordered_map実行しました(私のマシンでは10ms)。ただし、アロケータとハッシュをより適切なものに交換するだけで、マシン上で実行時間を0.34msに短縮しました。これは元のランタイムの30分の1です。Javaでそのようなカスタム最適化を実行することは決して望めません。これが実際の違いを生むことができる優れた例は、スレッド化です。TBBのようなネイティブスレッドライブラリは、多くのスレッドで多くの割り当てを処理する場合、従来のアロケーターよりも非常に高速なスレッドキャッシングアロケーターを提供します。

次に、多くの人々がJITの改善と、JITがより多くの情報を持っている方法について話します。確かに、それは本当です。しかし、C ++コンパイラは、最終プログラムの実行時間の観点から、実行する時間とスペースが比較的無限であるため、C ++コンパイラが引き出せるものにまだ遠くありません。JITがプログラムを最適化する最適な方法を考えるために費やすすべてのサイクルとバイトは、プログラムが実行に費やしておらず、独自のメモリニーズに使用できないサイクルです。

さらに、コンパイラーとJITの最適化が特定の最適化を証明できない場合が常にあります(特に、エスケープ分析などの場合)。C ++では、とにかく値がスタック上にあるので、コンパイラーはそれを実行する必要はありません。さらに、連続メモリのような単純なものがあります。C ++で配列を割り当てる場合、単一の連続した配列を割り当てます。Javaで配列を割り当てた場合、配列はどこにも指すことができないポインターで満たされるだけなので、配列はまったく連続していません。これは、二重間接のメモリおよび時間のオーバーヘッドだけでなく、キャッシュのオーバーヘッドでもあります。この種のことは、Javaの言語セマンティクスが、同等のC ++コードよりも遅くなければならないことを強制するだけです。

最終的に、私の個人的な経験では、Javaは平均してC ++の約半分の速度になる可能性があります。ただし、実際にはアルゴリズムが根本的に異なるため、非常に包括的なベンチマークスイートがないとパフォーマンスステートメントをバックアップする方法はありません。

b。Javaを使用して最新のAAAタイトルを作成することは可能でしょうか?

ここでは「チャンス」ではなく「ゲーム」を意味すると思います。まず、既存のライブラリとインフラストラクチャのほとんどすべてがC ++を対象としているため、すべてをゼロから作成する必要があります。それ自体を不可能にするわけではありませんが、確実に実現不可能なものに貢献する可能性があります。第二に、C ++エンジンでさえも、既存のコンソールの小さなメモリの制約に収まらない場合があります(JVMがそれらのコンソールに存在する場合でも)。そして、PCゲーマーはメモリにもう少し期待しています。パフォーマンスの高いAAAゲームを作成することはC ++では十分に困難であり、Javaでどのように実現できるかわかりません。コンパイルされていない言語でかなりの時間を費やしてAAAゲームを書いた人は誰もいません。それ以上に、単純に非常にエラーが発生しやすくなります。たとえば、GPUリソ​​ースを処理する場合、確定的な破壊は不可欠です。Javaでは、

c。JavaがC ++より遅いのは、具体的にどのような分野ですか?(つまり、数値演算、グラフィックス、またはその周辺)

私は間違いなく万能に行きたいです。すべてのJavaオブジェクトの強制参照の性質は、JavaがC ++よりもはるかに多くの間接性と参照を持っていることを意味します。以前に配列で示した例は、すべてのメンバーオブジェクトにも適用されます。C ++コンパイラが一定時間でメンバー変数を検索できる場合、Javaランタイムは別のポインターをたどる必要があります。アクセス回数が多いほど、取得速度は遅くなり、JITがそれに対してできることは何もありません。

C ++がメモリの一部をほぼ瞬時に解放して再利用できる場合、Javaではコレクションを待つ必要があります。キャッシュがなくなることはなく、本質的に多くのメモリが必要になると、キャッシュとページングのパフォーマンスが低下します。次に、ボクシングやボックス解除などのセマンティクスを調べます。Javaでは、intを参照する場合、動的に割り当てる必要があります。これは、C ++のセマンティクスと比較して固有の無駄です。

次に、ジェネリックの問題があります。Javaでは、実行時継承を介してのみ汎用オブジェクトを操作できます。C ++では、テンプレートのオーバーヘッドは文字通りゼロであり、Javaには対応できません。つまり、Javaのすべての汎用コードは、C ++の一般的な同等のコードよりも本質的に低速です。

そして、あなたは未定義の行動に来ます。彼らのプログラムがUBを展示するとき、誰もがそれを嫌い、誰もがそれが存在しなかったことを望みます。ただし、UBは基本的に、Javaには決して存在しない最適化を可能にします。UBに基づいた最適化について説明しているこの投稿をご覧ください。動作を定義しないということは、実装がより多くの最適化を行い、C ++では定義されないがJavaで定義される条件をチェックするために必要なコードを削減できることを意味します。

基本的に、Javaのセマンティクスは、JavaがC ++よりも遅い言語であることを示しています。

Javaは現在、コンパイル言語またはインタープリター言語と見なされていますか?

これらのグループのいずれにも当てはまりません。マネージドは、それ自体が実際には別のカテゴリであると思いますが、コンパイルされた言語というよりもインタプリタ言語に間違いなく似ていると思います。さらに重要なことは、JVMとCLRという2つの主要な管理対象システムしかないことです。「管理対象」と言えば、それは十分に明確です。

初期の頃から対処されてきたJavaの主な欠点は何ですか?

私が知っているのは、自動ボクシングとアンボクシングだけです。ジェネリックはいくつかの問題を解決しますが、多くの問題からはほど遠いです。

まだ対処されていないJavaの主な欠点は何ですか?

それらのジェネリックは非常に弱いです。C#のジェネリックはかなり強力です-もちろん、どちらもまったくテンプレートではありません。決定論的な破壊はもう1つの大きな欠如です。どんな形式のラムダ/クロージャーも大きな問題です。Javaの機能的なAPIを忘れることができます。そしてもちろん、それを必要とする分野には常にパフォーマンスの問題があります。


10
最新のJITがどのように機能するかについて、いくつかの誤解があるようです。そうでなければ良い情報。
ショーンマクミラン

7
「さらに重要なことは、2つの主要な管理対象システム、JVMとCLRのみが存在することです」-ええと、Python?ルビー?Smalltalk?LISP?それらはすべてガベージコレクターを使用し、ポインター演算を欠いています。また、知る限り、バイトコードに基づく実装が少なくとも1つあります。
マイケルボルグワード

3
@Michael:前回チェックしたとき、少なくともPythonとRubyが「解釈された」キャンプにかなり深く入り込んでいます。最も一般的な実装は、別のフェーズでバイトコードにプリコンパイルすることも、JITを含めることもありません。SmalltalkやLISPは使用していませんが、それらを「メジャー」キャンプに入れるかどうかはわかりません。SmalltalkやLISP JITも聞いたことはありません。
DeadMG

19
+1いい答え。最後に、JavaがC ++より常に遅い理由を理解している人。
jeffythedragonslayer

2
これらのポイントのいずれかが、実世界のパフォーマンスの問題(例外またはベンチマーク)を免れますか?ほとんどのユーザーに気づかれますか?言語Xが言語Yより0.25%高速であると言っても、言語Yが低速であることを意味しません。ビデオゲームで、あなたは奇妙なコンソールを話しているのですか、それともPCゲームを含んでいますか?
TheLQ

34

誰もがプログラミング言語について真に中立的な意見を述べることはほぼ不可能であるという条件から始めます。2つの言語を十分に理解していて意味のあるコメントを付けている場合、どちらか一方を優先することはほぼ避けられません。公正な警告として、私はJavaよりもC ++を好みます。これは間違いなく私のコメントに少なくともある程度影響を与えます。

1a。速度:C ++またはJavaから得られる速度は一般に、それを使用するプログラマーのスキルよりも、言語またはその実装に依存しません。最終的には、おそらくC ++ が速度で勝つ可能高くなりますが、記述するコードの違いが本当に重要です。
1b。はい、たぶん。同時に、C ++はすでに十分に確立されており、ほとんどのゲームスタジオがJavaへの切り替えを煩わせるのに十分な利点があるとは思えません。
1c。これに対する徹底的な答えは、おそらく大容量になる可能性があります。通常、C ++は、より限られたリソースでより良くなります。Javaは、(たとえば)大量の「予備」メモリを使用できるという利点があります。
2.実行速度が遅いこととガベージコレクションが遅いことは、おそらく最も明白な2つです。初期のウィンドウ化ライブラリ(AWT)は非常に不格好でした-Swingは大きな改善でした。
3.冗長性。オペレーターの過負荷の欠如。ガベージコレクションの使用。多重継承の欠如。Java Genericsは、C ++テンプレートと比較して非常に制限されています。

これらの欠点のいくつか(すべて?)(特にガベージコレクションの使用ですが、その他も同様)がJavaの利点として多くの人に見られていることを付け加えます。唯一の例外は、その冗長性です。冗長性の状況は少しずつ改善していますが、確かにJavaで優勝したコードゴルフコンテストはあまり見られません。また、通常のコードではかなり多くのコードを使用する傾向があります。もっと読みやすく、理解しやすいと思う人が少なくとも数人いるのではないかと思うので、おそらくアドバンテージとして見ることもできます。


12
Javaジェネリックは、C ++テンプレートにも匹敵しません。Javaテンプレートは、コンパイル時の型チェックを支援する構文糖衣です。C ++テンプレートは、チューリング完全なコード生成システムです。
ケビンクライン

10
冗長性のために+1。COBOLを使用して、意味のない長い構文を作成します。すべての「try」、「catch」、およびすべてのht ExtrementlyLongClassName extremeLongObjectName = new ExteremlyLongClassName()タイプのコードでは、コードが実際に何をしようとしているかを判断するのは非常に困難です。
ジェームズアンダーソン

1
@マーク:個人的には、この答えは判読不能な混乱であり、この種のことは二度と見たくないと思っています。回答は、ディスカッションではなく回答でなければなりません。
マイケルボルグワード

2
+1演算子のオーバーロードについては、多くの人が軽微な欠点と見ているものですが、私にとっては大きな欠点です。そしてもちろんテンプレートですが、ほとんどの人がテンプレートをメジャーだと考えています。
クリスは、モニカを復活させる

2
C ++テンプレートは、その設計の結果として偶然に起こったチューリング完全であることを意図していませんでした。それにもかかわらず、それは時々有用です:C ++テンプレートのメタプログラミングを調べます。
来るストーム

11
  1. パフォーマンスに関して
    1. 純粋なコード実行速度では、Javaは単純なC ++とほぼ同等です。しかし、Javaはより多くのメモリを使用する傾向があります-一部はGCベースであるため、一部はその設計が効率よりも単純さと安全性に重点を置いているためです キャッシュの問題により、メモリが増えると速度が低下します。多くの高度にチューニングされたC ++と比較すると低いです。
    2. AAAタイトルが現在のハードウェアを使用して可能なことの端で機能する必要があると仮定した場合、いいえ。少なくともクライアント側では。いくつかのAAAタイトルがすでにバックエンドインフラストラクチャの一部にJavaを使用していることに賭けたいと思います。
    3. 大規模なデータセットとC ++を使用して作業する場合は、キャッシュフレンドリーな方法でアクセスできるように最適化できます。
  2. バイトコードにコンパイルされ、実行時にJITコンパイルされます。Compiled vs. Interpretedは誤った、時代遅れの二分法です。
  3. &4.それらをすべてリストするには多すぎるため、それらのほとんどについて意見の相違があります。

3
GCベースであるためJavaが大量のメモリを使用すると言うのは、18輪があるため18輪車が大量のガスを使用するということとほとんど同じです。私はJavaについてほとんど何も知っていませんが、問題はランタイムの膨張とキャッシュされているものが多すぎること、セマンティックガベージの可能性は低いと思われ、ガベージコレクションのアプローチ自体の欠陥ではありません。
ジョーイアダムス

3
最も明白なレベルでは、ガベージコレクションとは、オブジェクトが使用されなくなってから、ガベージコレクタが実際にスペースを回収するまでに遅延があることを意味します。手動管理環境では、オブジェクトが使用されなくなるとすぐにスペースを解放できます。遅延は、ガベージコレクションされた環境がより多くのメモリを使用することを意味します。また、通常、使用できるメモリが多いほどパフォーマンスが向上します。これにより、GCのオーバーヘッドが削減されるためです。
マイケルボルグ

1
@MichaelBorgwardtほとんどのJVMは毎回ゼロから開始する必要があるため、速度には時間が必要であることに言及する必要があります。以前の実行からのプロファイリング情報は再利用されません。

11

まず第一に、私のC ++は非常に錆びているため、Javaでの経験のほとんどは、C#での最近の経験に関係しています。

1.スピード

a。今日のJavaの速度はC ++と比較してどうですか?

これはSOの質問で最もよく答えられると思います。なぜJavaは遅いという評判を持っているのですか?しかし、この質問全体は、Jeff Atwoodのブログ投稿、Gorilla vs. Sharkによって色付けされていると思います。Péter&Christopherに感謝します。

b。Javaを使用して最新のAAAタイトルを作成することは可能でしょうか?

それは開発者の優先度と開発者のスキルに依存します。さらに、どちらかまたは両方の状況ではないため、タイトルの異なる部分には、実装されている言語の異なる異なるものが必要な場合があり、異種言語環境につながります。

私は最近、ロード中にPython環境をロードしていると言及しているゲームを見てきましたが、ホリデーシーズンに間に合うようにタイトルを取得したい場合、コースの馬は強い動機であると思われます。

c。JavaがC ++より遅いのは、具体的にどのような分野ですか?(つまり、数値演算、グラフィックス、またはその周辺)

パフォーマンスの低いコードはどの言語でも作成できますが、一部の言語では適切な選択が容易になり、他の言語では自分のペタードでホイストを取得できる可能性が高くなります。Javaは前者に分類され、C ++は間違いなく後者に分類されます。

彼らが言うように、大きな力には大きな責任が伴います(ヒープを完全に台無しにする能力は言うまでもありません* 8 ')。

2. Javaは現在、コンパイル言語またはインタープリター言語と見なされていますか?

私はほとんどの人がそれを何と考えているか言うことはできませんが、多くの人はコンパイルされた言語と解釈された言語の違いを知っており、過去20年間洞窟に住んでいなかったので、JIT(ジャストイン-Time)コンパイラはJavaエコシステムの重要な部分であるため、最近コンパイルされたと見なされる可能性が高くなります。

3.初期の頃から対処されてきたJavaの主な欠点は何ですか?

私はかなり最近Javaに変換したため、Javaがどのように進化したかについてのコンテキストはほとんどありません。しかし、Java:The Good Partsのような本があり、最近好まれている言語の部分の方向に人々を誘導し、あるべき地域から人々を遠ざけようとしていることに注意してください。非推奨。

4.まだ対処されていないJavaの主な欠点は何ですか?

私の考えでは、Javaの1つの問題は、新機能の採用が遅いことです。

C#からJavaにアクセスし、Wikipediaの比較ページを調べてみると、これらが私にとって際立っているものです。

C#と比較して、Javaで見逃しているもの

  • プロパティ、特に自動プロパティ。インターフェイスの構築と保守がはるかに簡単になります。
  • クロージャ/ラムダ。Javaサポートが再び押し戻されていると聞いたとき、私は本当にがっかりしました。最後に、Java 8のClosures / lambdasがありますが、時間がかかったことから、採用の遅れについての私の声明が証明されています。
  • 型推論var)は構文糖衣のように見えるかもしれませんが、複雑なジェネリック型がある場合、多くの価値のない重複を削除することでコードより明確にすることができます。
  • 部分クラスは、自動的に生成されたコード(GUIビルダーなど)をプログラマーが記述したコードから分離するのに役立ちます。
  • 値型、時にはstructクラス全体で軽量を使用するための引数があります。
  • 拡張メソッドは、使いすぎるとシステムを複雑にする可能性がありますが、必要な場合にクラスに何かを実装する標準的な方法を示すのに最適です。
  • 符号なしの型、時にはその余分なビットがすべての違いを生むことがあります。* 8 ')

C#と比較して、Javaで見逃していないもの

  • 演算子のオーバーロードは、正しく使用すると優れていますが、不適切に使用すると、バグを見つけにくくなり、オペレーターが明らかにすべきことと実際行うこととが切り離される可能性あります。
  • Null可能な値型は、常に価値のあるものよりも多くの問題を引き起こすように思われました。
  • unsafeコードへのアクセス。あなたはこれに非常に注意しなければならないので、私はそれがめったに余分な努力の価値があるとは思わなかった。

そのため、リンゴとリンゴを比較する場合でも、Javaは遅れをとったと見なされます。

私がJavaで見ている他の2つの大きな問題は、ひどい起動遅延と、(一部のJVMでは)ヒープ永続世代ヒープさえも管理しなければならないという事実です。C#アプリケーションでは常にすぐに起動し、仮想マシンに事前に割り当てられたプールからではなく、システムメモリプールから割り当てられたため、ヒープについて考える必要はありませんでした。


1
あなたがリンクしたそのSO質問、受け入れられた答えは信じられないほど、陽気に間違っています。
-DeadMG


@マーク:おそらく。それから、完全にそれを落とすこともおそらく同様です。同じ質問に対する自分の回答ですでに発言しているので、コメントにさらに追加しても実際に多くの新しい知識が追加されることはほとんどありません。
ジェリーコフィン

8

あなたの質問の最初の部分に答えるのに役立つかもしれないソースをあなたに示すことができます。プログラミング言語はhttp://shootout.alioth.debian.org/u64q/which-programming-languages-are-fastest.phpを撃ちます さらに、異なるカテゴリでフィルタリングして、言語が他の言語よりも優れている領域を確認することもできます。Javaは数年前よりもはるかに高速です。



ええ、そのページに直接リンクしているはずです。
bschaffer13

4

1)Javaで得たUXについて厳密に話すと、時間がかかります。本当にどうしてかはわかりません。私はまだJavaベースのデスクトップアプリケーションに出くわしていません。これ遅く感じず、Java以外の高速な代替手段があります。そうは言っても、Javaは純粋な計算速度で非常に高速であり、インターネットにはそれを証明するベンチマークがたくさんあります。ただし、Javaアプリの起動時間とGUIの応答性は、まだIMHOを改善していません。たぶんあなたはそれを行うことができました;)
結局のところ、速度はそれほど問題ではありません。ハードウェアがどんどん高速になっているだけでなく、ほとんどの人は、ソフトウェアが実行していること、実行すべきこと、対話に費やされた時間と待機に費やされた時間の比率が合理的である限り、驚くほどほとんど気にしません。

2)この区別は最近非常に曖昧になり、その価値はほとんどありません。

3 + 4)実際にはJavaにかなりの変更が加えられています。一部の人々は、これらの変更がエイリアンの機能を強化することによってJavaの純粋に単純化された哲学を汚染したとすでに主張しています。客観的に、欠点とは何か、長所は何かと言うのは本当に難しい。私にとって、Javaは不必要に冗長で制限的で機能が貧弱ですが、他の人々はこれらの特徴を快適な曖昧さ、安全性、明快さだと考えています。
したがって、個人的にJavaを使用しないようにするのはこれらのことですが、Javaで見落としたものを単に追加することは良い考えではないと思います。JVMで実行し、Javaを曲げてJavaに近づけるのが好きな言語はたくさんありますが、Javaの目的を損なうだけです。

それは好みの問題です

Javaの問題は、自分が足で撃たれないようにすることです。高貴な原因ですが、すべての制限があるため、安全な足の1つをつまずいたり、自分の安全のために両手を背中の後ろに縛り付けて最後に死ぬことはできません。頭蓋骨を折るからです :D
ある意味では、JavaはC ++への応答であり、自分自身だけでなく、世界中の人々をつるすのに十分なロープを提供します。それはすべてそのロープであり、それはカウボーイにとってとても魅力的です。すべての自由とすべての力。

簡単に言えば、これは本当に好みの問題です。

しかし、ポイントは、Javaの代わりにC ++を使用すると、独自の制限を自由に選択できることです。または、あなたが持っているすべてのコントロールに本当に夢中になり、あなたの仲間を完全に混乱させる危険があります:

「cout」が「Hello world」回だけ左にシフトし、そこで右に停止したのを見ました。
—スティーブ・ゴネデス

その理由から、Javaは演算子のオーバーロードを提供しないことを選択しました。もちろん、これにより、関数ポインターとリストを乗算することにより、人々がコードを難読化することを防ぎます。しかし同時に、他の人が通常の演算子で幾何学的/代数的な計算を実行することを防ぎます。(v1 * v2 / scale) + (v3 * m)本当によりもはるかに明確ですv1.multiply(v2).divide(scale).add(v3.multiply(m))。これにより、3Dグラフィックスと計算を扱う人を先延ばしにすることができる理由がわかります。

Javaはガベージコレクションを課すことにしましたが、C ++では選択できます。本当に掘り下げてハードウェアに近づけることができます。データを構造体に密にパックできます。高速逆平方根などのダークマジックを実行できます。テンプレートを使用すると、地球上で最も複雑で不可解なメタプログラミングを実行できます。しかし、それはまた、あなたが迷子になり、作成したすべての混乱をデバッグしたり、まったく役に立たないコンパイラーエラーを見たりすることに何時間も費やすことができることを意味します。
しかし、実際に習得した言語の部分のみを使用する規律がある場合、Javaコードと同じくらい安全にC ++コードを書くことができますが、徐々に前進させるオプションがあります。

したがって、最先端のソフトウェアをJavaで書くことを技術的に妨げるものは何もありませんが、多くの開発者はJavaが言語として提供するものを超えて、優れたソフトウェアを書き、楽しみながら進化することに情熱を傾けていることに気付くでしょう。

しかし、世界は、次の大きなものを創り出そうとする人々だけで構成されているわけではありません。IMHO Javaは、安定した結果を快適に生成したい人に最適です。


+1 C ++では、Javaのようなコードを書くことを妨げるものは何もありません。同様に、それ以上のことを妨げるものは何もありません。言語を安全でない、または困難にするのはプログラマーです。
クリスは、モニカを復活させる

0

ガベージコレクションは大きなものです。頻繁に、GCは数百ミリ秒(ヒープのサイズに応じて)他のすべてをロックアウトし、メジャーコレクションを実行します。タイミングの制約がない場合はこれで問題ありませんが、遅れると失敗を意味する場合、これはショーストッパーです。リアルタイムJavaとリアルタイムOSにお金を費やすことができますが、GCCと標準Linuxを使用するだけで、これらの問題は発生しません。

予測不可能なランダムな一時停止がなければ、最近のJavaはほとんどの場合、おそらく十分に高速です。また、GC設定などを微調整するのに数か月かかる場合、多分、たぶん、顧客がチェックを切るのに十分な長さで動作させることができます。


ほとんどの最新のガベージコレクターは世界を止めません。

-1

3)修正された欠点。

数年前、Javaには多くの怒りがありました。ほとんどのJavaプログラマーはWeb /サーバープログラマーであり、Javaの冗長性に腹を立てていました。そのため、Rubyのような一部の言語が普及し、Javaが衰退し始めました。ただし、新しいアノテーションとhibernateやSpringなどのフレームワークにより、人々は文句を言うのをやめてJavaに戻りました。

4)現在の欠点

ハードウェアはすべてマルチコア化されています。Javaはマルチスレッドを実行できますが、シーケンシャル言語であるCに基づいており、マルチスレッド化するための機能は控えめに言ってもエレガントではありません。ちなみに、それは単なるJavaの批判ではなく、ほとんどすべての言語の批判です。コードについてのまったく異なる考え方が必要です。たぶん、関数型プログラミングは将来の方法です。


1
怒ってますか?ほとんどそうは思わない。そして、明らかにあなたはJava 6のコンカレントなものを見ていない。

-1

誤解を招くような大部分は無関係な答えを与えるため、私はこの質問に反応しました。

b。Javaを使用して最新のAAAタイトルを作成することは可能でしょうか?

Javaを使用してAAAタイトルを作成することは困難であり、私が認識している実際の例はないことに誰もが同意できます。ただし、多くのことを想定するAAAの性質を考えると(実際にはマーケティングに由来する紛らわしい用語であるため)、代わりに次のように尋ねることをお勧めします。

Javaを使用して合理的な成功を収めた最新のタイトルを作成することは可能ですか?

答えは「はい、できます。」です。ただし、方程式の実際の成功部分は、あなたの持続性と運(またはzeitgeistの順守)に基づいていますが、それはこのサイトの範囲外です。


-6

証明書の速度の領域は、コンパイラー対コンパイラーに帰着します。言語対言語ではありません。JITコンパイルは、実行中のマシンの仕様に合わせて最適化できるため、利点があります。JITでコンパイルされたC ++とJavaを比較して、より「リンゴ対リンゴ」コンパイラの比較を行います。

ただし、Java言語自体がパフォーマンスを制限することがあります。

  1. スタック上の割り当て。Javaはこれを行うことができません。非再帰的ソリューションの小さな固定サイズのクラスでは、これが理想的です。ヒープの断片化を回避することもできます。

  2. 非仮想関数。Javaはこれを行うことができません。すべてのメソッド呼び出しは、オーバーライドされる予定がない場合でも永続的なヒットを受け取ります。

おそらく他にもいくつかありますが、それが私の頭上から考えることができるすべてです。


2
最新のJITコンパイラは、これらの両方のケースを最適化できます。Java(6以降)にはスタック割り当てがあります:en.wikipedia.org/wiki/Escape_analysis。非仮想関数に関しては、JITコンパイラーは、1つの宛先にのみ移動する(場合によってはインライン化することもできる)仮想メソッド呼び出しを非仮想呼び出しに解決します。
スティーブンシュランスカー

1
#2は偽物です:適切なJITは、現在オーバーライドされているかどうかに基づいて、機能を仮想または非仮想としてマークします。
アマラ

-16

1)無関係であり、ブートに反論する。
主要なソフトウェアをJavaで作成できるだけでなく、このようなシステムは毎日提供されており、現在では世界のほとんどの主要企業を運営しています。
2)同上。
JVMの仕様を読んでください。Javaはインタープリター言語ではありませんでした。
3)同上。
15年にわたるリリースノートをお読みください。対処すべき「主要な欠陥」とみなされるものを把握することは不可能です。
4)同上。
対処しなければならない主要な欠陥は、JSRでsomoeneの名前を取得する以外に明白な理由がないため、コア言語およびライブラリと干渉する傾向があるJCPです。 JSR-666のリーダー」。OracleのJCPの再構築がそれを処理することを願っています。
ここで言語戦争を起こして、Javaに対する偏見を他の人から確認したいようです。実際に正当な理由が見つからないからです。


ああ、私は人々がすでにJavaをスラグしていない人をダウンボットすることによって戦争を始めているのを見ます。よくやった、人々!
11

10
ダウン投票の理由は、あなたの答えが実際には1つではないという事実にあると思います。
-blubb

6
この答えは単なるトローリングです。OPには、よく考え抜かれた非保証型の質問がありました。それから、「Javaに対する偏見を他の人が確認するようになります。なぜなら、Javaの正当な正当性を自分で見つけることができないからです」。うん、-1。ノーとああ、私は多くのことについては、Java、その私の現在のお気に入りの言語を嫌いではありません
TheLQ

4
OPは、非常にうまくまとめられた質問を作成し、適切なフレーズの回答を受け取りました。彼が何かをかき立てていると非難する必要は本当にありません。
アダムリア

ああ、私は人々が暴言のために深刻な質問(および回答)を取り、自分自身が個人的に攻撃されていると感じてすでに戦争を始めているのを見ます。残念ながら、まだ投票できません。
クリスは、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.