99

Web サービスを構築するのに適した関数型言語は何ですか?という質問に関するこの引用を見ました。

特に Scala は、実行できる構成の種類を制限する自己再帰関数を除き、末尾呼び出しの削除をサポートしていません (これは JVM の基本的な制限です)。

これは本当ですか?もしそうなら、この根本的な制限を生み出すのは JVM について何ですか?

4

5 に答える 5

75

この投稿:再帰か反復か? 役立つかもしれません。

つまり、セキュリティ モデルとスタック トレースを常に利用できるようにする必要があるため、JVM でテール コールの最適化を行うのは困難です。これらの要件は、理論上はサポートされる可能性がありますが、おそらく新しいバイトコードが必要になるでしょう ( John Rose の非公式提案を参照)。

評価 (2002 年以降) が終了するSun のバグ #4726340にも、さらに多くの議論があります。

それにもかかわらず、これは実行できると思いますが、簡単な作業ではありません。

現在、ダ・ヴィンチ・マシン・プロジェクトでいくつかの作業が進行中です。テール コール サブプロジェクトのステータスは「proto 80%」と​​表示されます。Java 7 で実現する可能性は低いですが、Java 8 で実現する可能性は非常に高いと思います。

于 2008-09-19T21:44:48.400 に答える
27

基本的な制限は、JVM がそのバイト コードでテール コールを提供しないことです。したがって、JVM 上に構築された言語がテール コール自体を提供する直接的な方法はありません。同様の効果を達成できる回避策 (トランポリンなど) がありますが、パフォーマンスが大幅に低下し、生成された中間コードが難読化され、デバッガーが役に立たなくなります。

そのため、Sun が JVM 自体に末尾呼び出しを実装するまで、JVM は製品品質の関数型プログラミング言語をサポートできません。彼らはそれについて何年も議論してきましたが、テールコールを実装することはないと思います.そのような基本的な機能を実装する前にVMを時期尚早に最適化しているため、非常に難しいでしょう.Sunの努力は関数型言語ではなく動的言語に重点を置いています.

したがって、Scala は真の関数型プログラミング言語ではないという非常に強い議論があります。これらの言語は、Scheme が 30 年以上前に初めて導入されて以来、末尾呼び出しを不可欠な機能と見なしてきました。

于 2008-11-06T02:38:57.170 に答える
22

Scala 2.7.x は、最終メソッドとローカル関数の自己再帰 (自分自身を呼び出す関数) の末尾呼び出しの最適化をサポートしています。

Scala 2.8 には、相互再帰関数を最適化する手法であるトランポリンのライブラリ サポートも含まれる可能性があります。

Scala 再帰の状態に関する多くの情報は、Rich Dougherty のブログにあります。

于 2009-06-19T02:12:32.923 に答える
8

Lambda The Ultimate にリンクされている論文 (上記のリンク mmyers から) に加えて、Sun の John Rose がテール コールの最適化についてさらに述べています。

http://blogs.oracle.com/jrose/entry/tail_calls_in_the_vm

いつかJVMに実装されるかもしれないと聞いています。Da Vinci Machine では、とりわけテール コールのサポートが検討されています。

http://openjdk.java.net/projects/mlvm/

于 2008-09-19T22:23:48.523 に答える
0

すべてのソースは、JVMが末尾再帰の場合に最適化できないことを指摘していますが、Javaパフォーマンスチューニング(2003、O'reilly)を読んだときに、著者が末尾再帰を実装することでより高い再帰パフォーマンスを達成できると主張していることがわかりました。

彼の主張は212ページにあります(「末尾再帰」を検索すると、2番目の結果になるはずです)。何が得られますか?

于 2010-12-01T14:55:53.650 に答える