У попередніх питаннях мені говорили, що функціональні мови програмування не підходять для динамічних систем, таких як фізичний двигун, головним чином тому, що дорого мутувати об’єкти. Наскільки реально це твердження і чому?
У попередніх питаннях мені говорили, що функціональні мови програмування не підходять для динамічних систем, таких як фізичний двигун, головним чином тому, що дорого мутувати об’єкти. Наскільки реально це твердження і чому?
Відповіді:
І Haskell, і Clojure дозволяють реально змінити, так що це не проблема.
Крім того, якщо ваші "мутабельні" дані складаються з проміжних значень, які поступово оновлюються в рамках деяких більших обчислень, вам, можливо, навіть не потрібна мутаційність для ефективності! Наприклад, в Хаскеллі тривають дослідження, що стосуються методики, званої потоком синтезу , де компілятор сплавляє петлі обробки, виробники даних та споживачі даних, щоб повністю усунути проміжні структури даних.
Основна проблема з Haskell тут - лінь - у програмі, що розчарує число, де у вас багато вхідних даних і багато вихідних даних, і все це важливо, лінь робить вам мало користі, але все ж накладає накладні витрати. Це не означає, що ви не можете писати такі програми в Haskell (насправді це роблять люди), але це не грає сильним мовам, і вам потрібно краще зрозуміти модель оцінювання, щоб отримати бажану продуктивність.
Однак, важке скорочення чисел також не під силу сильному JVM. Така програма, чому FORTRAN все ще існує.
Я не можу говорити за Clojure, але можу сказати, що Haskell має багато дуже налаштованих пакетів вводу-виводу, які дозволять отримати всі мутації, які ви могли захотіти.
Ось відповідь на запитання, яке я написав, де хтось деталізує 3 найпоширеніші та стосується їхньої ефективності: /programming/15439966/when-why-use-an-mvar-over-a-tvar/15440286 # 15440286
Ви також можете побачити тут простий графік , що показує показники продуктивності в Haskell веб - сервері під назвою Деформація, яка є вельми IO інтенсивним застосуванням.
У зв'язку з цим існує багато плутанини щодо Haskell, правда, у нього є фантастичні засоби вводу-виводу з безліччю пакетів для злому для використання IO у великій кількості різних способів, багато з яких були дуже налаштовані. Причина, по якій люди припускають, що це не так, це те, що Haskell намагається відокремити IO від всього іншого, але це не впливає на характеристики продуктивності.
Тепер, якщо говорити про характеристики продуктивності, то причина, по якій люди визнають, що вона має низьку ефективність, пов'язана з ледачою оцінкою, що змушує її поводитись не завжди інтуїтивно. Це, однак, ви повинні турбуватися значно менше, коли ви починаєте працювати в контексті IO, роблячи руйнівні оновлення, наприклад, у системі, про яку ви посилаєтесь. Далі люди схильні виявляти, що, коли у них виникають проблеми з роботою, вбудовані засоби для інструменту та визначення місця, куди йдуть ресурси, дуже допомагають.
Ще одна монада, яку варто придивитись до такої системи, як ви описуєте, - це монада ST, яка спеціально для руйнівних оновлень, зроблених дуже маленькими викликами вводу-виводу, що дає їй велику продуктивність.
Вибачте, що я справді не можу розмовляти з Clojure, сподіваюся, хтось інший може розповісти там деталі.
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