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

Bry*_*dds 4 f# porting ocaml real-time llvm

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

a)面对代际GC(在交互式仿真期间任意暂停,并且b)OCaml获得LLVM后端的良好完整端口时,它不能充分执行 -

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

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

非常感谢!

Tom*_*cek 6

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

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

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

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

  • 游戏属于"软实时"软件.对于使用更为全面的术语表示歉意.我不时阅读约翰的博客.其中很大一部分是关于如何使用必要的技术来使游戏在F#中运行.你不仅需要将F#编程为C#,你甚至不能使用C#的功能习语.我害怕,我不愿意依赖这些技术.续... (2认同)

Jon*_*rop 6

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

这里有几点:

  • 增量GC不是获得低暂停时间的唯一方法.像VCGC并发选区做大量的工作,但与存取器运行,如我的非自由文章中描述的VCGC实现做同时在这里用流水亚毫秒级的暂停时间.

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

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

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

a)面对代际GC(在交互式模拟过程中的任意暂停),它不能充分发挥作用

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

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

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

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

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