もし私が本当にこれをやらなければならなかったら、おそらく#1のアプローチから始めるでしょう - JVMバックエンドを既存のコンパイラに追加してください。しかし、私はまた、別のターゲットVMを主張しようとします。
WebSharperの著者として、引用するとF#のような優れたプログラムを書くことができますが、制限があり、最適化されていないことを保証できます。潜在的なJVM F#ユーザーのために、バーはもっと高いでしょう - 完全な言語互換性とそれに匹敵するパフォーマンスだと思います。これは非常に難しいです。
たとえば、テールコールを実行します。 WebSharperでは、ヒューリスティックを適用して、JavaScriptのループへのローカルテールコールを最適化しますが、それだけでは不十分です。一般的なF#ライブラリのように、一般的にTCOに頼ることはできません。これはWebSharperにとっては問題ありません。ユーザーは完全なF#を期待していませんが、JVMのF#ポートではOKではありません。私はほとんどのJVMの実装はTCOを行わないと考えているので、間接的に実装しなければならず、パフォーマンスが低下します。
@mythzで言及されているバイトコードの再コンパイルのアプローチは、F#を移植する以外にも理想的です。理想的には、JVMに.NETソフトウェアを移植することができます。内部のWebSharper 3.0プロジェクトで.NETバイトコード解析を行ったところ、JavaScriptのF#引用ではなく.NETバイトコードをコンパイルするオプションが検討されています。
BCLのコードの多くは不透明(ネイティブ)である - そしてあなたはそれが
ジェネリックモデルはかなり複雑でコンパイルすることはできません。しかし、そこに巨大な課題があります。私は、クラスとメソッドのジェネリック、インスタンス化、型生成、および基本的なリフレクションを、精度と妥当なパフォーマンスでモデリングするJavaScriptランタイムを実装しました。これは、クロージャを使用した動的JavaScriptでは難しく、JVMでパフォーマンスを上げるのはかなり難しいようですが、単純な解決策は見当たりません。
値の種類によって、バイトコードに重大な複雑さが生じます。私はWebSharper 3.0のためにこれをまだ理解していません。それらは、あなたが移植したい多くのライブラリによって広く使われているので、無視することもできません。
同様に、基本リフレクションは多くの現実の.NETライブラリで使用されています。また、ネイティブコードとジェネリックスと値型の適切なサポートの両方でクロスコンパイルするのは難しいことです。
また、バイトコードアプローチでは、テールコールの実装方法に関する質問は削除されません。 AFAIK、Scalaはテールコールを実装していません。彼らは確かに才能とそれを行うための資金を持っています - 彼らはそうではないという事実は、JVM上でTCOを実践することがどれほど実用的かを私に教えてくれます。私たちの.NET - > JavaScriptポートでは、私はおそらく同様のルートに行くでしょう - あなたが特に動作するトランポリングを求めない限り、TCOの保証はありませんが、パフォーマンスには1桁または2桁のコストがかかります。
は、[ハッカーニュース]にフィヨルドにいくつかの最近の議論に注目する価値があるかもしれません(https://news.ycombinator.com: - 限りF#のように> JVMが懸念している、私は2つの非常にない生産準備オプションに出くわしました/ item?id = 5464925)、[Reddit](http://www.reddit.com/r/fsharp/comments/1b8nqg/fjord_implementation_of_f_for_the_jvm/)、プロジェクトの[Issues](https://github.com/penberg/fjord/issues/1)page –