2011-07-28 29 views
5

Tôi có tệp haskell khổng lồ biên dịch và chạy mà không gặp bất kỳ sự cố nào. Tôi muốn đặt một số hàm và định nghĩa kiểu trong một mô đun riêng biệt trong một tệp hs chung và sau đó nhập nó vào mô-đun chính của tôi. Trong khi chương trình chính biên dịch mà không có bất kỳ lỗi nào (nó cũng biên dịch mô-đun đã nhập), tôi nhận được một tràn không gian ngăn xếp khi tôi cố gắng chạy nó.Ngăn tràn không gian ngăn xếp khi tách các chức năng trong các tệp hs khác nhau

tôi đã cố gắng:

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

Ngoài ra:

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

Đó có phải là cách đúng đắn để biên dịch hay tôi thiếu gì không?

Trả lời

6

Bạn đang biên dịch chính xác. Vấn đề phải nằm trong chính mã. Tách nó thành các mô-đun khác nhau có khả năng khiến GHC áp dụng tối ưu hóa khác nhau khiến cho vấn đề này xuất hiện.

Lý do có thể là do GHC trước đó có thể sử dụng phân tích độ chặt chẽ để tạo ra một chương trình chạy trong không gian ngăn xếp liên tục. Việc tách mô-đun thành hai lần sau đó khiến GHC không còn có thể đưa ra các giả định nghiêm ngặt như nhau, do đó không thể đảm bảo rằng việc thực hiện chức năng nghiêm ngặt là an toàn.

Giải pháp có thể là thêm chú thích nghiêm ngặt của riêng bạn hoặc sử dụng phiên bản nghiêm ngặt của bất kỳ chức năng nào đang gây ra điều này.

+2

Sử dụng vô cớ các pragmas INLINE cũng có thể khắc phục điều này. –

+0

Thêm chú thích nghiêm ngặt thực sự đã khắc phục được sự cố. Điều này là không cần thiết trong một mô-đun duy nhất. – vis

5

Tôi có thể tưởng tượng rằng GHC có thể tối ưu hóa ngăn xếp được sử dụng các chức năng tốt hơn (bằng cách thực hiện strictness analysis) khi các hàm được gọi từ cùng một mô-đun được xác định. Có vẻ như bạn có rò rỉ không gian trong ít nhất một chức năng của bạn, và GHC không thể tối ưu hóa nó đi khi nó không biết cách gọi hàm.

Có rất nhiều giải thích trên mạng để tìm và sửa lỗi tràn ngăn xếp. Xem, ví dụ: Haskell WikiRWH.

+0

Mẹo hữu ích. Cảm ơn +1 – vis

Các vấn đề liên quan