2015-03-30 10 views
10

ghci için, ben bütün programı derlerken bellek GHCiRTS seçeneklerini runghc'e nasıl aktarabilirim?

$ ghci +RTS -M10m -RTS 

tarafından kullanabilirsiniz sınırlayabilir, bunu nasıl yapabilirim sonra

$ ghc -rtsopts a.hs 

$ ./a +RTS -M10m 

olabilir runghc a.hs için? runghc a.hs +RTS -M10m gibi çeşitli yöntemler denedim, ancak bunların hiçbiri işe yaramıyor. Ben hafızayı sınırlayabilir tek seçenek

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

tarafından, ama bu yalnızca bir kez olmak istiyorum, bu yüzden runghc argümanlar ileterek bu yapmayı tercih ederim.


Düzenleme: top için

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

Açık iki terminalleri, tek: seçeneği (Ben daha iyi yollar bilmiyorum sırf) aşağıdaki stratejiyi kullanarak çalışma olup olmadığını kontrol ediyorum kodu çalıştırmak için komut ve başka bir. Yürütme "Yığın yorgun" demeyi bırakırsa, -M[number]m'un çalışmakta olduğu sonucuna varıyorum. Eğer yürütme devam ederse ve büyük miktarda hafıza kullanıyorsa, süreci öldürür ve bunun başarılı olamadığı sonucuna varır.

+0

"runghc + RTS -M10m a.hs" veya "runghc -rtsopts a.hs + RTS -M10m"? (Sadece tahmin ediyorum) – Dogbert

+0

@Dogbert İkisini de denedim ve işe yaramadı. Her neyse teşekkürler :( – Yosh

+0

Bayrağın programdan ayarlanıp ayarlanmadığını nasıl kontrol ediyorsunuz? – Dogbert

cevap

3

chi'un GHCRTS=... runghc ... kullanılması tek yol olduğunu söylüyor. runghc, komut satırını yorumladığından, +RTS, runghc'un kendisine (sonda ise) veya bir program adı olarak (başlangıçta ise) RTS seçenekleri olarak yorumlanır. Asla çalışma zamanına ulaşmaz. --RTS +RTS ... kullanarak programa geçirilmek için zorlayabilirsiniz ama daha sonra bir program argümanı olarak kabul edilir ve hala çalışma zamanı tarafından görülmez.

Bunu incelemek için, ghc için argümanlarını izleyen bir sarıcı kabuk betiği yazdım ve seçeneği ile runghc'a ilettim.

içeren bir dosyayı ghc-wrapper oluşturun:

#!/bin/sh -x 
exec ghc "[email protected]" 

-x seçenek her çizgiyi izlemek için /bin/sh söyler. runghc ile bunu kullanın:

$ 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 
     ... 

Ama runghc çünkü özel +RTS muamele ettiğini belirtmek için bir yolu yoktur:

$ 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) 

biz gerçekten yürütmek runghc istiyorum nedir.