1. ホーム
  2. java

[解決済み] なぜJVMはテールコールの最適化をまだサポートしていないのですか?

2023-01-20 13:51:49

質問

2年後 does-the-jvm-prevent-tail-call-optimizations があるようです。 プロトタイプ 実装 そして MLVM は、しばらくの間、この機能を "proto 80%" としてリストアップしていました。

テールコールをサポートすることに Sun/Oracle 側から積極的な関心がないのか、それともテールコールが "[...] であることだけなのでしょうか。

すべての機能の優先順位リストで 2 番目に来る運命にあるのでしょうか。 [...]" で言及されているとおりです。 JVM 言語サミット ?

もし誰かがMLVMビルドをテストして、それがどれくらいうまく機能するか(もしそうなら)、いくつかの印象を共有できれば、本当に興味深いです。

更新しました。 のような VM があることに注意してください。 エイリアン は、問題なく適切なテールコールをサポートします。

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

Java コードを診断する Java コードのパフォーマンスを向上させる ( alt ) は、なぜJVMがテールコールの最適化をサポートしないのかを説明しています。

しかし、末尾再帰関数を単純なループに自動的に変換する方法はよく知られていますが、Java の仕様ではこの変換が行われることは要求されていません。おそらく、要求されていない理由の1つは、一般にオブジェクト指向言語では変換を静的に行うことができないからだと思われます。その代わり、末尾再帰関数から単純なループへの変換は、JIT コンパイラーによって動的に行われる必要があります。

そして、変換されないJavaコードの例を挙げています。

つまり、リスト 3 の例が示すように、静的コンパイラーが言語のセマンティクスを維持しながら Java コードの末尾再帰の変換を行うことは期待できないのです。代わりに、JIT による動的コンパイルに頼らなければなりません。JVM に応じて、JIT はこれを行うこともあれば、行わないこともあります。

そして、JITがこれを行うかどうかを把握するために使用することができるテストを提供しています。

当然ながら、これはIBMの論文であるため、プラグインが含まれています。

私はこのプログラムをいくつかの そしてその結果は驚くべきものでした。 驚くべきことに Sun の Hotspot で実行したところ JVMで実行すると、バージョン1.3では Hotspotは変換を実行しない の変換を行わないことがわかりました。デフォルトの設定では スタックスペースは私のマシンでは1秒以内に 私のマシンでは、スタックスペースは1秒未満で使い果たされます。 一方 一方、IBMのバージョン1.3のJVMは、問題なく動作しています。 は問題なく動いている。 このようにコードを変換していることを示す コードをこの方法で変換していることを示しています。