programming-languages - paradigma - programacion funcional vs orientada a objetos
¿Por qué lenguajes funcionales? (30)
El programador corporativo promedio, por ejemplo, la mayoría de las personas con las que trabajo, no lo entenderá y la mayoría de los entornos de trabajo no le permitirán programar en él.
Eso es solo una cuestión de tiempo. Su programador corporativo promedio aprende lo que sea el Big Thing actual. Hace 15 años, no entendían OOP. Si la FP se pone en marcha, sus "programadores corporativos promedio" seguirán.
Realmente no se enseña en las universidades (¿o es hoy en día?)
Varía mucho. En mi universidad, SML es el primer idioma que se presenta a los estudiantes. Creo que MIT enseña LISP como un curso de primer año. Estos dos ejemplos pueden no ser representativos, por supuesto, pero creo que la mayoría de las universidades, como mínimo, ofrecen algunos cursos opcionales sobre PF, incluso si no lo hacen una parte obligatoria del currículo.
La mayoría de las aplicaciones son lo suficientemente simples para ser resueltas en formas normales de OO
Sin embargo, no es realmente una cuestión de "lo suficientemente simple". ¿Sería una solución más simple (o más legible, robusta, elegante, con rendimiento) en FP? Muchas cosas son "lo suficientemente simples para ser resueltas en Java", pero aún requieren una cantidad de código tremenda.
En cualquier caso, tenga en cuenta que los defensores de la FP han afirmado que era la próxima gran cosa durante varias décadas. Quizás tengan razón, pero tenga en cuenta que no lo estaban cuando hicieron la misma reclamación hace 5, 10 o 15 años.
Sin embargo, una cosa que definitivamente cuenta a su favor es que recientemente, C # ha dado un giro brusco hacia FP, en la medida en que prácticamente convierte a una generación de programadores en programadores de FP, sin que ellos se den cuenta . Eso podría allanar el camino para la FP "revolución". Tal vez. ;)
Veo mucho hablar aquí sobre lenguajes funcionales y esas cosas. ¿Por qué usaría uno sobre un lenguaje "tradicional"? ¿Qué hacen mejor? ¿En qué son peores? ¿Cuál es la aplicación de programación funcional ideal?
La mayoría de las aplicaciones son lo suficientemente simples para ser resueltas en formas normales de OO
OO maneras no siempre han sido "normales". El estándar de esta década fue el concepto marginado de la última década.
La programación funcional es matemática. Paul Graham en Lisp (sustituye la programación funcional por Lisp):
Entonces, la breve explicación de por qué este lenguaje de los años cincuenta no es obsoleto es que no era tecnología sino matemáticas, y las matemáticas no son obsoletas. Lo correcto para comparar a Lisp no es el hardware de la década de 1950, sino, digamos, el algoritmo Quicksort, que se descubrió en 1960 y sigue siendo el tipo más rápido de propósito general.
¿Has estado siguiendo la evolución de los lenguajes de programación últimamente? Cada nueva versión de todos los lenguajes de programación principales parece tomar prestadas cada vez más características de la programación funcional.
Cierres, funciones anónimas, funciones de paso y retorno como valores que solían ser características exóticas conocidas solo por los hackers Lisp y ML. Pero gradualmente, C #, Delphi, Python, Perl, Javascript, han agregado soporte para cierres. No es posible que cualquier lenguaje prometedor se tome en serio sin cierres.
Varios idiomas, en particular Python, C # y Ruby tienen soporte nativo para comprensión de listas y generadores de listas.
ML fue pionero en la programación genérica en 1973, pero el soporte para genéricos ("polimorfismo paramétrico") solo se ha convertido en un estándar de la industria en los últimos 5 años aproximadamente. Si recuerdo correctamente, Fortran admitió los genéricos en 2003, seguido de Java 2004, C # en 2005, Delphi en 2008. (Sé que C ++ ha admitido plantillas desde 1979, pero el 90% de las discusiones sobre STL de C ++ comienzan con "aquí hay demonios" .)
¿Qué hace que estas características sean atractivas para los programadores? Debería ser claramente obvio: ayuda a los programadores a escribir código más corto . Todos los idiomas en el futuro serán compatibles, como mínimo, con los cierres si desean mantenerse competitivos. En este sentido, la programación funcional ya está en la corriente principal.
La mayoría de las aplicaciones son lo suficientemente simples para ser resueltas en formas normales de OO
¿Quién dice que no puede usar la programación funcional para cosas simples también? No todos los programas funcionales tienen que ser un compilador, un generador de teoremas o un conmutador de telecomunicaciones masivamente paralelo. Regularmente uso F # para scripts desechables ad hoc además de mis proyectos más complicados.
Además de las otras respuestas, lanzar la solución en términos puramente funcionales obliga a uno a comprender mejor el problema. A la inversa, pensar en un estilo funcional desarrollará mejores * habilidades para resolver problemas.
* Ya sea porque el paradigma funcional es mejor o porque permitirá un ángulo de ataque adicional.
Apuesto a que no sabías que eras programación funcional cuando usaste:
- Fórmulas de excel
- Compositor de cuarzo
- Javascript
- Logo (gráficos de tortuga)
- LINQ
- SQL
- Underscore.js (o Lodash), D3
Creo que una razón es que algunas personas sienten que la parte más importante de si se aceptará un idioma es cuán bueno es el idioma . Desafortunadamente, las cosas rara vez son tan simples. Por ejemplo, yo diría que el factor más importante detrás de la aceptación de Python no es el lenguaje en sí (aunque eso es bastante importante). La razón principal por la que Python es tan popular es su enorme biblioteca estándar y la comunidad aún mayor de bibliotecas de terceros.
Los idiomas como Clojure o F # pueden ser la excepción a la regla sobre esto, ya que se basan en la JVM / CLR. Como resultado, no tengo una respuesta para ellos.
Cuando leí "El siguiente lenguaje de programación: la perspectiva de un desarrollador de juegos" de Tim Sweeney, Epic Games, mi primer pensamiento fue: tuve que aprender Haskell.
Debo ser denso, pero todavía no lo entiendo. ¿Hay ejemplos reales de pequeñas aplicaciones escritas en un lenguaje funcional como F # donde se puede ver el código fuente y ver cómo y por qué fue mejor usar este enfoque que, por ejemplo, C #?
El hombre no puede entender la perfección y las imperfecciones de su arte elegido si no puede ver el valor en otras artes. Seguir las reglas solo permite el desarrollo hasta cierto punto en la técnica y luego el estudiante y el artista deben aprender más y buscar más. Tiene sentido estudiar otras artes así como las de estrategia.
¿Quién no ha aprendido algo más sobre sí mismos al observar las actividades de otros? Para aprender la espada estudia la guitarra. Para aprender el primer estudio de comercio. Solo estudiar la espada te hará tener una mente estrecha y no te permitirá crecer hacia afuera.
- Miyamoto Musashi, "Un libro de cinco anillos"
Estoy de acuerdo con el primer punto, pero los tiempos cambian. Las corporaciones responderán, incluso si son adoptantes tardías, si ven que hay una ventaja. La vida es dinámica.
Enseñaban Haskell y ML en Stanford a finales de los 90. Estoy seguro de que lugares como Carnegie Mellon, MIT, Stanford y otras buenas escuelas lo están presentando a los estudiantes.
Estoy de acuerdo en que la mayoría de las aplicaciones de "exponer bases de datos relacionales en la web" continuarán en ese sentido durante mucho tiempo. Java EE, .NET, RoR y PHP han desarrollado algunas soluciones bastante buenas para ese problema.
Se ha topado con algo importante: podría ser el problema que no puede resolverse fácilmente por otros medios que impulsen la programación funcional. ¿Qué sería eso?
¿El hardware masivo multinúcleo y la computación en nube los impulsarán?
F # podría tener éxito porque Microsoft lo está presionando.
Pro:
- F # será parte de la próxima versión de Visual Studio
- Microsoft está creando una comunidad desde hace algún tiempo: evangelistas, libros, consultores que trabajan con clientes de alto perfil, una exposición significativa en las conferencias de MS.
- F # es el lenguaje .Net de primera clase y es el primer lenguaje funcional que viene con una base realmente grande (no es que diga que Lisp, Haskell, Erlang, Scala, OCaml no tienen muchas bibliotecas, simplemente no son tan completas como .Net es)
- Fuerte apoyo al paralelismo.
Contra:
- F # es muy difícil de comenzar, incluso si eres bueno con C # y .Net, al menos para mí :(
- probablemente será difícil encontrar buenos desarrolladores de F #
Entonces, le doy 50:50 a F # para que se vuelva importante. Otros lenguajes funcionales no lo van a hacer en un futuro próximo.
Incluso si nunca trabajas en un lenguaje funcional profesionalmente, entender la programación funcional te hará un mejor desarrollador. Le dará una nueva perspectiva sobre su código y programación en general.
Yo digo que no hay razón para no aprenderlo.
Creo que los idiomas que combinan bien el estilo funcional y el imperativo son los más interesantes y tienen más probabilidades de éxito.
La mayoría de las aplicaciones se pueden resolver en [inserte su idioma favorito, paradigma, etc. aquí].
Aunque, esto es cierto, se pueden usar diferentes herramientas para resolver diferentes problemas. Funcional solo permite otra abstracción de alto nivel (¿más alto?) Que permite realizar nuestros trabajos de manera más eficaz cuando se utilizan correctamente.
La principal ventaja para mí es su paralelismo inherente, especialmente porque ahora nos estamos alejando de más MHz y hacia más y más núcleos.
No creo que se convierta en el próximo paradigma de programación y reemplace completamente los métodos de tipo OO, pero creo que llegaremos al punto en que necesitamos escribir algo de nuestro código en un lenguaje funcional o nuestros lenguajes de propósito general crecer para incluir construcciones más funcionales.
Las cosas se han estado moviendo en una dirección funcional por un tiempo. Los dos nuevos y geniales niños de los últimos años, Ruby y Python, están radicalmente más cerca de los lenguajes funcionales que los anteriores, tanto que algunos Lispers han empezado a admitir a uno u otro como "lo suficientemente cerca".
Y con el hardware masivamente paralelo que pone presión evolutiva sobre todos, y los lenguajes funcionales en el mejor lugar para lidiar con los cambios, no es un salto tan grande como lo fue una vez, pensar que Haskell o F # serán la próxima gran cosa.
Los lenguajes funcionales utilizan un paradigma diferente a los lenguajes imperativos y orientados a objetos. Usan funciones sin efectos secundarios como un componente básico en el lenguaje. Esto permite muchas cosas y hace que muchas cosas sean más difíciles (o en la mayoría de los casos, diferentes a lo que la gente está acostumbrada).
Una de las mayores ventajas de la programación funcional es que el orden de ejecución de las funciones sin efectos secundarios no es importante. Por ejemplo, en Erlang esto se usa para habilitar la concurrencia de una manera muy transparente. Y como las funciones en los lenguajes funcionales se comportan de manera muy similar a las funciones matemáticas, es fácil traducirlas a lenguajes funcionales. En algunos casos, esto puede hacer que el código sea más legible.
Tradicionalmente, una de las grandes desventajas de la programación funcional era también la falta de efectos secundarios. Es muy difícil escribir software útil sin IO, pero es difícil implementar IO sin efectos secundarios en las funciones. Así que la mayoría de las personas nunca obtuvieron más de la programación funcional que el cálculo de una sola salida a partir de una sola entrada. En los lenguajes modernos de paradigma mixto como F # o Scala, esto es más fácil.
Muchos lenguajes modernos tienen elementos de lenguajes de programación funcionales. C # 3.0 tiene muchas características de programación funcional y también puede realizar la programación funcional en Python. Creo que las razones de la popularidad de la programación funcional se deben principalmente a dos razones: la concurrencia es un problema real en la programación normal porque cada vez recibimos más computadoras con varios procesadores; Y los idiomas son cada vez más accesibles.
Me gustaría señalar que todo lo que ha dicho sobre los lenguajes funcionales, la mayoría de la gente decía acerca de los idiomas orientados a objetos hace unos 20 años. En ese entonces era muy común escuchar acerca de OO:
* The average corporate programmer, e.g. most of the people I work with, will not understand it and most work environments will not let you program in it
* It''s not really taught at universities (or is it nowadays?)
* Most applications are simple enough to be solved in normal IMPERATIVE ways
El cambio tiene que venir de alguna parte. Un cambio significativo e importante se hará realidad sin importar si las personas capacitadas en tecnologías anteriores consideran que el cambio no es necesario. ¿Crees que el cambio a OO fue bueno a pesar de todas las personas que estaban en contra en ese momento?
Me parece que las personas que nunca aprendieron Lisp o Scheme como estudiante universitario ahora lo están descubriendo. Al igual que con muchas cosas en este campo, existe una tendencia a exagerar y crear altas expectativas ...
Pasara.
La programación funcional es genial. Sin embargo, no se apoderará del mundo. C, C ++, Java, C #, etc. todavía estarán alrededor.
Creo que lo que vendrá de esto es una mayor capacidad en varios idiomas, por ejemplo, implementar cosas en un lenguaje funcional y luego dar acceso a esas cosas en otros idiomas.
Mi opinión es que se dará cuenta ahora que Microsoft lo ha introducido mucho más en la corriente principal. Para mí es atractivo por lo que puede hacer por nosotros, porque es un nuevo desafío y por las oportunidades de empleo que presenta para el futuro.
Una vez que se domine, será otra herramienta que nos ayudará a ser más productivos como programadores.
No creo que haya ninguna duda sobre el enfoque funcional de la programación, ya que se está usando (como un estilo de programación) durante aproximadamente 40 años. Cuando un programador de OO escribe código limpio que favorece objetos inmutables, ese código toma prestados conceptos funcionales.
Sin embargo, los idiomas que imponen un estilo funcional están recibiendo mucha tinta virtual en estos días, y si esos idiomas serán dominantes en el futuro es una pregunta abierta. Mi propia sospecha es que los lenguajes híbridos de múltiples paradigmas como Scala u OCaml probablemente dominarán a los lenguajes funcionales "puristas" de la misma manera que el lenguaje OO puro (Smalltalk, Beta, etc.) ha influido en la programación general, pero no ha terminado. Hasta las notaciones más utilizadas.
Finalmente, no puedo resistirme a señalar que sus comentarios con respecto a la FP son muy paralelos a las observaciones que escuché de los programadores de procedimientos hace no muchos años:
- El programador "promedio" (mítico, IMHO) no lo entiende.
- No es ampliamente enseñado.
- Cualquier programa con el que pueda escribir puede escribirse de otra manera con las técnicas actuales.
Al igual que las interfaces gráficas de usuario y el "código como modelo de negocio" fueron conceptos que ayudaron a OO a ser más apreciados, creo que un mayor uso de la inmutabilidad y un paralelismo más simple (masivo) ayudarán a más programadores a ver los beneficios que ofrece el enfoque funcional . Pero por mucho que hayamos aprendido en los últimos 50 años o más que conforman toda la historia de la programación de computadoras digitales, creo que todavía tenemos mucho que aprender. Dentro de veinte años, los programadores observarán con asombro la naturaleza primitiva de las herramientas que estamos utilizando actualmente, incluidos los ahora populares lenguajes OO y FP.
No creo que la gente más realista piense que la programación funcional se pondrá en marcha (se convierte en el paradigma principal como OO). Después de todo, la mayoría de los problemas de negocios no son problemas matemáticos, sino reglas imperativas para mover los datos y mostrarlos de varias maneras, lo que significa que no es un buen ajuste para el paradigma de programación puramente funcional (la curva de aprendizaje de la mónada es muy superior a la OO).
OTOH, la programación funcional es lo que hace que la programación sea divertida. Te hace apreciar la belleza inherente e intemporal de las expresiones sucintas de las matemáticas subyacentes del universo. La gente dice que aprender programación funcional te hará un mejor programador. Esto es, por supuesto, altamente subjetivo. Personalmente, tampoco creo que eso sea completamente cierto.
Te hace un ser mejor sintiente.
No sé si funcionará o no, pero a partir de mis investigaciones, un lenguaje funcional es casi seguro que vale la pena aprender, y te hará un mejor programador. El simple hecho de entender la transparencia referencial hace que muchas decisiones de diseño sean mucho más fáciles, y los programas resultantes son mucho más fáciles de razonar. Básicamente, si se encuentra con un problema, entonces tiende a ser solo un problema con la salida de una sola función, en lugar de un problema con un estado inconsistente, que podría haber sido causado por cualquiera de los cientos de clases / métodos / funciones. En un lenguaje imparativo con efectos secundarios.
La naturaleza sin estado de FP se relaciona más naturalmente con la naturaleza sin estado de la web, y por lo tanto, los lenguajes funcionales se prestan más fácilmente a aplicaciones web RESTUIDAS más elegantes. Contraste con los marcos de JAVA y .NET que necesitan recurrir a HACKS horriblemente feos como las teclas VIEWSTATE y SESSION para mantener el estado de la aplicación y mantener la abstracción (en ocasiones bastante permeable) de un lenguaje imperativo con estado, en una plataforma funcional esencialmente sin estado como la web.
Y también, cuanto más apátrida sea su aplicación, más fácilmente podrá prestarse al procesamiento paralelo. Terriblemente importante para la web, si su sitio web se vuelve popular. No siempre es sencillo simplemente agregar más hardware a un sitio para obtener un mejor rendimiento.
No veo a nadie mencionando el elefante en la habitación aquí, así que creo que depende de mí :)
JavaScript es un lenguaje funcional. A medida que más y más personas hacen cosas más avanzadas con JS, especialmente aprovechando los puntos más finos de jQuery, Dojo y otros marcos, FP será introducido por la puerta trasera del desarrollador web.
Junto con los cierres, FP hace que el código JS sea realmente ligero, pero aún así se pueda leer.
Saludos, PS
Porque la PF tiene beneficios significativos en términos de productividad, confiabilidad y mantenibilidad. Many-core puede ser una aplicación fantástica que finalmente hace que las grandes corporaciones cambien a pesar de los grandes volúmenes de código heredado. Además, incluso los grandes lenguajes comerciales como C # están adquiriendo un sabor funcional distinto como resultado de las preocupaciones de muchos núcleos: los efectos secundarios simplemente No encaja bien con la concurrencia y el paralelismo.
No estoy de acuerdo en que los programadores "normales" no lo entiendan. Lo harán, al igual que al final entendieron la POO (que es igual de misteriosa y extraña, si no más).
Además, la mayoría de las universidades enseñan FP, muchas incluso lo enseñan como el primer curso de programación.
Se está poniendo de moda porque es la mejor herramienta para controlar la complejidad. Ver:
- diapositivas 109-116 de la charla de Simon Peyton-Jones "A Taste of Haskell"
- "El próximo lenguaje de programación: la perspectiva de un desarrollador de juegos" por Tim Sweeney
Siempre soy escéptico acerca de la próxima gran cosa. Muchas veces la próxima gran cosa es pura casualidad de la historia, estar en el lugar correcto en el momento adecuado, sin importar si la tecnología es buena o no. Ejemplos: C ++, Tcl / Tk, Perl. Todas las tecnologías defectuosas, todas tremendamente exitosas porque se percibió que resolvían los problemas del día o eran casi idénticas a las normas arraigadas, o ambas cosas. La programación funcional puede ser grandiosa, pero eso no significa que será adoptada.
Pero puedo decir por qué la gente está entusiasmada con la programación funcional: muchos, muchos programadores han tenido una especie de "experiencia de conversión" en la que descubren que el uso de un lenguaje funcional los hace dos veces más productivos (o tal vez diez veces más productivos) mientras producen Código que es más resistente al cambio y tiene menos errores. Estas personas piensan en la programación funcional como un arma secreta; un buen ejemplo de esta mentalidad es el de Beats the Averages de Paul Graham. Ah, y su aplicación? Aplicaciones web de e-commerce.
Desde principios de 2006 también ha habido cierto alboroto sobre la programación funcional y el paralelismo. Dado que personas como Simon Peyton Jones se han estado preocupando por el paralelismo de vez en cuando desde al menos 1984, no aguanto la respiración hasta que los lenguajes funcionales resuelven el problema multinúcleo. Pero sí explica algunos de los rumores adicionales de ahora.
En general, las universidades estadounidenses están haciendo un mal trabajo en la enseñanza de la programación funcional. Existe un sólido núcleo de soporte para la enseñanza de la programación de intro utilizando Scheme , y Haskell también goza de cierto apoyo allí, pero hay muy poco en cuanto a la enseñanza de técnicas avanzadas para programadores funcionales. He impartido un curso de este tipo en Harvard y lo haré de nuevo esta primavera en Tufts. Benjamin Pierce ha impartido un curso de este tipo en Penn. No sé si Paul Hudak ha hecho algo en Yale. Las universidades europeas están haciendo un trabajo mucho mejor; por ejemplo, la programación funcional se enfatiza en lugares importantes en Dinamarca, los Países Bajos, Suecia y el Reino Unido. Tengo menos idea de lo que está sucediendo en Australasia.
Un punto faltante en la discusión es que los mejores sistemas de tipos se encuentran en lenguajes contemporáneos de PF. Además, los compiladores pueden inferir todos los tipos (o al menos la mayoría) de forma automática.
Es interesante que uno pase la mitad del tiempo escribiendo nombres de tipo al programar Java, pero Java no es seguro para escribir. Si bien nunca puede escribir tipos en un programa Haskell (excepto como un tipo de documentación verificada por el compilador) y el código es 100% seguro.
Una característica clave en un lenguaje funcional es el concepto de funciones de primera clase. La idea es que puede pasar funciones como parámetros a otras funciones y devolverlas como valores.
La programación funcional implica escribir código que no cambie de estado. La razón principal para hacerlo es para que las llamadas sucesivas a una función produzcan el mismo resultado. Puede escribir código funcional en cualquier idioma que admita funciones de primera clase, pero hay algunos idiomas, como Haskell, que no le permiten cambiar de estado. De hecho, se supone que no debes producir ningún efecto secundario (como imprimir texto), lo que parece que podría ser completamente inútil.
Haskell, en cambio, emplea un enfoque diferente de IO: mónadas. Estos son objetos que contienen la operación de E / S deseada para ser ejecutada por el nivel superior de su intérprete. En cualquier otro nivel son simplemente objetos en el sistema.
¿Qué ventajas ofrece la programación funcional? La programación funcional permite la codificación con menos posibilidades de errores porque cada componente está completamente aislado. Además, el uso de funciones de recursión y de primera clase permite pruebas simples de corrección que, por lo general, reflejan la estructura del código.
Wow - esta es una discusión interesante. Mis propios pensamientos sobre esto:
FP hace que algunas tareas sean relativamente simples (en comparación con los lenguajes no FP). Ninguno de los idiomas de PF ya está empezando a tomar ideas de PF, por lo que sospecho que esta tendencia continuará y veremos una mayor combinación que debería ayudar a las personas a hacer que el salto a PF sea más fácil.