Что такое ответ Haskell на узел.Джей?



Я считаю, что сообщество Erlang не завидует Node.js, поскольку он не блокирует ввод-вывод изначально и имеет способы легко масштабировать развертывания до более чем одного процессора (что-то даже не встроенное в узел.js). Подробнее на http://journal.dedasys.com/2010/04/29/erlang-vs-node-js и узел.js или Erlang



а как же Хаскелл? Может ли Haskell предоставить некоторые преимущества Node.js, а именно чистое решение, чтобы избежать блокировки ввода / вывода без обращения к многопоточное программирование?





есть много вещей, которые привлекательны с узлом.js




  1. события: никаких манипуляций с потоками, программист предоставляет только обратные вызовы (как в Snap framework)

  2. обратные вызовы гарантированно выполняются в одном потоке: нет условий гонки невозможно.

  3. хороший и простой UNIX-дружественный API. Бонус: отличная поддержка HTTP. DNS также доступны.

  4. каждый ввод-вывод по умолчанию асинхронный. Этот делает его более легким избежать замков. Однако слишком большая обработка ЦП в обратном вызове повлияет на другие соединения (в этом случае задача должна разделиться на более мелкие подзадачи и перепланироваться).

  5. тот же язык для клиентской и серверной стороны. (Я не вижу слишком большой ценности в этом, однако. jQuery и узлов.js разделяет модель программирования событий, но остальное очень отличается. Я просто не вижу, как совместное использование кода между серверной и клиентской стороной может быть полезно в практиковать.)

  6. все это упаковано в один продукт.

557   7  

7 ответов:

ок, так что, посмотрев немного узел.презентация Яш что @gawi указал мне на, Я могу сказать немного больше о том, как Haskell сравнивает с узлом.js. В презентации Райан описывает некоторые преимущества зеленых потоков, но затем продолжает говорить, что он не считает отсутствие абстракции потока недостатком. Я бы не согласился с его позицией, особенно в контексте Haskell: я думаю, что абстракции, которые предоставляют потоки, необходимы для создания сервера код легче получить правильно, и более надежным. В частности:

  • использование одного потока на соединение позволяет писать код, который выражает связь с одним клиентом, а не писать код, который имеет дело с все клиенты в то же время. Подумайте об этом так: сервер, который обрабатывает несколько клиентов с потоками, выглядит почти так же, как тот, который обрабатывает одного клиента; основное различие заключается в том, что есть fork где-то в бывшем. Если протокол, который вы реализуете, вообще сложен, управление машиной состояний для нескольких клиентов одновременно становится довольно сложным, в то время как потоки позволяют вам просто писать связь с одним клиентом. Код легче получить правильно, и легче понять и поддерживать.

  • обратные вызовы в одном потоке ОС-это совместная многозадачность, в отличие от упреждающей многозадачности, которую вы получаете с потоками. Главный недостаток с кооперативом многозадачность заключается в том, что программист отвечает за то, чтобы не было голодания. Он теряет модульность: допустив ошибку в одном месте, он может испортить всю систему. Это действительно то, о чем вы не хотите беспокоиться, и упреждение-это простое решение. Кроме того, связь между обратными вызовами невозможна (это будет тупик).

  • параллелизм не сложно в Haskell, потому что большинство кода является чистым и поэтому потокобезопасным строительство. Есть простые коммуникативные примитивы. Гораздо сложнее выстрелить себе в ногу с параллелизмом в Haskell, чем в языке с неограниченными побочными эффектами.

может Haskell обеспечить некоторые из преимуществ узла.js, а именно чистое решение, чтобы избежать блокировки ввода-вывода, не прибегая к многопоточному программированию?

да, на самом деле события и потоки объединены в Haskell.

  • вы можете программировать в явных легких потоках (например, миллионы потоков на одном ноутбуке).
  • или; вы можете программировать в асинхронном событийном стиле, основанном на масштабируемом событии уведомление.

потоки на самом деле реализовано в терминах событий, и бег через множественные ядра, с безшовной миграцией потока, с документированным представлением, и применения.

например, для

параллельные коллекции nbody на 32 ядрах

alt text

в Haskell у вас есть как события, так и потоки, и как это все события под капотом.

прочитать статью С ОПИСАНИЕМ реализация.

во-первых, я не придерживаюсь вашего взгляда на этот узел.js делает правильную вещь, раскрывая все эти обратные вызовы. Вы в конечном итоге пишете свою программу в CPS (стиль продолжения передачи), и я думаю, что это должна быть работа компилятора, чтобы сделать это преобразование.

события: никаких манипуляций с потоками, программист предоставляет только обратные вызовы (как в Snap framework)

Итак, имея это в виду, вы можете писать с использованием асинхронного стиля, если хотите, но делая это вы пропустили бы запись в эффективном синхронном стиле, с одним потоком на запрос. Haskell смехотворно эффективен в синхронном коде, особенно по сравнению с другими языками. Все события внизу.

обратные вызовы гарантированно выполняются в одном потоке: нет условия гонки невозможно.

вы все еще можете иметь состояние гонки в узле.JS, но это сложнее.

каждый запрос в отдельном потоке. Когда вы пишете код, который должен взаимодействовать с другими потоками, очень просто сделать его потокобезопасным благодаря примитивам параллелизма haskell.

