2012-05-28 11 views
9

Sto provando a risolvere un algoritmo in Haskell, e per farlo ho bisogno di una struttura di dati abbastanza grande. Tuttavia, il sito per la risoluzione dei problemi a cui invio la mia soluzione non utilizza alcuna opzione di runtime per consentire uno stack più grande, ma ho sentito che posso usare le opzioni del compilatore come pragma. Ho provato con seguente pragma nel mio codice:Uso dell'opzione -with-rtsopts ghc come praga

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

Poi ho compilare con ghc --make algo.hs. Tuttavia, quando eseguo sul mio computer alcuni test importanti, il programma si arresta in modo anomalo con overflow dello stack e segnala che la dimensione dello stack corrente è 8 MB. D'altra parte, quando compilo così:

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

Il programma funziona bene sugli stessi dati, senza l'aggiunta di +RTS argomenti. Uso GHC 7.0.2, ma il sito per la risoluzione dei problemi utilizza 6.12.3, quindi preferibilmente sto cercando una soluzione che possa funzionare anche con quella vecchia versione.

risposta

9

Si ricorda che la compilazione di quasi ogni tipo di binario nativo costituito da almeno due fasi: compilazione oggetto reale (.hs ->.o), e il collegamento (.o, .a, .lib -> eseguibile/.exe/.so/.dll etc)

Quando si compila con questo:

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

... quello che succede dietro le quinte è fondamentalmente:

# 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 

I.e. l'opzione --make dice a GHC di compilare automaticamente i file oggetto prima di collegare il risultato e riempie un sacco di spazi vuoti per te. Prendi nota di dove finiscono i singoli flag della riga di comando.

Quando si specifica che pragma nella parte superiore del file, questo è invece ciò che accade (con ghc --make algo.hs):

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

Il OPTIONS_GHC pragma dice al compilatore sulle opzioni per aggiungere durante la compilazione che modulo specifico in un file oggetto. Perché -rtsopts è un'opzione (indica a GHC di collegarsi in un diverso insieme di elementi di gestione della riga di comando), non è possibile specificarlo durante la compilazione di un file oggetto. È necessario specificarlo durante il collegamento e tali opzioni non possono essere specificate nell'intestazione di un modulo.

ci sono due soluzioni:

  1. Utilizzare Cabal per costruire roba per voi e specificare nel file .cabal quali opzioni GHC desiderate
  2. Fissare l'algoritmo in modo che non avete bisogno di più spazio di stack , ad esempio utilizzando la ricorsione della coda e più rigidità nelle pieghe. Vedi the wiki per maggiori informazioni.