2012-05-28 10 views
9

私はHaskellのアルゴリズムパズルを解決しようとしており、そうするためにはかなり大きなデータ構造が必要です。しかし、私が解決策を提出する問題解決サイトでは、より大きなスタックを可能にする実行時オプションは使用しませんが、コンパイラオプションをプラグマとして使用できると聞いてきました。私は自分のコードに次のプラグマを使用して試してみた:プラグマとして-with-rtsopts ghcオプションを使用する

{-# OPTIONS_GHC -O2 -rtsopts -with-rtsopts=-K32m #-} 

その後、私はghc --make algo.hsでコンパイルします。しかし、いくつかの大きなテストでマシンを実行すると、プログラムがスタックオーバーフローでクラッシュし、現在のスタックサイズが8MBであることが報告されます。一方、私はそのようにコンパイルする場合:

ghc -rtsopts -with-rtsopts=-K32M --make algo.hs -fforce-recomp 

プログラムは、任意の+RTS引数を追加することなく、同じデータにうまく動作します。私はGHC 7.0.2を使用していますが、問題解決サイトでは6.12.3を使用していますので、古いバージョンでもうまく機能するソリューションを探しています。 ( - >.o.hs)、およびリンク(.o.a.lib - 実際のオブジェクトのコンパイルを>実行/ .exe/.so/.dllなど:

答えて

9

ネイティブバイナリのほとんどすべての種類のコンパイルは、少なくとも2つのステップから成ることを思い出してくださいあなたはこれでコンパイル)

ghc -rtsopts -with-rtsopts=-K32M --make algo.hs -fforce-recomp 

...何実際に舞台裏で起こっていることは基本的には次のとおりです。

# object compilation - creates algo.o 
ghc -c algo.hs -fforce-recomp 
# linking - links together algo.o and libHSsomepackage.a into the "algo" binary 
# (we assume that `algo.hs` included some module from the package `somepackage` 
# e.g. `Data.Package.Some`) 
ghc -rtsopts -with-rtsopts=-K32M -o algo -package somepackage algo.o 

e.e.e. --makeオプションはGHCに結果をリンクする前に自動的にオブジェクトファイルをコンパイルするように指示し、それはあなたのために大量の空白を埋め込みます。個々のコマンドラインフラグがどこで終わるのか注意してください。

あなたはファイルの先頭にそのプラグマを指定すると、これは(ghc --make algo.hsで)何が起こるかの代わりである:

ghc -c algo.hs -rtsopts -with-rtsopts=-K32M 
ghc -o algo -package somepackage algo.o 

OPTIONS_GHCプラグマはにその特定のモジュールをコンパイルするときを追加するためのオプションについてコンパイラーに指示しますオブジェクトファイル-rtsoptsリンカオプションです(GHCに別のコマンドライン処理のセットをリンクするよう指示しているため)、オブジェクトファイルをコンパイルするときに指定することはできません。リンク時に指定する必要があります。そのようなオプションはモジュールヘッダーで指定できません。あなたはできるだけ多くのスタック領域を必要としないように、あなたは

  • があなたのアルゴリズムを修正したいものGHCオプションをあなたのためのものを構築し、自分の.cabalファイルで指定する

    1. 使用Cabal

      は、二つの解決策があります例えば、末尾再帰と折り畳みのより厳密さを使用することによって。詳細は、the wikiを参照してください。

  • 関連する問題