要件を満たさない次の回答を除いて、回答が見つからなかったという質問があります。
「ジェームズゴスリングはしたくなかったから」
Javaにはインターフェース(純粋な仮想関数のみ、属性なし)を含めることができますが、クラス定義とまったく同じではありません。
要件を満たさない次の回答を除いて、回答が見つからなかったという質問があります。
「ジェームズゴスリングはしたくなかったから」
Javaにはインターフェース(純粋な仮想関数のみ、属性なし)を含めることができますが、クラス定義とまったく同じではありません。
回答:
私の要件を満たしていない次の回答:「ジェームズゴスリングはしたくなかったからです。」
しかし、それは正しい答えです。言語設計チーム(Gosling、Sheridan、Naughton、後にBill Joy、Ken Arnoldなど)は、ヘッダーが解決するよりも多くの問題を引き起こすと判断しました。そこで彼らはそれらを設計し、それらを必要とせずに完全に有用な言語を作成できることを実証しました。
Java Language Environmentホワイトペーパーのセクション2.2.1から:
Javaで記述されたソースコードは単純です。プリプロセッサ、#defineおよび関連する機能、typedefがなく、これらの機能がなく、ヘッダーファイルは不要です。Java言語のソースファイルは、ヘッダーファイルの代わりに、他のクラスとそのメソッドの定義を提供します。
冗長な定義、ファイルの同期の維持、競合する定義、非表示の定義-ヘッダーがないため、これらはJavaでは発生しません。裸のクラス定義を表示したい場合は、.javaファイルから直接定義を生成できます。たとえば、ほとんどのIDEは、同じことを行うサイドバーにクラスの構造を表示します。
C ++では、クラス定義と宣言を別々のファイルに含める必要はありません。これは、少なくともC時代に戻って、コードの1回の上下スキャンで解析を実行できることを意味します。ランダムアクセスストレージのないマシンでは、これは大したことでした!
ヘッダーがあることで、ソースコードを公開せずにヘッダーを提供することにより、インターフェイスをコードライブラリに公開することもできます。残念ながら、C ++では、pimplの恐怖のようなソリューションにつながったプライベートデータメンバーも明らかにする必要があります。
すべてがデータベース型構造に保存され、ファイルはないがキャッチされなかったC ++環境を作成する試みがありました。
すべての言語で-最終的なバイナリコードを作成するための2つの段階があります-コンパイルとリンク(もちろん、読み込みはありますが、ここではあまり影響しません)。コンパイル時には、フック(呼び出される関数の仕様)を適切な場所に置くだけで済みます。両方の実際のコードが利用可能な場合、リンカーは実際にそれらを結合します。これまでのところ、C ++とJavaの間に違いはありません。
そこで宣言と定義別のを持っているC ++の必要性は、しかし、。実装をヘッダーに保持し、ヘッダーファイルが変更された場合、それにリンクされているコードを再コンパイルする必要があります。定義が別のファイルにあるかのように、コードを再リンクするだけで済みます。
C ++には、呼び出し元のアプリケーションと共にオブジェクトコードが修正されることを意味する静的リンクのオプションがあります。CとC ++の両方で、ヘッダーファイルにプログラミングを行ったり、#includeを実行したりすることは無効ではないことに注意してください。これは、これらのオブジェクトファイルでリンクがどのように発生するかを気にする必要があることを意味するだけです。
Javaの状況は非常に異なります。各クラスファイルは、.classファイルでコンパイルされます。確かに、.classファイルのヘッダーセクションとして機能する呼び出し元クラス関数のコンパイルが必要です。ただし、Javaでは、クラスファイルのバイトコードが指定されている場合のみ、最終リンクはランタイム(仮想マシン)内でのみ行われます。
含める理由の1つは、特定のプロジェクトに固有のコードから、再利用したいコード(共通定義など)を分離することです。Javaは、ファイルごとに1つのクラスまたはインターフェースのみを指定することを望みます。これにより、インクルードヘッダーの必要性がほとんど減ります。これは、独自のファイルにすでにある共有部分を用意するためです。
また、コンパイラとビルドシステムは、プリコンパイルされたヘッダーをキャッシュして、複数回解析しないようにしたい場合があります。