2010-08-07 7 views
15

Bên cạnh những câu hỏi chung trong tiêu đề,Lập trình chức năng áp dụng cho mô phỏng như thế nào?

  • Làm thế nào để lập trình chức năng và ngôn ngữ chức năng tiếp cận lĩnh vực mô phỏng, mà dường như bị xử lý một cách tự nhiên nhất bởi ngôn ngữ hướng đối tượng?
  • Có các ví dụ mã nguồn mở của các mô phỏng phức tạp được viết theo phong cách chức năng (chủ yếu) không?
  • Những thay đổi về quan điểm nào mà một lập trình viên OO cần, để tiếp cận các mô phỏng từ một mô hình chức năng?

Tôi hỏi điều này trong khi tìm hiểu cách người sáng tạo Clojure Rich Hickey đặc biệt tìm cách chế ngự "sự phức tạp ngẫu nhiên" của lập trình OO và trạng thái có thể thay đổi, ví dụ: Sự tách biệt danh tính và trạng thái của Clojure có ý nghĩa rất nhiều (Ants.clj của Hickey nằm trong danh sách nghiên cứu). Một lĩnh vực khác có liên quan là sử dụng lập trình chức năng cho các trò chơi, thường được mô phỏng với rất nhiều "thứ" trạng thái khắp nơi; có một số bài viết/giấy tờ viết về FP và trò chơi, nhiều hơn sẽ được chào đón.

Có lẽ các lập trình viên chức năng có kinh nghiệm có thể cung cấp thêm nền tảng và tư vấn về cách định hướng lại suy nghĩ của một người theo phong cách chức năng, đặc biệt cho mô phỏng. Cảm ơn trước!

+0

Cảm ơn tất cả, vì các phản hồi hữu ích của bạn cho đến thời điểm này. Dường như không có một tham chiếu "kinh điển" về cách chuyển đổi từ mô phỏng mô hình OO sang mô phỏng mô hình chức năng, nhưng khi đọc qua tất cả các liên kết và mã được chia sẻ, có lẽ tôi sẽ gây nguy hiểm khi tự viết lên. :) – limist

+1

Tôi đã hỏi một câu hỏi tương tự cách đây vài năm và tôi bao gồm liên kết tới câu hỏi dưới đây vì có một số câu trả lời hay và có thể hữu ích cho những người khác quan tâm đến chủ đề này. http://stackoverflow.com/questions/718935/is-a-functional-language-a-good-choice-for-a-flight-simulator-how-about-lisp –

+0

@Ballpark - cảm ơn vì liên kết, tôi đã có nhìn thấy câu hỏi của bạn trước đó và học được từ nó quá. – limist

Trả lời

4

Tôi không chắc rằng tôi lên để thách thức trong việc viết ra một phân tích toàn diện các vấn đề đặt ra trong câu hỏi, nhưng tôi có thể ít nhất là bài số liên kết thú vị về FP vs trò chơi trước:

Jörg W. Mittag cung cấp một số ví dụ thú vị trong this answer cho một câu hỏi về lập trình Haskell "thế giới thực" (có liên kết đến một số bài viết thú vị - series Purely Functional Retrogames thực sự đáng để đọc).

Trong vùng đất Clojure, Phil Hagelberg đã triển khai trò chơi phiêu lưu dựa trên văn bản cho chương trình truyền hình PeepCode của mình trên chương trình Clojure; mã có sẵn on GitHub. Sau đó, có RPG project của Brian Carper; không có mã nào được phát hành công khai và chỉ là một bài đăng từ một thời gian trước đây (nó trông rất mát mẻ, mặc dù vậy, tất cả chúng ta hãy cùng nhau để áp lực Brian để tiếp tục ;-)). Cuối cùng, here là ví dụ về một trò chơi đơn giản sử dụng Penumbra (vì một số lý do - có thể không liên quan đến Clojure - tôi không thể làm việc đó, nhưng có thể bạn sẽ cộng với việc viết kèm theo).

Đối với mô phỏng, nghiên cứu ants.clj là một ý tưởng tuyệt vời. Ngoài ra, tôi nhớ đã thấy một loạt bài giảng dựa trên SICP từ khóa học lập trình giới thiệu tại UC Berkeley (tôi nghĩ ...?) Có sẵn ở đâu đó (90% trên kênh YouTube của họ); họ đã có ba bài giảng về OOP trong Đề án và Tôi nghĩ rằng họ đề cập đến mô phỏng như là một miền cung cấp các trường hợp sử dụng tốt cho cách tiếp cận này. Lưu ý rằng tôi có một bộ nhớ khá mơ hồ về điều này, vì vậy thật khó cho tôi để nói nó hữu ích đến mức nào đối với bạn.

+0

Câu trả lời tuyệt vời! Mặc dù Mire rất vui khi đọc, và diễn viên Peepcode là một cách hay để xem lại mọi thứ (tôi đã xem nó quá trễ, than ôi, để có được giá trị giới thiệu tốt đẹp mà nó có). Ngoài ra, Brian vẫn làm việc trên RPG rõ ràng. Hãy vui mừng. – Isaac

+0

Michal, cảm ơn các liên kết và thông tin hữu ích. Re. các bài giảng OOP dựa trên SICP, có lẽ bạn có nghĩa là các bài giảng 16-18 ở đây? http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-001-structure-and-interpretation-of-computer-programs-spring-2005/lecture-notes/ – limist

