1. ホーム
  2. java

[解決済み] 特定のUnicode文字を含むコメントでのJavaコードの実行が許可されているのはなぜですか?

2022-03-17 03:36:53

質問

次のコードは "Hello World!" という出力を生成します(いや、本当に試してみてください)。

public static void main(String... args) {

   // The comment below is not a typo.
   // \u000d System.out.println("Hello World!");
}

この理由は、Java コンパイラが Unicode 文字の \u000d を改行として取得し、変換されます。

public static void main(String... args) {

   // The comment below is not a typo.
   //
   System.out.println("Hello World!");
}

その結果、コメントが実行されることになります。

これは、悪意のあるコードや邪悪なプログラマーが思いつくものを隠すために使われることがあるからです。 なぜコメントで許されるのか ?

なぜJavaの仕様ではこれが許されるのですか?

どのように解決するのですか?

Unicodeのデコードは、他のどの字句変換よりも先に行われます。これの重要な利点は、ASCIIと他のどのエンコーディングの間でも、行ったり来たりするのが簡単になるということです。コメントがどこで始まり、どこで終わるかを把握する必要さえありません。

で述べたように JLSセクション3.3 これにより、ASCIIベースのツールでソースファイルを処理することができます。

[...] Javaプログラミング言語は、Unicodeで書かれたプログラムをASCIIに変換する標準的な方法を規定しており、プログラムをASCIIベースのツールで処理できる形に変更します。[...]

これは、Javaプラットフォームの重要な目標であったプラットフォームの独立性(サポートする文字セットの独立性)を根本的に保証するものです。

ファイルのどこにでもUnicode文字を書くことができるというのは、すてきな機能で、特にコメントでは、非ラテン言語でコードを文書化するときに重要です。このような微妙な方法でセマンティクスに干渉することがあるという事実は、(残念な)副作用に過ぎません。

このテーマには多くのゴチャゴチャがあり Java パズラー Joshua BlochとNeal Gafterによる以下のような変種が含まれていました。

これは合法的なJavaプログラムですか?もしそうなら、それは何を表示するのでしょうか?

\u0070\u0075\u0062\u006c\u0069\u0063\u0020\u0020\u0020\u0020
\u0063\u006c\u0061\u0073\u0073\u0020\u0055\u0067\u006c\u0079
\u007b\u0070\u0075\u0062\u006c\u0069\u0063\u0020\u0020\u0020
\u0020\u0020\u0020\u0020\u0073\u0074\u0061\u0074\u0069\u0063
\u0076\u006f\u0069\u0064\u0020\u006d\u0061\u0069\u006e\u0028
\u0053\u0074\u0072\u0069\u006e\u0067\u005b\u005d\u0020\u0020
\u0020\u0020\u0020\u0020\u0061\u0072\u0067\u0073\u0029\u007b
\u0053\u0079\u0073\u0074\u0065\u006d\u002e\u006f\u0075\u0074
\u002e\u0070\u0072\u0069\u006e\u0074\u006c\u006e\u0028\u0020
\u0022\u0048\u0065\u006c\u006c\u006f\u0020\u0077\u0022\u002b
\u0022\u006f\u0072\u006c\u0064\u0022\u0029\u003b\u007d\u007d

(このプログラムは、単なる "Hello World" プログラムであることがわかります)。

パズドラの解答では、次のように指摘されています。

<ブロッククオート

さらに言えば、このパズルは、前の3つのパズルの教訓を補強する役割を担っています。 Unicodeエスケープは、他の方法では表現できない文字をプログラムに挿入する必要がある場合に不可欠です。それ以外の場合は避けてください。


出典 Javaです。コメントでコードを実行するのか!?