Что такое ответ Haskell на узел.Джей?
Я считаю, что сообщество Erlang не завидует Node.js, поскольку он не блокирует ввод-вывод изначально и имеет способы легко масштабировать развертывания до более чем одного процессора (что-то даже не встроенное в узел.js). Подробнее на http://journal.dedasys.com/2010/04/29/erlang-vs-node-js и узел.js или Erlang
а как же Хаскелл? Может ли Haskell предоставить некоторые преимущества Node.js, а именно чистое решение, чтобы избежать блокировки ввода / вывода без обращения к многопоточное программирование?
есть много вещей, которые привлекательны с узлом.js
- события: никаких манипуляций с потоками, программист предоставляет только обратные вызовы (как в Snap framework)
- обратные вызовы гарантированно выполняются в одном потоке: нет условий гонки невозможно.
- хороший и простой UNIX-дружественный API. Бонус: отличная поддержка HTTP. DNS также доступны.
- каждый ввод-вывод по умолчанию асинхронный. Этот делает его более легким избежать замков. Однако слишком большая обработка ЦП в обратном вызове повлияет на другие соединения (в этом случае задача должна разделиться на более мелкие подзадачи и перепланироваться).
- тот же язык для клиентской и серверной стороны. (Я не вижу слишком большой ценности в этом, однако. jQuery и узлов.js разделяет модель программирования событий, но остальное очень отличается. Я просто не вижу, как совместное использование кода между серверной и клиентской стороной может быть полезно в практиковать.)
- все это упаковано в один продукт.
7 ответов:
ок, так что, посмотрев немного узел.презентация Яш что @gawi указал мне на, Я могу сказать немного больше о том, как Haskell сравнивает с узлом.js. В презентации Райан описывает некоторые преимущества зеленых потоков, но затем продолжает говорить, что он не считает отсутствие абстракции потока недостатком. Я бы не согласился с его позицией, особенно в контексте Haskell: я думаю, что абстракции, которые предоставляют потоки, необходимы для создания сервера код легче получить правильно, и более надежным. В частности:
использование одного потока на соединение позволяет писать код, который выражает связь с одним клиентом, а не писать код, который имеет дело с все клиенты в то же время. Подумайте об этом так: сервер, который обрабатывает несколько клиентов с потоками, выглядит почти так же, как тот, который обрабатывает одного клиента; основное различие заключается в том, что есть
forkгде-то в бывшем. Если протокол, который вы реализуете, вообще сложен, управление машиной состояний для нескольких клиентов одновременно становится довольно сложным, в то время как потоки позволяют вам просто писать связь с одним клиентом. Код легче получить правильно, и легче понять и поддерживать.обратные вызовы в одном потоке ОС-это совместная многозадачность, в отличие от упреждающей многозадачности, которую вы получаете с потоками. Главный недостаток с кооперативом многозадачность заключается в том, что программист отвечает за то, чтобы не было голодания. Он теряет модульность: допустив ошибку в одном месте, он может испортить всю систему. Это действительно то, о чем вы не хотите беспокоиться, и упреждение-это простое решение. Кроме того, связь между обратными вызовами невозможна (это будет тупик).
параллелизм не сложно в Haskell, потому что большинство кода является чистым и поэтому потокобезопасным строительство. Есть простые коммуникативные примитивы. Гораздо сложнее выстрелить себе в ногу с параллелизмом в Haskell, чем в языке с неограниченными побочными эффектами.
может Haskell обеспечить некоторые из преимуществ узла.js, а именно чистое решение, чтобы избежать блокировки ввода-вывода, не прибегая к многопоточному программированию?
да, на самом деле события и потоки объединены в Haskell.
- вы можете программировать в явных легких потоках (например, миллионы потоков на одном ноутбуке).
- или; вы можете программировать в асинхронном событийном стиле, основанном на масштабируемом событии уведомление.
потоки на самом деле реализовано в терминах событий, и бег через множественные ядра, с безшовной миграцией потока, с документированным представлением, и применения.
например, для
- массово параллельная работа оркестровки
- параллельные коллекции масштабирование на 32 или 48 ядер
- вспомогательный инструмент для профилирования и отладки многопоточные / многовекторные программы.
- высокая производительность событийно-управляемое web-сервера.
- интересные пользователей: например, высокочастотная торговля.
параллельные коллекции nbody на 32 ядрах
в 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)
Как nodejs сбросил libev элемент Snap Haskell Web Framework сбросил libev тоже.

Comments