Подтвердить что ты не робот

Изобретать колеса: Node.JS/Event-driven programming v.s. Функциональное программирование?

Теперь все шумихи об Node.JS, основанной на событиях фреймворке с использованием обратных вызовов Javascript. По моему ограниченному пониманию, его основным преимуществом является то, что вам не нужно ждать шаг за шагом последовательно (например, вы можете получить результаты SQL, , а вызвать другие функции тоже).

Итак, мой вопрос: как это разные или лучше, чем просто функциональные языки, такие как CL, Haskell, Clojure и т.д.? Если не лучше, то почему люди не просто выполняют функциональные языки тогда (вместо изобретать колесо с помощью Javascript)?

Обратите внимание, что у меня нет опыта ни в Node.JS, ни в функциональном программировании. Поэтому может быть полезно некоторое базовое объяснение.

4b9b3361

Ответ 1

Прочитав документы Node.JS(и приятную слайд-панель), я думаю, что другие ответы здесь отсутствуют. об этом: Node.JS основан на идее, что стиль написания программ, где мы ожидаем, что они блокируются при вводе-выводе, неверен, и вместо этого мы должны инициировать ввод-вывод (например, чтение базы данных или чтение сокет) и передать функцию, чтобы обрабатывать результат ввода-вывода вместе с запросом.

Вместо этого сделайте следующее:

var result = db.query("select.."); // blocking
// use result

Node.JS основан на идее сделать это:

db.query("select..", function (result) {
    // use result
});

Авторы (из Node.JS) отмечают, что этот способ программирования очень неудобен во многих системах, поскольку языки не имеют замыканий или анонимных функций, а библиотеки в основном блокируют ввод-вывод. Тем не менее, Javascript поставляет первый (и для него используются программисты, данные о том, как JS используется как событие в браузере), а Node.JS заполняется позже: это полностью управляемая событиями библиотека ввода-вывода без блокировка вызовов вообще.

Как это связано с функциональным программированием? Все языки функционального программирования предоставляют конструкции закрытия, достаточно мощные, чтобы делать то, что Node.JS пытается сделать с Javascript. Большинство из них упрощают кодирование, поскольку прохождение закрытия обычно имеет фундаментальное значение для языка.

Что касается Haskell, то, используя Monads, такую ​​вещь можно было бы очень легко построить. Например:

doQuery :: DBConnection -> IO ()
doQuery db = do
    rows <- query db "select..."
    doSomething rows
    doSomethingElse rows

Эти очень последовательные, обязательные строки кода на самом деле представляют собой последовательность замыканий под управлением монады IO. Как будто в JavaScript вы написали:

db.query("select...", function (rows) {
    doSomething(rows, function () {
        doSomethingElse(rows, function () { /* done */ })
    })
})

В сущности, при написании монадического кода на функциональном языке вы уже пишете его в форме, которую авторы Node.JS хотят, чтобы мы писали: где каждый шаг последовательного вычисления передается как закрытие предыдущей один. Однако посмотрите, насколько приятнее этот код в Haskell!

Кроме того, вы можете легко использовать параллельные функции Haskell для достижения этой неблокирующей операции:

forkQuery :: DBConnection -> IO ThreadId
forkQuery db = forkIO $ do
    rows <- query db "select..."
    doSomething rows
    doSomethingElse rows

Не путайте это forkIO с дорогой вилкой процесса, к которой вы привыкли, или даже к потокам процессов ОС. Это в основном тот же самый легкий поток выполнения, что Node.JS использует (только с несколько более богатой семантикой). У вас может быть 1000 таких, как Node.JS имеет целью.

Итак, короче - я думаю, что Node.JS строится на объекте, который существует в JavaScript, но это намного более естественно в функциональных языках. Более того, я думаю, что все элементы, которые находятся в Node.JS, уже существуют в Haskell и его пакетах, а затем некоторые. Для меня я просто использовал Haskell!

Ответ 2

Я даже не знаю о Node.JS, но я действительно не вижу какого-либо поразительного сходства между ним (из вашего описания) и функциональным программированием. Из вашего описания Node.JS, похоже, нацелен на помощь асинхронному программированию - поскольку вы заявляете, что вам не нужно ждать шаг за шагом последовательно, вы можете выполнять другие задачи, поскольку одна долговременная задача выполняет свою задачу.

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

Ответ 3

На самом деле это не "изобретать колесо". Javascript на самом деле не является функциональным языком, но он основывался на Lisp, и это то, что было предназначено для этого. Javascript действительно сильнее, чем функциональный язык Lisp, который, по моему мнению, является языком OO. Вот почему фреймворки с сильно функциональными * проектами, такими как jQuery, хорошо подходят для языка.

(* Примечание: не чисто, очевидно, но функционально во многом так же, как и схема.)

Ответ 4

Я еще не использовал node.js, но я определенно заинтересован в этом и скоро его попробую. Уже есть много замечательных ответов о функциональном программировании и т.д., Поэтому я не буду вникать в это.

Вы спрашиваете, почему бы не использовать какой-либо другой язык на сервере, такой как haskell, Closure и т.д. Для меня привлекательность node.js над другими заключается в том, что это javascript. Мои приложения уже тяжелы в javascript на клиенте, поэтому это означает, что я могу работать на одном языке как на сервере, так и на клиенте.

Я надеюсь, что это упростит и упростит разработку, потому что мне не нужно будет так сильно переключать контексты. Может быть даже некоторое сокращение работы, если некоторая логика, которая используется как на клиенте, так и на сервере, может быть разделена (возможно, сформировать код проверки и т.п.).

Ответ 5

Роль ключевого слова Javascript в node в качестве веб-сервера заключается в том, что он в основном управляется событиями.

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

не уверен, как управляются событиями другие функциональные языки, просто хотел выделить его как часть преимуществ node.

Ответ 6

Одним из основных преимуществ с разрывом между клиентом и сервером является возможность повторного использования кода на клиенте и сервере. Например, если вы хотите иметь богатый и динамичный веб-сайт AJAX для современных браузеров и урезанную версию для старых браузеров, вы можете использовать один и тот же код отображения для форматирования входящих данных как на клиенте, так и на сервере.

Другие преимущества с этим включают способность HTML5/Google Gears/Adobe Air иметь локальную базу данных хранения и сервер для запуска веб-приложений в автономном режиме, вы можете иметь код, который традиционно находится на сервере, хранящемся локально, когда сервер не доступны.