Хіба функціональна парадигма не дуже розбіжна з базовим обладнанням, щоб бути загалом ефективним?


14

Натхненний запитанням від SO: /programming/6623391/how-to-gain-control-of-a-5gb-heap-in-haskell

Це може бути довгою дискусією щодо численних переваг та недоліків FP, але поки що я хотів би звузити сферу застосування до основної ефективності FP на сучасному обладнанні.

Теза:

Функціональна парадигма передбачає незмінність та без громадянства (?), Але апаратне забезпечення, на якому ми запускаємо функціональні програми, є обмеженими автоматами. Переклад «чисто функціональної» програми на представлення «станкового обладнання» залишає невеликий контроль програмісту, приносить накладні витрати (?) Та обмежує використання апаратних можливостей (?).

Я прав чи помиляюся у запитуваних твердженнях?

Чи можна довести, що FP не / не передбачає основних штрафних санкцій за сучасну архітектуру загального призначення комп'ютерів?

EDIT: Як я вже говорив у відповіді на деякі коментарі, питання не в ефективності впровадження та деталях. Йдеться про наявність або відсутність головних накладних витрат , які може принести роботу FP на автономних автоматах.


3
Ви коли-небудь справді дивилися на те, як працює сучасне обладнання на низькому рівні? Якщо ви взагалі піклуєтесь про ефективність, це також не нагадує щоденне імперативне програмування.
CA McCann

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

@camccann, @Jeremy: C # і Java, наприклад, використовують віртуальні машини. Незалежно від того , наскільки оптимальною є, незалежно від того , наскільки ефективно програми Java C # і для виробництва, то є основним джерелом неефективності, і це VM. Питання не в ефективності впровадження, але running FP on stateful automata.
лози

1
см моє запитання тут- programmers.stackexchange.com/q/71391/963
Gulshan

2
@vines: Ви розумієте, що сучасні віртуозні машини з фантазійним JITing можуть в деяких випадках перевершувати нативний код, правда? І що вся мета компілятора - перетворити програму на представлення, що відповідає базовій архітектурі, що на відміну від будь-якої сучасної мови? Ваше запитання не має сенсу.
CA McCann

Відповіді:


7

Існує величезне непорозуміння в незміненості.

Незмінність є особливістю семантики, але вона не передбачає незмінність у здійсненні.

Простий приклад - реалізація ліні.

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

Перший раз, коли ви запитаєте (мовою) про значення, обчислення буде фактично виконано, його результат буде оцінено і значення, яке вам повернеться (або ручка).

Це зрозуміло в мовній семантиці, і все, що ви знаєте, це те, що ця змінна була прив’язана до значення (або майбутнього значення) і що після її виконання ви не можете змінити значення, яке буде повернуто. Представлення основної пам'яті зміниться, але ви про це не дізнаєтесь.

Та сама семантична / різницька реалізація існує в будь-якій мові і насправді лежить в основі оптимізації . Якою б мовою не була мова, семантика гарантує деякі речі, але інші не визначають, щоб залишати місце для оптимізації.

Тепер, правда, практично функціональні мови не такі швидкі, як, наприклад, C ++. Однак, Go(що все ще досить шумить) повільніше, ніж Haskell чи Lisp, так само і C # Mono ( джерело ).

Коли ви бачите, наскільки ненадійними можуть бути C ++ або C, щоб отримати ці виступи, ви можете трохи відпустити.

Коли ви зрозумієте, що Haskell швидко зростає сьогодні, і в його компіляторі / режимі роботи ще багато можливостей для оптимізації (GHC нещодавно перейшов на LLVM, наприклад, Microsoft Research активно фінансує поліпшення часу виконання), можливо, ви будете готові зробити ставку на те, що це скоро покращиться

Весело: Гра в регулярні вирази або те, як команда Haskell створила відповідний виразник, який переважає re2, бібліотеку C від Google, у багатьох сценаріях.


Звучить оптимістично :)
лози

3

Функціональна парадигма корисна для поділу речі у вузькому обсязі. Це дійсно гарна річ, враховуючи розвиток комп'ютера.

У багатоядерного процесора виникають великі проблеми з спільними ресурсами, а вартість синхронізації дуже дорога. Функціональна парадигма дозволяє природним чином виражати програми, які не мають проблем з тістами. Це справді добре для паралелізму.

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

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

Гаразд, функціональне програмування передбачає деякі обмеження. Але це також дає природний спосіб виразити проблематику, яку ми маємо в сучасній комп'ютерній техніці, до якої надзвичайно важко впоратися з парадигмами, до якої звикли. Масштабованість - одна з них, і це стає реальною справою.

Усі, хто вже має справу зі складною паралельною системою, знають, про що я говорю.

Тому я б нюансував відповідь. Так, функціонал має проблеми з сучасним обладнанням, але звичайне старе програмування теж має щось. Як завжди, ви знайдете переваги та недоліки. Сенс у тому, щоб знати, що вони є, щоб ви могли зробити відповідний вибір, коли вам доведеться.


0

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

Однак ще один спосіб поглянути на це - подивитися на історію машини Lisp. Якщо я правильно пам'ятаю, вони спочатку були розроблені для того, щоб надто виникли ті самі проблеми, що і у Ліппа, що це відрізняється від машин того часу. Розвиток цих машин врешті-решт припинився, оскільки робочий стіл став досить швидким, щоб зробити його неефективними дешевше, ніж підтримувати іншу машину.

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

Зрештою, програмування стосується компромісів, тому потрібно просто вибрати те, що має більше значення для проекту.


0

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

Однак, щоб відповісти на ваше питання щодо ефективності, я використовував і Haskell, і Clojure, і не помітив жодних проблем з продуктивністю.


1
Питання стосуються вимог ... Що з критично важливими для продуктивності сферами? Високий паралелізм цінний там, але яка загальна оцінка?
лози

1
@vines: Я не використовував жодної мови для критичної продуктивності програми, тому я не можу на цьому говорити.
Ларрі Коулман

1
Не дуже весело без побічних ефектів, так як ви не змогли б зберегти результат ніде.

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