2013-08-26 40 views
8

Tôi có một số mã trong F # hoạt động tốt dưới .net nhưng tràn ngăn xếp dưới Mono. Một vấn đề liên quan là nó có vẻ như làm như vậy lâu trước khi không gian stack được cho là có sẵn để nó chạy ra ngoài (nó được bắt đầu với System.Threading.Thread (ts, 1000000000)). Theo như tôi có thể nói, gấp nó chết trong là đệ quy đuôi và ngăn xếp dấu vết trông như thể tối ưu hóa đuôi không được thực hiện. Tôi đang chạy 3.2.1 với --optimize = tailc.Tailcalls in Mono

Có ai đó vui lòng biết chính xác loại cuộc gọi đuôi nào đã xóa bỏ ngăn xếp cuộc gọi không? Hoặc cách khác để phân bổ thêm stack? Cảm ơn nhiều.

tôi biết Tailcall elimination in Mono

EDIT: đây là một phác thảo của mã theo yêu cầu trong các ý kiến. Nó là một phần của một lần trên một cấu trúc dữ liệu lớn, nhưng stacktrace không chỉ có mapk và myfold trên đó.

let rec myfold f x k = 

    let rec mapk xs k = 
    match xs with 
    [] -> k [] 
    | x::xs -> mapk xs (fun xs' -> myfold f x (fun x' -> (x' :: xs') |> k)) 

... 

mapk (...) (... >> k) 
+0

Bạn đang chạy Mono trên nền tảng nào? (FreeBSD? OS X? Linux?) –

+0

Linux. Máy AMD 8 lõi với 64G RAM nếu điều đó tạo nên sự khác biệt. –

+0

Bạn có chức năng đệ quy đuôi nào? Liệu nó tự gọi nó, hay nó gọi một số chức năng khác? (hoặc nó sử dụng tiếp tục?) (Tôi chỉ cố gắng tìm ra những gì có thể sai - bởi vì một số cuộc gọi đuôi thực sự được tối ưu hóa bởi trình biên dịch F #.) –

Trả lời

1

Theo như tôi biết, --optimize=tailc không phải là cờ trình biên dịch F # được hỗ trợ.

Tôi không nghĩ rằng có một cách để bật/tắt hỗ trợ tối ưu hóa đuôi trong Mono (từ dòng lệnh, dù sao); cờ trình biên dịch F # để bật tối ưu hóa cuộc gọi đuôi là --tailcalls+, nhưng theo mặc định, Compiler Options (F#) được bật theo mặc định.

Tôi nghĩ rằng sự lựa chọn tốt nhất của bạn để có được điều này được giải quyết như sau:

  • File a bug report with Xamarin
  • Go trên kênh #monodev IRC (trên irc.gnome.org) và xem nếu một trong những nhà phát triển/người đóng góp có có thể giúp bạn.
+0

Tailc là một tùy chọn "tối ưu hóa" Mono. Tôi đang sử dụng --tailcalls khi chạy F #. Tôi nghi ngờ rằng việc nộp một bản báo cáo sẽ phản tác dụng vì Mono nổi tiếng là không lấy được các bộ đuôi khá đúng (hoặc cho đến gần đây). Nhưng nếu ai đó biết chính xác khi nào thì công việc hỗ trợ hiện tại và khi nó không hoạt động, điều đó sẽ giúp ích rất nhiều. –

+3

Nếu bạn không gửi lỗi thì làm cách nào để mọi người biết sửa lỗi? – 7sharp9