私はこの質問でこの引用を見ました:Webサービスを構築するための優れた関数型言語は何ですか?
特にScalaは、自己再帰関数を除き、末尾呼び出しの除去をサポートしていません。これにより、実行できる構成の種類が制限されます(これは、JVMの基本的な制限です)。
これは本当ですか?もしそうなら、この基本的な制限を作成するのはJVMについて何ですか?
私はこの質問でこの引用を見ました:Webサービスを構築するための優れた関数型言語は何ですか?
特にScalaは、自己再帰関数を除き、末尾呼び出しの除去をサポートしていません。これにより、実行できる構成の種類が制限されます(これは、JVMの基本的な制限です)。
これは本当ですか?もしそうなら、この基本的な制限を作成するのはJVMについて何ですか?
回答:
この投稿:再帰か反復か?役立つかもしれません。
つまり、セキュリティモデルとスタックトレースを常に利用できるようにする必要があるため、JVMでテールコールの最適化を行うのは困難です。これらの要件は理論的にはサポートできますが、おそらく新しいバイトコードが必要になります(John Roseの非公式提案を参照)。
Sunバグ#4726340にも詳細な説明があり、評価(2002年から)が終了します。
それでもそれは可能だと思いますが、それは小さな仕事ではありません。
現在、Da Vinci Machineプロジェクトでいくつかの作業が行われています。末尾呼び出しサブプロジェクトのステータスは「proto 80%」と表示されます。Java 7になる可能性は低いですが、Java 8での可能性は非常に高いと思います。
基本的な制限は、JVMがそのバイトコードでテールコールを提供しないことであり、その結果、JVM上に構築された言語がテールコール自体を提供する直接的な方法はありません。同様の効果(トランポリンなど)を実現できる回避策はありますが、パフォーマンスが著しく低下し、生成された中間コードが難読化されてデバッガーが役に立たなくなります。
したがって、SunがJVM自体にテール呼び出しを実装するまで、JVMは本番品質の関数型プログラミング言語をサポートできません。彼らは何年もの間それについて議論してきましたが、私は彼らがテールコールを実装することはないだろうと思います:彼らはそのような基本的な機能を実装する前にVMを時期尚早に最適化しており、Sunの努力は関数型言語ではなく動的言語に重点を置いているため非常に困難です。
したがって、Scalaは実際の関数型プログラミング言語ではないという非常に強力な議論があります。これらの言語は、30年以上前にSchemeが初めて導入されて以来、末尾呼び出しを必須の機能と見なしています。
Hence there is a very strong argument that Scala is not a real functional programming language
-議論は実際には非常に弱いです。確かにありtail calls [as] an essential feature
、基盤となるハードウェア(または仮想マシン)が直接サポートしている場合は便利です。しかし、それは実装の詳細です。
Scala 2.7.xは、最終メソッドとローカル関数の自己再帰(それ自体を呼び出す関数)の末尾呼び出しの最適化をサポートしています。
Scala 2.8には、トランポリンのライブラリサポートも含まれている可能性があります。これは、相互再帰関数を最適化するための手法です。
Scala再帰の状態に関する多くの情報は、Rich Doughertyのブログにあります。
Lambda The Ultimateでリンクされた論文(上記の投稿されたリンクより)に加えて、SunのJohn Roseは、テールコールの最適化についてもう少し述べています。
http://blogs.oracle.com/jrose/entry/tail_calls_in_the_vm
いつかJVMに実装されるかもしれないと聞いています。特に、Da Vinci Machineでテールコールのサポートが検討されています。
すべてのソースは、末尾再帰の場合にJVMが最適化できないことを示していますが、Javaパフォーマンスチューニング(2003、O'reilly)を読んだとき、著者は末尾再帰を実装することで再帰パフォーマンスを向上できると主張しました。
彼の主張は212ページで見つけることができます(「末尾再帰」を検索すると、2番目の結果になります)。何ができますか?