如何将RTS选项传递给runghc?

时间:2015-03-30 06:27:22

标签: haskell ghc

对于ghci,我可以通过

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

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

$ ghc -rtsopts a.hs 

然后

$ ./a +RTS -M10m

我如何为runghc a.hs执行此操作?我尝试了几种方法,比如runghc a.hs +RTS -M10m,但它们似乎都没有用。我可以限制内存的唯一选择是

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

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


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

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

打开两个终端,一个用于top命令,另一个用于执行代码。如果执行停止说“堆耗尽”,我得出结论-M[number]m正在运行。如果执行继续并使用大量内存,我会终止该过程,并断定它没有成功。

1 个答案:

答案 0 :(得分:4)

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

为了解决这个问题,我为ghc编写了一个包装器shell脚本,用于跟踪其参数,并使用runghc选项将其传递给-f

创建一个包含以下内容的文件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