いいえ。Javaコンパイラは、期待どおりの処理を実行する必要があります。正常に返され、例外が発生した場合Success!
はprintを実行します。これは一般的なJavaのセマンティクスに由来し、コンパイラーが行う可能性のあるコンパイラーの最適化とは無関係です(どの最適化が合法であるかを制約する場合を除く)。Myclass.someFunction()
Fail!
その理由は、Java言語仕様では、単一のスレッド内で、プログラムはステートメントが上から下に順番に実行されたかのように正確に動作する必要があると規定されているためです。コンパイラは、バイトコードを生成するために、あらゆる種類の直感的でない方法でプログラムを自由に書き直すことができますが、単一のスレッド内で、ソースコードに入力したステートメントを正しい順序で正確に実行しているという錯覚を維持する必要があります。
Java言語仕様は、それをマルチスレッドコンテキストにも拡張でき、すべてのスレッドは、入力したソースコードを正確に実行するすべてのスレッドと一致する世界の状態を常に確認する必要があると述べています。ただし、(a)正しいコンパイラ最適化を書くことを非常に難しくし、そうでなければ有用な最適化の多くは違法になります。(b)とにかく適切な同期の必要性を排除しないので、プログラマーにはあまり役に立ちません。ほとんどの場合、壊れたプログラムを明らかに壊れていないプログラムに変えるだけです。
代わりに、Javaメモリモデルは、あるスレッドのメモリ変更が他のスレッドに表示される場合の正確なルールを定義し、コンパイラがそれ以外の場合に必要なことを実行できるようにします。これは、プログラマーにマルチスレッドプログラムが正しいことを確認するために使用できる一連のルールを提供すると同時に、コンパイラーの作成者に適切な最適化を実装する余地を与えるため、適切な妥協案です。
しかし、あなたの質問の重要なポイントは、コンパイラは舞台裏でやりたいことを何でもできるということですが、プログラムの意味を変更することは許可されていません。シングルスレッドのコンテキストでは、プログラムの意味は明確に定義されており、コンパイラーが考えていた悪いことを実行することはできません。