+0

@limist: Không, tôi có nghĩa là các bài giảng 17-19 từ khóa học SICP từ UC Berkeley - vừa mới khám phá lại liên kết: http://www.youtube.com/ucberkeley#g/c/6879A8466C44A5D5 @Isaac Hodes: Cảm ơn! Ngoài ra, tốt để biết rằng Brian vẫn còn trên đó. Và cảm ơn bộ sưu tập các liên kết thú vị của riêng bạn. :-) –

5

Câu trả lời của Michal là tuyệt vời, nhưng tôi nghĩ tôi sẽ thêm một vài ví dụ gọn gàng khác mà cá nhân tôi thấy hữu ích/thú vị.

Đầu tiên là một bài đăng (và mã) về functional fluid dynamics bởi Lau Jenson. Mặc dù anh ấy chắc chắn đi theo con đường có thể thay đổi tốc độ ở đây, phong cách này khá là chức năng. Tôi đặt cược bởi Clojure 1.3 điều này có thể được thực hiện (chủ yếu!) Bất biến với hiệu suất hợp lý.

Tiếp theo là simple Snake game được triển khai tại Clojure. Dễ dàng, đủ để đọc mặc dù trong một giờ hoặc lâu hơn, và phong cách thực sự dễ chịu và gắn kết.

Ngoài ra, một số mã gọn gàng để xem xét (tôi nghĩ!) Là các mạng nơron mô hình hóa mã. Jeff Foster có một số mã số perceptron single layer và một số chi tiết khác là idiomatic revisions of the code. Đáng xem, ngay cả khi bạn không quen với NN. Ông cũng có một số bài viết gần đây liên quan đến động lực học chất lỏng, mặc dù thời gian này trong Haskell. (Part IPart II) Cũng thú vị, tôi nghĩ, là của anh ấy implementation of the Game of Life (& Part II).

Cuối cùng, như Michal đã đề cập trước tôi, Brian Carper đang làm việc trên a RPG in Clojure. anh ta recently posted some artwork cho trò chơi, vì vậy tôi cá là nó vẫn đang được thực hiện;)

Tôi thích sử dụng thư viện trình tự để làm việc với tấn dữ liệu; nó cảm thấy tự nhiên hơn khi sử dụng các phép trừu tượng như mapreduce và các công cụ tiện dụng, thú vị như juxt thay vì các lần lặp bắt buộc đơn giản. Bạn phải trả một khoản thuế, tôi đã tìm thấy, bằng cách sử dụng Clojure/langs chức năng trong reimplementing thuật toán bắt buộc nổi tiếng và được thực hiện tốt.

Hãy vui vẻ!

3

Mô phỏng là một dạng thông dịch viên - dễ viết theo kiểu chức năng. Chúng cũng có thể được thiết kế như self-optimizing simulators, dựa trên việc xử lý chúng như một trình biên dịch.

+0

cảm ơn bạn, bạn có thể chia sẻ nhiều ví dụ/tham chiếu đến mô phỏng như một "hình thức thông dịch viên" không? Tôi khá mới đối với các lập trình không thuộc OO và chỉ bắt đầu thoát khỏi chế độ suy nghĩ đó. Tôi muốn cuối cùng viết một DSL cho các mô phỏng tôi đang làm việc trên, do đó, bất kỳ con trỏ bổ sung theo hướng đó sẽ được đánh giá cao, cảm ơn. – limist

3

Bác Bob đã chơi với Clojure gần đây và đặc biệt viết một mô phỏng quỹ đạo làm ví dụ công khai nhất của mình.

Một số liên kết:

4

Tôi đang viết một trò chơi trong Clojure, sử dụng một phong cách chủ yếu là chức năng. Ví dụ, toàn bộ trạng thái trò chơi được mô hình hóa như một cấu trúc dữ liệu bất biến.

Điều này đã yêu cầu mã hóa hơi phức tạp. Ví dụ, bạn thường xuyên kết thúc việc tạo ra các hàm với rất nhiều tham số để vượt qua các yếu tố khác nhau của trạng thái trò chơi và đảm bảo rằng ứng dụng cập nhật trạng thái trò chơi xảy ra với phiên bản trò chơi mới nhất.

Nhưng nó cũng đã tạo ra một số lợi thế thực sự tốt đẹp, ví dụ như đồng thời đã tỏ ra khá tầm thường và bạn có thể làm những điều thú vị như sao chép toàn bộ trạng thái trò chơi để chạy các mô phỏng khác nhau trong AI.

Nhìn chung, tôi rất vui mừng với Clojure làm ngôn ngữ cho mô phỏng/trò chơi.

Dựa trên kinh nghiệm này, những điều tôi nghĩ sẽ cải thiện Clojure cho các trò chơi/mô phỏng sẽ là:

  • Hỗ trợ tốt hơn cho nguyên thủy, đặc biệt là các thông số chức năng và giá trị trả
  • Thực hiện các chức năng ngôn ngữ cốt lõi mà ít khó khăn hơn về cấp phát bộ nhớ (áp lực GC là một vấn đề đối với các trò chơi tương tác!)

Bạn có thể xem phiên bản đầu của trò chơi tại đây: Ironclad - Generals of Steam. Nó về cơ bản là một trò chơi chiến lược theo chủ đề steampunk.