Stack的package.yaml需要什么默认构建选项?

时间:2018-04-17 07:12:01

标签: haskell haskell-stack

创建新的Stack项目时,可执行文件将获得以下ghc-options

- -threaded
- -rtsopts
- -with-rtsopts=-N

查看man ghc,我发现了以下内容:

   -threaded
          Use the threaded runtime
   -rtsopts[=⟨none|some|all⟩]
          Control whether the RTS behaviour can be tweaked via command-lineflags and the GHCRTS environment variable. Using none means no RTS
          flags  can  be  given;  some means only a minimum of safe options can be given (the default), and all (or no argument at all) means
          that all RTS flags are permitted.

   -with-rtsopts=⟨opts⟩
          Set the default RTS options to ⟨opts⟩.

这几乎没有告诉我什么。线程运行时是指引用编译器的运行时还是生成的可执行文件的运行时?这些rtsopts是什么?这些选择是否有益?如果是,为什么它们不是默认值?为什么可执行文件不能获取它们和库代码:

library:
  source-dirs: src
  # notice no ghc-options field here!

1 个答案:

答案 0 :(得分:6)

它指的是生成的可执行文件的运行时。这些选项允许最终程序运行多线程,即在多核机器上利用并行或并发执行。这对于性能而言尤其有利,特别是对于交互式应用程序的响应性(有些在没有使用线程运行时运行时几乎或几乎无法使用)。

运行时始终只链接到可执行文件;您可能会认为它类似于执行字节码程序的Java虚拟机,除了Haskell运行时更加精简并且不需要实际执行大量代码解释,它主要只是处理内存需求并分配Haskell线程到OS线程。

因此链接到库,除非在可执行文件中使用库时最后。这就是该选项未出现在library部分的原因。 (虽然, 实际上非常方便,如果库有办法表明“当你在exectuable中使用它时,它应该与线程运行时链接”,但这会产生分歧而且我不会我认为有什么可以允许这样的东西。)