2012-05-28 11 views
9

Próbuję rozwiązać układankę algorytmiczną w Haskell, a do tego potrzebuję dość dużej struktury danych. Jednak strona rozwiązywania problemów, do której przesyłam moje rozwiązanie, nie używa żadnych opcji czasu pracy, aby umożliwić większy stos, ale słyszałem, że mogę używać opcji kompilatora jako pragmy. Próbowałem za pomocą poniższego pragmy w moim kodu:Używanie opcji -with-rtsopts ghc jako pragma

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

Potem skompilować z ghc --make algo.hs. Jednak po uruchomieniu komputera na niektórych dużych testach program ulega awarii z przepełnieniem stosu i informuje, że bieżący rozmiar stosu wynosi 8 MB. Z drugiej strony, kiedy mogę skompilować tak:

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

Program działa dobrze na tych samych danych, bez dodawania jakichkolwiek +RTS argumenty. Używam GHC 7.0.2, ale strona z rozwiązywaniem problemów używa 6.12.3, więc najlepiej szukam rozwiązania, które mogłoby działać również z tą starą wersją.

Odpowiedz

9

Pamiętaj, że kompilacja z prawie każdego rodzaju natywnym formacie binarnym składa się z co najmniej dwóch etapach: Actual kompilację obiektu (.hs ->.o) i łączenie (.o, .a, .lib -> wykonywalny/.exe/.so/.dll etc)

Podczas kompilowania z tym:

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

... co się faktycznie dzieje za kulisami jest zasadniczo:

# 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 

tj. Opcja --make mówi GHC, aby kompilował pliki obiektów automatycznie przed połączeniem wyniku, i wypełni dla Ciebie mnóstwo pustych miejsc. Zwróć uwagę, gdzie kończą się poszczególne flagi linii poleceń.

Po określeniu tego pragmy na początku pliku, to zamiast tego, co się dzieje (z ghc --make algo.hs):

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

OPTIONS_GHC Pragma informuje kompilator o opcjach, aby dodać podczas kompilowania że specyficzny moduł do plik obiektowy. Ponieważ -rtsopts to, łącznik (mówi GHC o łączeniu w inny zestaw czynności obsługi wiersza polecenia), nie można go określić podczas kompilowania pliku obiektowego. Musisz określić go podczas łączenia, a takich opcji nie można określić w nagłówku modułu.

Istnieją dwa rozwiązania:

  1. Stosować Cabal budować rzeczy dla siebie i określić w pliku .cabal jakich opcji GHC chcesz
  2. naprawić swój algorytm, dzięki czemu nie trzeba tak dużo miejsca stosu , na przykład za pomocą rekursji ogonowej i bardziej rygorystycznej w fałdach. Aby uzyskać więcej informacji, patrz the wiki.