javascript - programacion - reinventar las ruedas: Node.JS/¿Programación dirigida por eventos vs Programación funcional?
programacion funcional javascript ejemplos (6)
Después de leer los documentos de Node.JS (y la buena plataforma de diapositivas ), creo que a las otras respuestas les falta un punto: Node.JS se basa en la idea de que el estilo de escritura de los programas donde esperamos que se bloqueen La E / S es incorrecta, y en su lugar, debemos iniciar la 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 (de Node.JS) señalan que esta forma de programación es muy extraña en muchos sistemas, ya que los idiomas no tienen cierres o funciones anónimas y las bibliotecas están principalmente bloqueando la E / S. Sin embargo, Javascript proporciona lo primero (y los programadores están acostumbrados a ello, dado que JS se usa de forma similar a un evento en el navegador), y Node.JS completa lo siguiente: es una biblioteca de E / S completamente 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 está tratando de hacer con Javascript. La mayoría hace que sea aún más fácil de codificar, ya que los cierres de paso generalmente son fundamentales para el lenguaje.
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
Estas líneas de código imperativas y muy secuenciales son en realidad una secuencia de cierres bajo el control de la mónada IO
. Es como si en JavaScript hubieras escrito:
db.query("select...", function (rows) {
doSomething(rows, function () {
doSomethingElse(rows, function () { /* done */ })
})
})
En esencia, al escribir código monádico en un lenguaje funcional, ya lo está escribiendo en la forma en que los autores de Node.JS quieren que escribamos: donde cada paso del cálculo secuencial se pasa como un cierre al anterior. Sin embargo, ¡mira qué bonito es ese código en Haskell!
Además, puede usar fácilmente las funciones de Haskell concurrentes para lograr esta operación sin bloqueo fácilmente:
forkQuery :: DBConnection -> IO ThreadId
forkQuery db = forkIO $ do
rows <- query db "select..."
doSomething rows
doSomethingElse rows
No confunda ese forkIO
con el costoso fork de procesos al que está acostumbrado, ni siquiera los subprocesos de procesos del sistema operativo. Básicamente, es el mismo subproceso de ejecución ligero que Node.JS está utilizando (solo con una semántica algo más rica). Puedes tener 1,000 de ellos al igual que los objetivos de Node.JS.
En resumen, creo que Node.JS se basa en una instalación que existe en JavaScript, pero eso 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 luego algunos. Para mi, yo solo uso Haskell!
Ahora hay todo el bombo últimamente sobre Node.JS , un marco basado en eventos que utiliza devoluciones de llamada de Javascript. Para mi comprensión limitada, su principal ventaja parece ser que no tiene que esperar paso a paso de forma secuencial (por ejemplo, puede obtener los resultados de SQL, al mismo tiempo que llama a otras funciones).
Entonces, mi pregunta es: ¿en qué se diferencian, o mejor que los lenguajes funcionales, como CL, Haskell, Clojure, etc.? Si no es mejor, ¿por qué la gente no solo usa lenguajes funcionales (en lugar de reinventar la rueda con Javascript )?
Tenga en cuenta que no tengo experiencia en Node.JS ni en programación funcional. Así que alguna explicación básica puede ser útil.
El rol clave de Javascript en el nodo como servidor web es que es en gran medida impulsado 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 son los otros lenguajes funcionales controlados por eventos, solo quería resaltarlo como parte de las ventajas del nodo.
Esto no es realmente "reinventar la rueda". Javascript no es realmente un lenguaje funcional en sí mismo, pero estaba basado en Lisp y este es el tipo de cosas para las que fue diseñado. Javascript es realmente más fuerte como lenguaje funcional de Lisp-ish que como un lenguaje OO en mi opinión. Es por eso que los marcos con diseños fuertemente funcionales * como jQuery se adaptan muy bien al lenguaje.
(* Nota: No es puro, obviamente, pero funciona de la misma manera que Scheme).
No he usado node.js todavía, pero definitivamente estoy interesado en él y lo intentaré pronto. Ya hay muchas respuestas geniales sobre la programación funcional y eso aquí, así que no voy a entrar en eso.
Usted pregunta por qué no usa otro idioma en el servidor, como haskell, Closure, etc. Para mí, la atracción de node.js sobre otros es que ES javascript. Mis aplicaciones ya tienen un gran 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 agilizará y simplificará el desarrollo porque no tendré que cambiar de contexto tan drásticamente. Incluso podría haber alguna reducción en el trabajo si se pudiera compartir alguna lógica que se use tanto en el cliente como en el servidor (tal vez código de validación de formularios y similares).
Tampoco sé realmente sobre Node.JS, pero realmente no veo ninguna similitud sorprendente entre él (según su descripción) y la programación funcional. A partir de su descripción, Node.JS parece estar dirigido a ayudar a la programación asíncrona; como dice "no tiene que esperar paso a paso de forma secuencial", puede hacer otras tareas como lo hace una tarea de larga duración.
La programación funcional es completamente ortogonal a esto, es decir, realmente no tiene ningún enlace a la asincronicidad. 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 las funciones como miembros de primera clase del lenguaje, sean manipuladas y compuestas de manera similar a otros valores.
Una de las ventajas principales de la reducción de la brecha entre el cliente y el servidor es la posibilidad de reutilizar el código en el cliente y el servidor. Por ejemplo, si desea tener un sitio web rico y dinámico de AJAX para navegadores modernos y una versión reducida para navegadores más antiguos, puede usar el mismo código de pantalla para formatear los datos entrantes tanto en el cliente como en el servidor.
Otros beneficios con esto incluyen la capacidad de HTML5 / Google Gears / Adobe Air para tener una base de datos de almacenamiento local y un servidor para ejecutar aplicaciones web sin conexión, puede tener un código que tradicionalmente se almacenaría localmente para cuando el servidor no esté disponible.