34

現在の F# コンパイラは F# で書かれており、オープン ソースであり、.Net および Mono 上で動作し、Windows、Mac、Linux を含む多くのプラットフォームで実行できます。F# のコードクォーテーション メカニズムは、 WebSharperPitFunScriptなどのプロジェクトで F# を JavaScript にコンパイルするために使用されています。JVM で F# コードを実行することにも関心があるようです。

OCaml コンパイラのバージョンは、もともとF# コンパイラのBootstrapに使用されていたと思います。

JVM で実行される F# コンパイラを構築したい場合は、次のようにする方が簡単です。

  1. 既存の F# コンパイラを変更してJava バイトコードを発行し、それを使用して F# コンパイラをコンパイルしますか?
  2. Yetiのような JVM ベースの ML コンパイラを使用して、JVMで最小限の F# コンパイラをブートストラップしますか?
  3. fjordプロジェクトが試みているように見えるので、Java で F# コンパイラをゼロから書き直しますか?
  4. 他の何か?
4

6 に答える 6

12

おそらく考慮すべきもう 1 つのオプションは、http: //www.ikvm.net が JVM > CLR バイト コードで行うように、.NET CLR バイト コードを JVM バイト コードに変換することです。このアプローチは、フィヨルドの所有者によって検討され、却下されましたが

オプション 1) でトップから賛同を得て、F# コンパイラ チームに、理論上は最も洗練されたソリューションを生成するような Java バイトコード サウンドを出力できるプラグ可能なバックエンドを用意してもらいます。

しかし、異なるプラットフォームに移植された他の言語を見ると、これはめったにありません。ほとんどの場合、最初から書き直されています。しかし、これはおそらく、元の言語チームが代替プラットフォーム自体をサポートすることに関心がなく、元のホスト実装が複数のバックエンドをサポートできなかった可能性があり、これを最初から実行可能なオプションにするには遅すぎるためです。 .

私の推測では、最初から書き直し、元の実装から可能な限り多くのコード共有と自動化を行うことができるという組み合わせです。たとえば、両方の実装でテスト スイートを再利用できれば、JVM ポートの負荷が大幅に軽減され、言語の同等性を確保するのに大いに役立ちます。

于 2013-03-31T17:09:26.083 に答える
9

OCaml を JVM にコンパイルするプロジェクトOCaml-Javaがあります。これはかなり完成度が高く、特に OCaml のコンパイラ (OCaml で記述) ソースをコンパイルできます。F# 言語のどの側面に興味があるかはわかりませんが、主に成熟した厳密な型付き関数型言語を JVM に導入することを検討している場合、それは良い選択肢かもしれません。

于 2013-03-31T17:22:06.017 に答える
8

どのアプローチも大変な作業になると思いますが、最初の提案は、多くの非互換性やバグの追加を回避する唯一の提案だと思います. コンパイラは非常に複雑で、オーバーロードの解決などには多くのコーナー ケースがあります (仕様にもおそらくギャップがあります)。そのため、新しい実装が一貫して互換性のあるセマンティクスを持つ可能性は非常に低いと思われます。

于 2013-03-31T16:52:03.030 に答える
1

既存の F# コンパイラを変更して Java バイトコードを発行し、それを使用して F# コンパイラをコンパイルしますか? Yeti のような JVM ベースの ML コンパイラを使用して、JVM で最小限の F# コンパイラをブートストラップしますか?

F# で記述されている場合、コンパイラの移植はそれほど難しくありません。

これは、新しいコンパイラと .net F# コンパイラとの同期を維持する唯一の方法であるため、おそらく最初の方法を使用します。

fjord プロジェクトが試みているように見えるので、Java で F# コンパイラをゼロから書き直しますか?

これは確かに最も洗練されていないアプローチです。

他の何か?

コンパイラが完了すると、残りの作業は 90% になります。

たとえば、F# についてはあまり詳しくありませんが、.NET ライブラリは簡単に使用できると思います。つまり、基本的な問題は、何らかの形で .NET エコシステムを移植することです。

于 2013-04-02T14:11:24.027 に答える
0

F# から Akka へのトランスレータ/コンパイラに似ていましたが、同様の行で何かを探していました。F# -> JVM に関する限り、本番環境に対応していない 2 つのオプションを見つけました。

  1. F# -> [Fjord][1] -> JVM.

  2. F# -> [Funscript][2] -> [Vert.X][3] -> JVM
于 2013-12-01T14:23:35.760 に答える