2017-01-29 8 views
2

C/C++のように、プログラムは先にプリプロセッサにファイル&を実行してマクロ展開を実行します。その後、コンパイラに渡してコードをアセンブリ形式に変換してプロセスを実行します。しかしJavaではプリプロセッサの使用法を参照してください。なぜ、なぜプリプロセッサが通常処理するすべてのタスクを担当するのですか?なぜPreproccessorはC&C++のようなJavaプログラムの一部ではないのですか?

答えて

3

プリプロセッサは、Javaのコンパイル処理の必要なステップではありません。

C/C++では、異なるファイルに格納されている関数は他のファイルに "インクルード"されているため、基本的にはコピーされてドキュメント全体に貼り付けられます。当時のハードウェア機能を考えれば、当時はこれはかなり良いアイデアでしたが、現代の言語では「シンボリック・インポート」と呼ばれるものが使用されています。

シンボリックインポートでは、テキストを直接使用するのではなく、別のファイルでシンボルを検索します。 Javaでは、これは定数またはクラスのインポートを伴うことがあります。これらのインポートは、他のファイルのコードへの参照として機能します。したがって、プリプロセッサにコードをコピー&ペーストして最終的にどのファイルがどのファイルに属しているかを把握する必要がなくなり、Javaはこれらのインポートをセマンティックレベルで直接行うことができます。

これは、プリプロセッサを言語のコンパイル処理に不要にするため、他の理由も削除されています。

+0

Sir、意味レベルとは何ですか?私にそれのアイデアを教えてください。 –

+1

コンパイラは、テキスト(入力)、トークン(数字やキーワードなどの意味を持つビットとピース)と、これらのトークンの解析ツリー(どのコードがifステートメント)。意味レベルでコードを見ると、構造化された(構文解析されている)ことがわかり、その中の各シンボルが何を意味するのかを知ることができます。したがって、どの定数が定義されているか、どのクラスがそこにあるかなどを見ることができます。このレベルでコードを分析することは、平文を見るのではなくコードの意味と構造を見ているレベル(...)で作業しているため、意味レベルと呼ばれます( – Bartvbl

+1

(続き))。コンパイルされるコードの意図、意味、構造が分かっているので、ここでは型チェックや最適化など、コンパイラの他の任務を果たすことができます。 – Bartvbl

関連する問題