2009-12-07 15 views
19

Ahora hay todo un hype últimamente sobre Node.JS, un marco impulsado por eventos que usa devoluciones de llamada de Javascript. Según mi entendimiento limitado, su principal ventaja parece ser que no tiene que esperar paso a paso secuencialmente (por ejemplo, puede buscar los resultados SQL, mientras que llama a otras funciones también).reinventando las ruedas: Node.JS/Programación impulsada por eventos v.s. Programación Funcional?

Así que mi pregunta es: ¿cómo es esto diferente, o mejor que solo los lenguajes funcionales, como CL, Haskell, Clojure, etc.? Si no es mejor, ¿por qué la gente simplemente no hace idiomas funcionales entonces (en lugar de reinventando la rueda con Javascript)?

Tenga en cuenta que no tengo experiencia en Node.JS ni en la programación funcional. Entonces, alguna explicación básica puede ser útil.

Respuesta

10

No sé realmente sobre Node.JS, pero realmente no veo ninguna similitud sorprendente entre él (de su descripción) y la programación funcional. A partir de su descripción, Node.JS parece estar destinado a ayudar a la programación asincrónica: como usted declara "no tiene que esperar paso a paso secuencialmente", puede hacer otras tareas como lo hace una tarea de larga ejecución.

La programación funcional es completamente ortogonal a esto, es decir, no tiene ningún vínculo con la asincronía. Puedes tener uno sin el otro, o ambos juntos, o ninguno de ellos. La programación funcional consiste en eliminar los efectos secundarios en sus programas y en permitir que funciones como miembros de primera clase del lenguaje, sean manipulados y compuestos de manera similar a otros valores.

+2

Bueno, para ser honestos, la programación funcional no implica un lenguaje puro. Haskell solo elige hacer esto. – codebliss

+3

Tenga en cuenta que nunca dije que lo hizo. El estilo de programación, en sí mismo, es como lo definí. Poca controversia sobre eso. Existe un debate en curso sobre lo que se debería permitir llamar un "lenguaje de programación funcional": cualquier lenguaje que permita el estilo, cualquier idioma donde el enfoque principal apoye ese estilo, o solo los idiomas que no admitan otro estilo. Ese es un debate diferente. – harms

3

Esto no es realmente "reinventar la rueda". Javascript no es realmente un lenguaje funcional per se, pero estaba basado en Lisp y este es el tipo de cosa para la que fue diseñado. En mi opinión, Javascript es realmente más fuerte como un lenguaje funcional Lisp-ish que como un lenguaje OO. Es por eso que los marcos con diseños fuertemente funcionales * como jQuery se ajustan muy bien al lenguaje.

(. * Nota: No es pura, obviamente, pero funcional de la misma forma que el esquema) papel clave

0

de Javascript en el nodo como un servidor web es que es en gran medida por eventos.

Creo que la programación funcional tiene ventajas para la concurrencia, debido a la inmutabilidad entre otras cosas.

no estoy seguro de cómo funcionan los otros lenguajes funcionales, simplemente quería resaltarlo como parte de las ventajas del nodo.

33

Después de leer los documentos de Node.JS (y el agradable slide deck), creo que las otras respuestas aquí carecen de sentido: Node.JS se basa en la idea de que el estilo de escritura de programas donde los esperamos bloquear en E/S es incorrecto, y que en su lugar debemos iniciar E/S (como leer una base de datos, o leer un socket) y pasar una función para manejar el resultado de la E/S junto con la solicitud.

Así que en lugar de hacer esto:

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

Node.JS se basa en la idea de hacer esto:

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

Los autores (del nodo.JS) señalan que esta forma de programación es muy incómoda en muchos sistemas, ya que los idiomas no tienen cierres o funciones anónimas y las bibliotecas bloquean principalmente la E/S. Sin embargo, Javascript suministra lo primero (y los programadores están acostumbrados dado que JS se usa de forma similar en el navegador), y Node.JS completa lo posterior: se trata de una biblioteca de E/S totalmente controlada por eventos sin llamadas de bloqueo. en absoluto.

