2009-12-07 3 views
19

Теперь все шумихи вокруг Node.JS, фреймворка, управляемого событиями, с использованием обратных вызовов Javascript. К моему ограниченному пониманию, его основным преимуществом является то, что вам не нужно ждать шаг за шагом последовательно (например, вы можете получить результаты SQL, , тогда как вызывает другие функции).изобретать колеса: Node.JS/Event-driven programming v.s. Функциональное программирование?

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

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

ответ

10

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

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

+2

Ну, если честно, функциональное программирование не подразумевает чистый язык. Хаскелл просто решает это сделать. – codebliss

+3

Заметьте, что я никогда не утверждал, что это так. Стиль программирования сам по себе является таким, каким я его определял. Немного споров об этом. Продолжается дискуссия о том, что нужно называть «функциональным языком программирования» - любым языком, который допускает стиль, любой язык, на котором основной упор поддерживает этот стиль, или только языки, которые не поддерживают никакой другой стиль. Это разные дебаты. – harms

3

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

(* Примечание:. Не чистое, очевидно, но функциональное во многом таким же образом, как Scheme) Ключевая роль

0

JavaScript в узле, веб-сервере, является то, что она в значительной степени событий.

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

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

33

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

Так что вместо этого:

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

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

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

Авторов (из узла.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 с дорогой вилкой процесса вы привыкли, или даже процесс OS потоки. Это в основном тот же самый легкий поток выполнения, который использует Node.JS (только с несколько более богатой семантикой). У вас может быть 1000 таких, как Node.JS.

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

+1

+1 Для примера Haskell. Я действительно ценю это. –

+0

Прежде всего +1. Это четкий и сбалансированный ответ. Однако, пользуясь обоими, я обнаружил, что, будучи строгими и называя обратные вызовы, некоторые из неловкости уходят. JS - это что-то вроде функционального языка, носящего одежду на семейном языке C, и вы заканчиваете бит. Я нахожу, что философская гибкость делает кодирование в JS с Node быстрым и веселым. Это только я, хотя! – qubyte

1

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

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

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

0

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

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

Смежные вопросы