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 批量完成工作,但在运行 mutators 的同时进行,例​​如,我在此处的非免费文章中描述的 VCGC 实现以亚毫秒级的暂停时间运行。

  • 增量 GC 并不一定意味着低暂停时间。例如,OCaml 的 GC 通常会产生 10ms 的暂停,并且在遇到深线程堆栈或堆中的长数组时会产生任意长的暂停。

我在 .NET 3 上用 OCaml 测量了 10 毫秒的典型暂停时间,用 F# 测量了 30 毫秒。通过一个简单的实现,我能够从头开始在 F# 中构建一个容错服务器,它可以处理 20k msgs/s 和 50% 的延迟时间低于 114us 和95% 低于 500us。

我用 F# 编写了一种语言,如果 -

a) 面对分代 GC(交互式模拟期间的任意停顿,以及

我不会放弃这个平台,因为你的第一个工作版本有不可接受的延迟。您可以做很多事情来降低最大延迟。

b) OCaml 获得了到 LLVM 后端的良好完整端口 -

我严重怀疑 OCaml 是否会得到我认为的“到 LLVM 后端的良好完整端口”。他们只会使用当前的无类型 IR 重新定位 LLVM,并且它不会比当前的ocamlopt编译器做得更好,因为 LLVM 并非旨在优化这种工作负载。

我会将它从 F# 移植到 OCaml。我尽可能多地避免使用特定于 .NET 的库,并且由于 F# 的语法基于 OCaml,我假设应该有一些自动化工具来帮助转换代码。

没有自动化工具,但我现在在 OCaml 和 F# 之间移植了数十万行代码,这通常非常容易,因为大多数代码都是用两种语言的核心 ML 子集编写的。

于 2012-08-09T22:48:37.270 回答