3

JVMは構造体で言語を作成できますか? C# (および IL) と同じ構造体を意味します。構造体はカスタム値型である必要があるため、ガベージ コレクターの対象にはなりません。Java が C# と同じになることを望んでいません。Java と JVM が設計された方法と理由を完全に理解している人々から教訓を学びたいだけです。持っていない動機は何ですか?構造体の導入は、Java コミュニティまたは Sun/Oracle によってどの時点でも検討されましたか? その周りの物語へのリンクを知っていますか?

結論: SO でこの質問をするのは適切ではありません。約20年前のその決定に関係する人がいないからです。一部の合理的な SO ユーザーは、カスタム値の型 (構造体) が順番に表示されない理由として次のように提供しています。

  1. カスタム値タイプは、JVM 実装の単純さに影響を与えます。
  2. 値型は、Java が従おうとする OOP 原則に反しています。
  3. 学習曲線。すべてが参照オブジェクトである言語は習得が容易です。
4

4 に答える 4

4

ガベージ コレクション型ではなく、構造体型を Java に導入することは理論的には可能だと思います。しかし、Java にはポインターがない (今後も存在しない) ため、その構造体のようなものは、プリミティブのように常に値渡しする必要があります。

主な利点は、配列の各項目が独自のライフサイクル (およびガベージ コレクションの負担) を持たずに、この値型の大きな配列を作成できることです。

Java での構造体 (自明なデータ オブジェクト) の導入に関するこの 10 年前の議論は興味深いかもしれません: http://bugs.sun.com/view_bug.do?bug_id=4820062

于 2013-04-09T23:31:36.230 に答える
2

プリミティブを除いて、Java には C# のような「値の型」がありません。なぜこのように設計されたのかは推測できます。おそらく簡単にするためです。プリミティブは、パフォーマンス上の理由からオブジェクトではありません。

于 2013-04-09T23:25:59.873 に答える
1

カスタム言語に関する限り、JVM が何らかの形でこれを防いでいるとは思えません。それは本当に役に立ちません。構造体型のローカル変数を一連の名前マングルされたプリミティブ型のローカル変数に変換し、それらをコレクションに格納して Java ライブラリと対話するためにボックス化 (解除) を処理し、一般にすべての値を考え出して実装する必要があります。ゼロからの型セマンティクス

于 2013-04-09T23:35:04.430 に答える
-1

Cstructは Java に匹敵しますObjects。では、複数の複合データ型またはプリミティブデータ型を 1 つの複合structデータ型にパックできます。これは、Java の aまたは.classObject

さて、そのオブジェクトをどのように使いたいかはあなた次第です。パブリック変数でパックするか、それらの変数を処理するための関数/メソッドを追加することができます。これらすべての背後にある全体的な考え方は、(C 言語とは異なり) Java は最初からオブジェクト指向言語として作成されたということです (Java には、プリミティブ boolean や int などのように、実際には OO の一部ではないマイナーな側面がいくつかあります。 . しかし、それは別の話です)。

についてはgarbage collector、Java では通常のプログラマーが心配する必要はありません (心配する必要はありません)。オブジェクトがガベージ コレクションの対象となるかどうかは、ランタイム次第です。(ただし、ガベージ コレクションを強制することは可能ですが、これはあまり実用的ではありません)。

于 2013-04-09T23:29:06.260 に答える