Чи насправді Haskell / Clojure не підходить для таких динамічних систем, як моделювання частинок?


9

У попередніх питаннях мені говорили, що функціональні мови програмування не підходять для динамічних систем, таких як фізичний двигун, головним чином тому, що дорого мутувати об’єкти. Наскільки реально це твердження і чому?


4
Вам може бути цікаво github.com/linneman/particles-clj . 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
Хто вам сказав, що вони непридатні? Посилання на відповідь / коментар?
Андрес Ф.

7
@Dokkat: Я скептично налаштований, що коментатор там знає багато чого про функціональне програмування, якщо бути дуже чесним. Я б взяв його з великим зерном солі.
CA McCann

6
Крім того, я також не врахував би відповідь, що починається з "Чисто функціональний підхід не підходить для ігор ...", якщо автор не доведе, що він насправді спробував написати функціональну програму. Інакше він просто здогадується, що, на його думку, можуть бути проблеми .
Андрес Ф.

1
Розробка ігор @Dokkat має додаткові обмеження, а не просто симулятор частинок та двигун фізики (що може досить непогано вписатись у функціональне програмування) - продуктивність часу роботи, яка є ключовою для розвитку ігор (і що важливіше, ніж сама фізика часом). Фізичний двигун гірничої компанії, що прогнозує вибухи, задає точність більше, ніж продуктивність. За допомогою функціонального програмування можна легше отримати більшу продуктивність, кинувши на нього більше обладнання (те, що ігрові двигуни не можуть зробити).

Відповіді:


10

І Haskell, і Clojure дозволяють реально змінити, так що це не проблема.

Крім того, якщо ваші "мутабельні" дані складаються з проміжних значень, які поступово оновлюються в рамках деяких більших обчислень, вам, можливо, навіть не потрібна мутаційність для ефективності! Наприклад, в Хаскеллі тривають дослідження, що стосуються методики, званої потоком синтезу , де компілятор сплавляє петлі обробки, виробники даних та споживачі даних, щоб повністю усунути проміжні структури даних.

Основна проблема з Haskell тут - лінь - у програмі, що розчарує число, де у вас багато вхідних даних і багато вихідних даних, і все це важливо, лінь робить вам мало користі, але все ж накладає накладні витрати. Це не означає, що ви не можете писати такі програми в Haskell (насправді це роблять люди), але це не грає сильним мовам, і вам потрібно краще зрозуміти модель оцінювання, щоб отримати бажану продуктивність.

Однак, важке скорочення чисел також не під силу сильному JVM. Така програма, чому FORTRAN все ще існує.


1
Варто зазначити: майбутня 8.0 версія GHC підтримуватиме суворий режим оцінки для кожного модуля.
Ерік Каплун

8

Я не можу говорити за Clojure, але можу сказати, що Haskell має багато дуже налаштованих пакетів вводу-виводу, які дозволять отримати всі мутації, які ви могли захотіти.

Ось відповідь на запитання, яке я написав, де хтось деталізує 3 найпоширеніші та стосується їхньої ефективності: /programming/15439966/when-why-use-an-mvar-over-a-tvar/15440286 # 15440286

Ви також можете побачити тут простий графік , що показує показники продуктивності в Haskell веб - сервері під назвою Деформація, яка є вельми IO інтенсивним застосуванням.

У зв'язку з цим існує багато плутанини щодо Haskell, правда, у нього є фантастичні засоби вводу-виводу з безліччю пакетів для злому для використання IO у великій кількості різних способів, багато з яких були дуже налаштовані. Причина, по якій люди припускають, що це не так, це те, що Haskell намагається відокремити IO від всього іншого, але це не впливає на характеристики продуктивності.

Тепер, якщо говорити про характеристики продуктивності, то причина, по якій люди визнають, що вона має низьку ефективність, пов'язана з ледачою оцінкою, що змушує її поводитись не завжди інтуїтивно. Це, однак, ви повинні турбуватися значно менше, коли ви починаєте працювати в контексті IO, роблячи руйнівні оновлення, наприклад, у системі, про яку ви посилаєтесь. Далі люди схильні виявляти, що, коли у них виникають проблеми з роботою, вбудовані засоби для інструменту та визначення місця, куди йдуть ресурси, дуже допомагають.

Ще одна монада, яку варто придивитись до такої системи, як ви описуєте, - це монада ST, яка спеціально для руйнівних оновлень, зроблених дуже маленькими викликами вводу-виводу, що дає їй велику продуктивність.

Вибачте, що я справді не можу розмовляти з Clojure, сподіваюся, хтось інший може розповісти там деталі.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.