Có phải Haskell / Clojure thực sự không phù hợp cho các hệ thống động như mô phỏng hạt?


9

Tôi đã được nói trong các câu hỏi trước đây rằng các ngôn ngữ lập trình chức năng không được sử dụng cho các hệ thống động như động cơ vật lý, chủ yếu là vì tốn kém để biến đổi các đối tượng. Làm thế nào thực tế là tuyên bố này, và tại sao?


4
Bạn có thể thấy github.com/linneman/particles-clj thú vị. Due to the functional programming style the computational load will be distributed over the available CPU cores which can dramatically increase processing speed in some cases

2
Ai nói với bạn rằng họ không phù hợp? Liên kết để trả lời / nhận xét?
Andres F.

7
@Dokkat: Tôi nghi ngờ rằng người bình luận ở đó biết nhiều về lập trình chức năng, phải rất trung thực. Tôi sẽ dùng nó với một hạt muối lớn.
CA McCann

6
Ngoài ra, tôi cũng bỏ qua câu trả lời bắt đầu bằng "Cách tiếp cận chức năng thuần túy không phù hợp với trò chơi ..." trừ khi tác giả chứng minh rằng anh ta thực sự đã thử viết một chương trình chức năng. Mặt khác, anh ta chỉ đoán những gì anh ta nghĩ có thể là vấn đề .
Andres F.

1
Phát triển trò chơi @Dokkat có các ràng buộc bổ sung thay vì chỉ là một trình mô phỏng hạt và công cụ vật lý (có thể phù hợp với lập trình chức năng) - hiệu suất thời gian là chìa khóa để phát triển trò chơi (và quan trọng hơn cả vật lý đôi khi). Động cơ vật lý cho một công ty khai thác dự đoán vụ nổ yêu cầu độ chính xác cao hơn hiệu suất. Với lập trình chức năng, hiệu suất cao hơn có thể đạt được dễ dàng hơn bằng cách ném thêm phần cứng vào nó (điều mà các công cụ trò chơi không thể làm được).

Câu trả lời:


10

Cả Haskell và Clojure đều cho phép khả năng biến đổi thực tế, vì vậy đó không phải là vấn đề bắt đầu.

Ngoài ra, nếu dữ liệu "có thể thay đổi" của bạn bao gồm các giá trị trung gian được cập nhật tăng dần như một phần của một số tính toán lớn hơn, bạn thậm chí có thể không cần khả năng biến đổi để có hiệu quả! Ví dụ, có nghiên cứu liên tục ở Haskell liên quan đến một kỹ thuật gọi là hợp nhất luồng , trong đó trình biên dịch hợp nhất các vòng lặp xử lý, nhà sản xuất dữ liệu và người tiêu dùng dữ liệu để loại bỏ hoàn toàn cấu trúc dữ liệu trung gian.

Vấn đề chính với Haskell ở đây là sự lười biếng - trong một chương trình khủng hoảng số, nơi bạn có nhiều dữ liệu đầu vào và nhiều dữ liệu đầu ra và tất cả đều quan trọng, sự lười biếng của bạn rất ít ủng hộ nhưng vẫn áp đặt một số chi phí. Điều đó không có nghĩa là bạn không thể viết các chương trình như thế trong Haskell (thực tế là mọi người) nhưng nó không phát huy thế mạnh của ngôn ngữ và bạn cần hiểu rõ hơn về mô hình đánh giá để có được hiệu suất mà bạn muốn.

Điều đó nói rằng, việc bẻ khóa số nặng cũng không phát huy được thế mạnh của JVM. Đó là loại chương trình là lý do tại sao FORTRAN vẫn còn xung quanh.


1
đáng lưu ý: phiên bản 8.0 sắp tới của GHC sẽ hỗ trợ chế độ đánh giá nghiêm ngặt cho mỗi mô-đun.
Erik Kaplun

8

Tôi không thể nói cho Clojure, nhưng tôi có thể nói Haskell có rất nhiều gói IO được điều chỉnh rất cao có sẵn sẽ cho phép tất cả các đột biến bạn có thể muốn.

Đây là câu trả lời cho câu hỏi tôi đã viết trong đó ai đó nêu chi tiết về 3 câu hỏi phổ biến nhất và liên quan đến hiệu suất của họ: /programming/15439966/when-why-use-an-mvar-over-a-tvar/15440286 # 15440286

Bạn cũng có thể thấy ở đây một biểu đồ đơn giản hiển thị số liệu hiệu suất của máy chủ web haskell có tên Warp, đây là một ứng dụng chuyên sâu IO.

Có rất nhiều nhầm lẫn về điều này liên quan đến Haskell, sự thật là nó có các cơ sở IO tuyệt vời với nhiều gói hack để sử dụng IO theo nhiều cách khác nhau, nhiều trong số đó đã được điều chỉnh cao. Lý do mọi người cho rằng đây không phải là trường hợp là vì Haskell đã nỗ lực hết sức để tách IO khỏi mọi thứ khác, nhưng điều đó không ảnh hưởng đến các đặc tính hiệu suất.

Tuy nhiên, bây giờ để nói về đặc điểm hiệu suất, lý do mọi người nhận ra nó có hiệu suất kém là do đánh giá lười biếng khiến nó hành xử theo cách không phải lúc nào cũng trực quan. Tuy nhiên, đây là điều bạn phải lo lắng ít hơn đáng kể khi bạn bắt đầu làm việc trong bối cảnh IO thực hiện các cập nhật mang tính hủy diệt, chẳng hạn như trong một hệ thống mà bạn đang đề cập. Những người xa hơn có xu hướng thấy rằng khi họ gặp rắc rối về hiệu suất, việc xây dựng các phương tiện để xác định và xác định nơi tài nguyên sẽ giúp ích rất nhiều.

Một đơn nguyên khác đáng để tìm kiếm một hệ thống như bạn mô tả sẽ là đơn vị ST dành riêng cho các cập nhật mang tính hủy diệt được thực hiện bởi các lệnh gọi IO rất nhỏ mang lại hiệu năng tuyệt vời.

Xin lỗi tôi thực sự không thể nói chuyện với Clojure, hy vọng người khác có thể cung cấp chi tiết ở đó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.