1

コンパイル時に無限ループに入る可能性はありますか?

プログラムをコンパイルしようとすると、プログラムが無限ループに入るようです。メソッド gameRun() を呼び出すクラス コンストラクターを持つクラスがあります。gameRun() は実行の最後に自分自身を呼び出しますが、実行時に中断できるように適切なチェックが必要です...しかし、クラスをコンパイルしようとすると、実際には無限ループが発生するようです。

コンパイルについての私の理解は、実際にはコードを実行しないということです...つまり、コンパイラのソースに実際に重大なバグがない限り、無限ループに入ることが不可能になるということです。これは正しいです?

私は Java で書いており、IDE として BlueJ (初心者向けの IDE) を使用しています。

前もって感謝します。

...................................................

皆様、参考になる回答をたくさんありがとうございました。これはいくらかの関心を集めたようで、私自身も興味があるので、更新を投稿しようと思いました.

プロジェクトからソースファイルを取得し、Eclipseで正常にコンパイルして実行できたため、元のエラーを投稿して以来、BlueJまたはこのエラーで多くのことを行っていません。これは、BlueJ (または関連する) の問題であることを示唆しています。私は、この性質の問題を解決することなく、日食を使用してこのプロジェクトに取り組み続けてきました。元のプロジェクトでマシンを再び使用できるようになったら、問題の詳細をフォローアップします。(それ以来、何も変更されていないはずです)

...................................................

後付けとして...この投稿後に作成して登録したアカウントにこの質問をリンクする方法はありますか? それを行う方法が見つかりません。これを追跡するのがより便利になります...

4

7 に答える 7

7

一部の言語では、コンパイラが無限ループに入ることを許可しています。Java はそれらの言語の 1 つではありません。:-)

于 2009-10-07T22:12:44.577 に答える
4

そうです、コンパイラはコードを実行せず、バグのために無限ループに入るだけです。javacSun のコンパイラにはそのようなバグはないと確信しています。

BlueJ が「裏で」使用しているコンパイラはわかりませんが、Ant を実行すると、コンパイルに非常に長い時間がかかるという問題が発生しましjavac簡単に言うと、Ant がコンパイラーに、特定のディレクトリーの下にあるすべてのクラスをロードするように指示する場合があります。そのディレクトリに何百ものサードパーティ ライブラリが含まれている場合、時間がかかるか、メモリが不足することさえあります。

于 2009-10-07T22:18:56.410 に答える
2

javacだけを使用すると、コンパイルがハング (ループ) しますか?

Java のコンパイル中にコンパイルが無期限にハングアップするのを見たことはありませんが、代わりに BlueJ に問題があるのではないかと考えています。

于 2009-10-07T22:14:37.367 に答える
1

BlueJ が独自のコンパイラを使用している場合は、そのコンパイラ、またはそれを取り囲む BlueJ のビルド ツールにバグが見つかった可能性があります。

これに対してBinaryChopアプローチを採用することもできます。プログラムを分割して個別にコンパイルし、コンパイラがハングする動作を小さな特定のテストケースに分離できるかどうかを確認します。最終的には、BlueJ の人々に見せる優れたバグ レポートを作成するか、プログラムが実際にコンパイルされることを確認できます (ただし、頭を悩ませることになります)。

于 2009-10-07T22:19:51.630 に答える
1

AFAIK、標準Javaは無限にコンパイルできません。

問題は、BlueJ が提供する他の機能ではなく、コンパイルにあると確信していますか? 多くの Eclipse ベースの IDE は再構築中に複数のアクションを実行しますが、そのコンパイルはその 1 つにすぎません。他の何かが行われる可能性があります。

あなたは正確に何を見ますか?終わりのない Eclipse タスク?

于 2009-10-07T22:21:56.977 に答える
1

たとえば、ファイルをコンパイルするには、コンパイラが最初にそのファイルのコンパイルを終了する必要がある場合、理論的には可能です。(ああ...再帰)。しかし、そのような狂気をチェックすることは、実際のコンパイラが処理する最初のことだと思います。

しかし、コンパイラが末尾再帰をより単純な実装に解決しようとして失敗しない限り、メソッド/関数でそれが起こるとは思いません。しかし、たとえそれが存在したとしても、それが最新の Java コンパイラの問題になるとは思えません。確かに、コンパイラは無限ループではなく、最終的にあきらめてエラーを投稿すると思います。

コンパイラよりもIDEである可能性がはるかに高いです。推測では、IDE が警告/エラーをコード内のソースまで追跡して強調表示し、トラップしようとしている可能性があります。BlueJ にはコンパイラ エラー/警告のテキスト強調表示がありますか? オフにしてみてください。

ただし、他の多くの人がすでに示唆しているように、最初の実際のテストは、次を使用してコマンドラインからコンパイルすることです

javac *.java

または、コードが使用するファイル。

編集:申し訳ありませんが、私はあなたに戻っていません. 今後の参考のために、コマンド ラインからコンパイルするには (OS として Windows を想定しています):

  1. [スタート] メニューに移動してコマンド ラインを開き、[実行...] を選択します。
  2. [ファイル名を指定して実行] ダイアログに cmd と入力し、[OK] をクリックします。
  3. これにより、cmd.exe コンソールが表示されます。
  4. ここから、「cd」コマンドを使用して、ディレクトリを Java ファイルを含むディレクトリに変更します。(cd "My Documents\Java\Monster Battle\core")
  5. 正しいディレクトリに移動したら、「javac *.java」と入力します。これにより、IDE を処理する必要なくコンパイラが実行されます。コンパイル中に一時停止する必要があり、完了すると、コマンド プロンプトが返されます。
  6. 「javac *.java -verbose」と入力すると、無限ループが発生した場合に備えて、完全な出力が得られます。

それが正常に機能する場合、それは IDE のバグです。バグレポートを送ってください。そうでない場合は、おめでとうございます。あなたは、非常に興味深いものを見つけました。おそらく、貧しい Sun の開発者を 1 か月拘束することになるでしょう。

于 2009-10-07T22:22:30.137 に答える
0

コンパイルするソース コードをできるだけ小さくして、説明した動作を示すようにしてください。そうするプロセスは、問題が何であるかを特定するのに役立つ場合があります。

于 2009-10-07T22:29:13.857 に答える