хороший и простой UNIX-дружественный API. Бонус: отличная поддержка HTTP. DNS также доступны.

взгляните в hackage и убедитесь сами.

каждый ввод-вывод по умолчанию асинхронный (это может иногда раздражать). Это делает его более легким избежать замков. Тем не менее, слишком много обработки процессора в a обратный вызов повлияет на другие соединения (в этом случае задача должна быть разделена на более мелкие подзадачи и перепланирована).

У вас нет таких проблем, ghc будет распределять вашу работу среди реальных потоков ОС.

тот же язык для клиентской и серверной стороны. (Я не вижу слишком большой ценности в этом, однако. JQuery и узлов.js разделяет модель программирования событий, но остальное очень отличается. Я просто не вижу, как общий код между серверной стороной и клиентская сторона может быть полезна на практике.)

Хаскелл не может выиграть здесь... верно? Подумайте еще раз, http://www.haskell.org/haskellwiki/Haskell_in_web_browser .

все это упаковано в один продукт.

загрузите ghc, запустите cabal. Есть пакет для каждой потребности.

Я лично вижу узел.JS и программирование с использованием обратных вызовов, как излишне низкого уровня и немного неестественным. Почему программа с обратными вызовами, когда хорошая среда выполнения, такая как найденная в GHC, может обрабатывать обратные вызовы для вас и делать это довольно эффективно?

в то же время, время выполнения GHC значительно улучшилось: теперь он имеет "новый новый менеджер ввода-вывода" под названием MIO где "М" означает многоядерный я считаю. Он опирается на фундамент существующего IO manager и его основной целью является чтобы преодолеть причину снижения производительности 4 + ядер. Показатели производительности, представленные в этой статье, довольно впечатляют. Смотрите сами:

с Mio, реалистичные http-серверы в Haskell масштабируются до 20 ядер процессора, достигая максимальной производительности до коэффициента 6.5 x по сравнению с теми же серверами, использующими предыдущие версии GHC. Задержка серверов Haskell также улучшена: [...] при умеренной нагрузке уменьшает ожидаемое время отклика на 5,7 x по сравнению с предыдущими версиями из GHC

и:

мы также показываем, что с Mio McNettle (контроллер SDN, написанный на Haskell) может эффективно масштабироваться до 40+ ядер, достигать тщательного ввода более 20 миллионов новых запросов в секунду на одной машине и, следовательно, стать самым быстрым из всех существующих контроллеров SDN.

Mio сделал это в выпуске GHC 7.8.1. Я лично рассматриваю это как важный шаг вперед в исполнении Haskell. Было бы очень интересно сравните производительность существующих веб-приложений, скомпилированных предыдущей версией GHC и 7.8.1.

вопрос довольно смешной, потому что 1) Haskell уже решил эту проблему гораздо лучше и 2) примерно так же, как и Эрланг. Вот тест против узла: http://www.yesodweb.com/blog/2011/03/preliminary-warp-cross-language-benchmarks

дайте Haskell 4 ядра, и он может выполнять 100k (простых) запросов в секунду в одном приложении. Узел не может сделать столько же и не может масштабировать одно приложение по ядрам. И вы не должны этого делать все, чтобы пожать это, потому что среда выполнения Haskell не блокируется. Единственный (относительно общего) языка, который неблокирующего ввода-вывода, встроенные в рантайм Эрланга.

события IMHO хороши, но программирование с помощью обратных вызовов-нет.

большинство проблем, которые делают специальное кодирование и отладку веб-приложений происходит от того, что делает их масштабируемыми и гибкими. Самое главное, безгосударственный характер HTTP. Это улучшает навигацию, но это накладывает инверсию управления, где элемент ввода-вывода (веб-сервер в этом случае) вызывает различные обработчики в коде приложения. Эта модель событий - или модель обратного вызова, подробнее точно сказано-это кошмар, так как обратные вызовы не разделяют переменные области видимости, а интуитивное представление о навигации теряется. Очень трудно предотвратить все возможные изменения состояния, когда пользователь перемещается вперед и назад, среди других проблем.

можно сказать, что проблемы похожи на Программирование GUI, где модель событий работает нормально, но графические интерфейсы не имеют навигации и кнопки "Назад". Это умножает возможные переходы состояний в веб-приложениях. Результат попытка решить эту проблему-это тяжелые фреймворки со сложными конфигурациями, множеством распространенных магических идентификаторов, не подвергая сомнению корень проблемы: модель обратного вызова и присущее ей отсутствие совместного использования переменных областей и отсутствие последовательности, поэтому последовательность должна быть построена путем связывания идентификаторов.

существуют последовательные основанные фреймворки, такие как ocsigen (ocaml) seaside (smalltalk) WASH (discontinued, Haskell) и mflow (Haskell), которые решают проблему государственное управление при сохранении судоходности и полноты покоя. в этих рамках программист может выразить навигацию как императивную последовательность, где программа отправляет страницы и ждет ответов в одном потоке, переменные находятся в области действия, а кнопка "Назад" работает автоматически. Это по своей сути создает более короткий, более безопасный, более читаемый код, где навигация хорошо видна программисту. (справедливое предупреждение: Im разработчик mflow)

Comments

    Ничего не найдено.