2011-07-28 3 views
5

커다란 haskell 파일이있어 문제없이 컴파일되고 실행됩니다. 몇 가지 함수와 타입 정의를 일반 hs 파일의 별도 모듈에 넣은 다음 주 모듈에서 가져 오려고합니다. 주 프로그램이 오류없이 컴파일 (가져온 모듈도 컴파일)하지만 실행하려고하면 스택 공간 오버플로가 발생합니다.다른 hs 파일에서 함수를 분리 할 때 스택 공간 오버 플로우가 발생했습니다.

내가 시도 :

또한
ghc --make -O2 Main.hs 
./Main -- stack space overflow 

:

ghc --make -O2 Main.hs Other.hs -o RunMe 
./RunMe -- again, stack space overflow 

가 컴파일 또는 난 아무것도 놓치고 올바른 방법인가?

답변

6

올바르게 컴파일하고 있습니다. 문제는 코드 자체에 있어야합니다. 모듈을 다른 모듈로 분할하면 GHC가이 문제를 표면화하는 원인이되는 최적화를 다르게 적용 할 가능성이 있습니다.

GHC는 이전에 엄격한 분석을 사용하여 상수 스택 공간에서 실행되는 프로그램을 생성 할 수있었습니다. 모듈을 두 개로 나누면 GHC는 더 이상 동일한 엄격 성 가정을 할 수 없으므로 엄격한 함수 작성이 안전하다는 것을 보장 할 수 없었습니다.

해결 방법은 사용자 자신의 엄격 성 주석을 추가하거나이 문제의 원인이되는 기능의 엄격한 버전을 사용하는 것입니다.

+2

INLINE pragma를 무상으로 사용하면이 문제도 해결할 수 있습니다. –

+0

엄격함 주석을 추가하면 실제로 문제가 해결되었습니다. 이것은 단일 모듈에서 필요하지 않았습니다. – vis

5

GHC는 정의 된 동일한 모듈에서 함수가 호출 될 때 GHC가 함수의 사용 된 스택을 더 잘 최적화 할 수 있다고 상상할 수 있습니다 (적어도 strictness analysis). 공간 누출이 최소한있는 것 같습니다 당신의 기능 중 하나이며, GHC는 함수가 어떻게 호출되는지 모를 때 그것을 최적화 할 수 없습니다.

스택 오버플로를 찾아서 수정하기위한 인터넷 주변에는 많은 설명이 있습니다. 예를 들어, Haskell WikiRWH을 참조하십시오.

+0

유용한 팁. 감사 +1 – vis

관련 문제