¿Cómo se relaciona esto con la programación funcional? Todos los lenguajes de programación funcionales proporcionan construcciones de cierre lo suficientemente potentes para hacer lo que Node.JS intenta hacer con Javascript. La mayoría hace que sea aún más fácil codificar, ya que los cierres pasados ​​son generalmente fundamentales para el idioma.

En cuanto a Haskell, usando Mónadas, este tipo de cosas podría ser muy fácil de construir. Por ejemplo:

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

éstas, las líneas imperativas muy secuenciales de código son realmente una secuencia de cierres bajo el control del IO mónada. Es como si en JavaScript que había escrito:

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

En esencia, cuando se escribe código monádico en un lenguaje funcional, que ya está escribiendo en forma Node.js los autores quieren que escribamos: Donde cada paso del cálculo secuencial se pasa como un cierre al anterior. Sin embargo, ¡mira cuánto mejor se ve ese código en Haskell!

Además, puede utilizar fácilmente concurrente Haskell cuenta para lograr esta operación no bloqueante fácilmente:

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

No se debe confundir con el que forkIO tenedor proceso costoso que estamos acostumbrados, o incluso proceso de OS trapos. Básicamente es el mismo hilo de ejecución ligero que Node.JS está utilizando (solo con semántica algo más rica). Puedes tener 1,000s 'em como Node.JS apunta a.

Así que, en resumen, creo que Node.JS se basa en una instalación que existe en JavaScript, pero que es mucho más natural en los lenguajes funcionales. Además, creo que todos los elementos que están en Node.JS ya existen en Haskell y sus paquetes, y algo más. ¡Para mí, usaría Haskell!

+1

+1 Para el ejemplo de Haskell. Realmente aprecio eso. –

+0

Primero de todo +1. Esta es una respuesta clara y equilibrada. Sin embargo, habiendo usado ambos, me parece que al ser estricto y nombrar devoluciones de llamada, parte de la incomodidad desaparece. JS es algo así como un lenguaje funcional que usa la ropa de un lenguaje de familia C, y terminas con partes de ambos. Encuentro que la flexibilidad filosófica hace que la codificación en JS con Node sea más rápida y divertida. ¡Pero solo soy yo! – qubyte

1

No he usado node.js todavía, pero estoy definitivamente interesado en él y lo voy a probar pronto. Ya hay muchas respuestas excelentes acerca de la programación funcional, y eso aquí, así que no entraré en eso.

Pregunta por qué no utiliza otro idioma en el servidor, como haskell, Closure, etc. Para mí, la atracción de node.js sobre los demás es que es javascript. Mis aplicaciones ya tienen mucho javascript en el cliente, por lo que significa que podría trabajar en un idioma tanto en el servidor como en el cliente.

Mi esperanza es que esto agilice y simplifique el desarrollo porque no necesitaré cambiar contextos tan drásticamente. Incluso podría haber alguna reducción en el trabajo si se pudiera compartir alguna lógica que se usa tanto en el cliente como en el servidor (tal vez el código de validación del formulario y demás).

0

Uno de los principales beneficios con la brecha entre el cliente y el servidor se reduce es la capacidad de reutilizar el código en el cliente y el servidor. Por ejemplo, si desea tener un sitio web AJAX rico y dinámico para navegadores modernos y una versión reducida para navegadores más antiguos, puede usar el mismo código de visualización para formatear datos de entrada tanto en el cliente como en el servidor.

Otros beneficios incluyen la capacidad de HTML5/Google Gears/Adobe Air de tener una base de datos local de almacenamiento y servidor para ejecutar aplicaciones web sin conexión, puede tener un código que tradicionalmente estaría en el servidor almacenado localmente cuando el servidor está no disponible.

Cuestiones relacionadas