如何将 RTS 选项传递给 runghc?

How can I pass RTS options to runghc?

对于ghci,我可以通过

限制ghci可以使用的内存
$ ghci +RTS -M10m -RTS

当我编译整个程序时,我可以

$ ghc -rtsopts a.hs 

然后

$ ./a +RTS -M10m

如何为 runghc a.hs 执行此操作?我尝试了多种方法,例如 runghc a.hs +RTS -M10m ,但其中 none 似乎有效。我可以限制内存的唯一选择是

$ export GHCRTS='-M10m'
$ runghc a.hs

,但我希望这只是一次,所以我更喜欢通过将参数传递给 runghc


编辑:我正在使用以下策略检查该选项是否有效(只是因为我不知道更好的方法):

-- a.hs
f x = f (f x)
main = print $ seq (f 0) 0

打开两个终端,一个用于top命令,另一个用于执行代码。如果执行停止说 "Heap exhausted",我断定 -M[number]m 正在工作。如果执行继续并使用大量内存,我会终止进程并得出结论认为它没有成功。

按照chi的说法使用GHCRTS=... runghc ...是唯一的方法。由于 runghc 解释其命令行的方式,+RTS 被解释为 runghc 本身的 RTS 选项(如果它在末尾)或程序名称(如果它在开头) .它永远不会到达运行时。您可以使用 --RTS +RTS ... 强制将其传递给程序,但随后它被视为程序参数并且运行时仍然看不到它。

为了对此进行调查,我为 ghc 编写了一个包装器 shell 脚本来跟踪其参数,并使用 -f 选项将其传递给 runghc

创建文件 ghc-wrapper 包含:

#!/bin/sh -x
exec ghc "$@"

-x 选项告诉 /bin/sh 跟踪每一行。与 runghc:

一起使用
$ runghc -f ./ghc-wrapper Hello.hs
+ exec ghc -ignore-dot-ghci -x hs -e :set prog "Hello.hs" -e :main [] Hello.hs
Hello, World!

$ runghc -f ./ghc-wrapper Hello.hs +RTS -s
+ exec ghc -ignore-dot-ghci -x hs -e :set prog "Hello.hs" -e :main [] Hello.hs
Hello, World!
    114,016 bytes allocated in the heap # runghc's heap, not Hello's
    ...

$ runghc -f ./ghc-wrapper Hello.hs --RTS +RTS -s
+ exec ghc -ignore-dot-ghci -x hs -e :set prog "Hello.hs" -e :main ["+RTS","-s"] Hello.hs
Hello, World!

$ runghc -f ./ghc-wrapper -- +RTS -s -RTS Hello.hs
+ exec ghc -ignore-dot-ghci -e :set prog "+RTS" -e :main ["-s","-RTS","Hello.hs"] +RTS
+RTS:1:55:
    Not in scope: `main'
    Perhaps you meant `min' (imported from Prelude)

我们真正想要runghc执行的是:

$ ghc -ignore-dot-ghci -x hs +RTS -s -RTS -e ':set prog "Hello.hs"' -e ':main []' Hello.hs
Hello, World!
      80,654,256 bytes allocated in the heap
      ...

但无法具体说明,因为 runghc 没有对 +RTS 进行特殊处理。