4

残念ながら、.NETにはインクリメンタルGC(MSまたはMono実装のいずれか)がないため、F#を使用したゲームなどのソフトリアルタイムソフトウェアの構築には問題があります。私はF#で言語を書きました。

a)世代別GCに直面しても十分に機能しません(インタラクティブシミュレーション中の任意の一時停止、およびb)OCamlはLLVMバックエンドへの完全な移植を取得します-

F#からOCamlに移植します。.NET固有のライブラリはできるだけ避けました。また、F#の構文はOCamlに基づいているため、コードの変換を支援する自動化ツールが必要だと思います。

誰かがそのようなことを知っていますか、終了したか進行中ですか?

どうもありがとうございました!

4

2 に答える 2

6

答えであなたの質問に答えるために-私が知る限り、そのようなツールはなく、誰かがそれらを作成する可能性は低いと思います。

F#はOCamlに触発されていますが、大きく進化し、さまざまな点で異なります(このSOの説明を参照)。したがって、自動変換は簡単ではありません。誰かがそれをしたとしても、後で作業を続けることができる慣用的なコードへの変換よりも、読みにくいOCamlへのコンパイルのようなものです。

いくつかの一般的なコメントを追加すると、「リアルタイム」について話すとき、私は危険なものや飛行機の制御を扱う工場でロボットを制御することを想像します。これらの分野では、GCに関する懸念は確かに有効です。ただし、ゲームは必ずしも「リアルタイム」ではないと思います。確かに、優れたパフォーマンスが必要ですが、人々は.NETとF#を使用してゲームを非常に喜んで書いています。F#の例については、以下を参照してください。

これらはおそらくあなたが目指しているものよりも単純ですが、GCを使用してゲームを書くことが実行可能であることを示すのに十分かもしれません。

于 2012-07-09T16:25:21.187 に答える
6

残念ながら、.NETにはインクリメンタルGC(MSまたはMono実装のいずれか)がないため、F#を使用したゲームなどのソフトリアルタイムソフトウェアの構築には問題があります。

ここにいくつかのポイント:

  • インクリメンタルGCは、休止時間を短くする唯一の方法ではありません。VCGCのような並行GCは一括して作業を行いますが、ミューテーターの実行と同時に実行します。たとえば、ここで非フリーの記事で説明したVCGC実装は、ミリ秒未満の休止時間で実行されていました。

  • インクリメンタルGCは、必ずしも一時停止時間が短いことを意味するわけではありません。たとえば、OCamlのGCは通常10msの一時停止が発生し、ヒープ内の深いスレッドスタックまたは長い配列に遭遇すると、任意の長さの一時停止が発生する可能性があります。

.NET 3でOCamlを使用して10ミリ秒、F#を使用して30ミリ秒の一般的な一時停止時間を測定しました。簡単な実装で、F#でフォールトトレラントサーバーをゼロから構築できました。 500us未満で95%。

私はF#で言語を書きました。

a)世代別GCに直面しても、適切に機能しません(インタラクティブシミュレーション中の任意の一時停止、および

私はプラットフォームをあきらめません。あなたの最初の作業バージョンには許容できない遅延があります。最大レイテンシーを下げるためにできることはたくさんあります。

b)OCamlはLLVMバックエンドへの完全なポートを取得します-

OCamlが「LLVMバックエンドへの完全な移植」と私が考えるものを手に入れることはないだろうと私は真剣に疑っています。LLVMは現在のタイプレスIRでリターゲットするだけであり、ocamloptLLVMはその種のワークロードを最適化するように設計されていないため、現在のコンパイラよりもはるかに優れているわけではありません。

F#からOCamlに移植します。.NET固有のライブラリはできるだけ避けました。また、F#の構文はOCamlに基づいているため、コードの変換を支援する自動化ツールが必要だと思います。

自動化されたツールはありませんが、OCamlとF#の間に数十万行のコードを移植しました。ほとんどのコードは両方の言語のコアMLサブセットで記述されているため、一般的に非常に簡単です。

于 2012-08-09T22:48:37.270 に答える