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,我假设应该有一些自动化工具来帮助转换代码.
有人知道这些事情,无论是已完成还是正在进行中?
非常感谢!
在答案中回答你的问题 - 据我所知,没有这样的工具,我认为不可能有人会创造它们.
尽管F#受到OCaml的启发,但它已经发展了很多并且在很多方面都有所不同(参见本SO讨论),因此自动转换并非易事.即使有人这样做,也更像是编译难以阅读OCaml而不是转换为惯用代码,以后可以继续使用.
添加一些一般性评论,当你谈到"实时"时,我想象一下在工厂里控制一些处理危险物品或飞机控制的机器人.在这些领域,对GC的担忧肯定是有效的.但是,我不认为游戏必然是"实时"的.你需要良好的性能,这是肯定的,但人们一直在用.NET和F#编写游戏.对于一些F#示例,请参阅:
这些可能比你的目标更简单,但它可能足以证明使用GC编写游戏是可行的.
不幸的是,由于.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子集编写的.