残念ながら、.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でリターゲットするだけであり、ocamlopt
LLVMはその種のワークロードを最適化するように設計されていないため、現在のコンパイラよりもはるかに優れているわけではありません。
F#からOCamlに移植します。.NET固有のライブラリはできるだけ避けました。また、F#の構文はOCamlに基づいているため、コードの変換を支援する自動化ツールが必要だと思います。
自動化されたツールはありませんが、OCamlとF#の間に数十万行のコードを移植しました。ほとんどのコードは両方の言語のコアMLサブセットで記述されているため、一般的に非常に簡単です。