是否有任何工具可以帮助将F#移植到OCaml?

时间:2012-07-09 15:44:18

标签: f# real-time ocaml llvm porting

不幸的是,由于.NET缺少增量GC(无论是在MS还是Mono实现中),构建软件实时软件(如使用F#的游戏)都存在问题。我用F#编写了一种语言,如果 -

a)面对代际GC(在交互式模拟过程中任意暂停,并且 b)OCaml获得LLVM后端的良好完整端口 -

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

任何人都知道这些事情,无论是已完成还是正在进行中?

非常感谢!

2 个答案:

答案 0 :(得分:6)

在答案中回答你的问题 - 据我所知,没有这样的工具,我认为不可能有人会创造它们。

尽管F#受到了OCaml的启发,但它已经发展了很多并且在很多方面都有所不同(见this SO discussion),因此自动转换并非易事。即使有人这样做,更像是编译难以阅读OCaml而不是转换为惯用代码,以后可以继续使用。

要添加一些一般性评论,当你谈到“实时”时,我想在工厂里控制一些处理危险物品或飞机控制的机器人。在这些领域,对GC的担忧肯定是有效的。但是,我认为游戏不一定是“实时”的。你需要良好的性能,这是肯定的,但人们一直在用.NET和F#编写游戏。对于一些F#示例,请参阅:

这些可能比你的目标更简单,但它可能足以证明使用GC编写游戏是可行的。

答案 1 :(得分:6)

  

不幸的是,由于.NET缺少增量GC(无论是在MS还是Mono实现中),使用F#构建软实时软件(例如游戏)都存在问题。

这里有几点:

  • 增量GC不是获得低暂停时间的唯一方法。像VCGC这样的并发GC可以批量工作,但可以与运行的mutator同时进行,例​​如我在非免费文章here中描述的VCGC实现以亚毫秒的暂停时间运行。

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

我已经使用OCaml测量了10ms的典型暂停时间,在.NET 3上使用F#测量了30ms。通过简单的实现,我能够从头开始在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子集编写的。