Últimamente he leído muchos hilos sobre lenguajes de programación funcionales (de hecho, casi en el último año). Realmente me gustaría elegir uno y aprenderlo a fondo.
El último semestre [del curso], me presentaron a Scheme. Me encantó. Me encantó la extrema simplicidad de la sintaxis, el principio de homoiconicidad , las macros ( higiénicas y no higiénicas), la n-aridad de los procedimientos, etc.
El problema con Scheme es que es un lenguaje académico. No creo que se use realmente en entornos de producción. Tampoco creo que sea particularmente bueno tenerlo en nuestro currículum. Entonces, he estado buscando alternativas. Hay muchos de ellos y de alguna manera todos parecen tener un nivel similar de popularidad.
Algunas reflexiones sobre otros lenguajes funcionales que he considerado todavía:
- Clojure: Suena genial porque puede acceder al mundo de Java, está orientado hacia la escalabilidad y la concurrencia, pero ¿no está el mundo de Java al borde en este momento? Ya conozco Java bastante bien, pero ¿sería prudente agregar aún más energía dependiendo de la JVM?
- Haskell: Parece un idioma muy apreciado, pero por lo que he leído, también es más un lenguaje académico.
- Lisp: Ha existido desde siempre. Parece tener la mayoría de lo que me gusta de Scheme. Tiene una gran comunidad. Por lo que [creo que sé], es probablemente el lenguaje de programación funcional más utilizado en la industria (?).
- F #: Realmente no lo consideré. No soy un gran fanático de las cosas de la EM. No tengo el dinero para pagar sus softwares (podría liberarlos de las alianzas universitarias, pero estoy más inclinado a buscar soluciones impulsadas por la comunidad). Aunque ... supongo que sería la mejor opción orientada a la carrera.
Esta noche, me estoy inclinando hacia Lisp. Hace una semana, fue Haskell. Antes de eso era Clojure. El año pasado, estaba haciendo un esquema para divertirme, no presionarlo por la razón que sabes. Ahora me gustaría hablar en serio (sobre aprender uno, sobre hacer proyectos reales con él, sobre quizás eventualmente trabajar profesionalmente con él). Mi problema es que necesitaría aprenderlos todos en profundidad antes de poder elegir uno.
Respuestas:
Como quieres un lenguaje práctico :
Tenga en cuenta que Haskell y Lisp se usan más que los demás en la industria, aunque ha habido un interés reciente en Clojure y F #.
Pero mira lo que sucede cuando agregamos Scheme a la mezcla:
Hmm, ahora no se parece tanto a un lenguaje académico, ¿verdad?
En realidad, el gráfico anterior es probablemente una mentira; la palabra "esquema" puede aparecer en anuncios de ayuda en otros contextos además de los lenguajes de programación. :)
Así que aquí hay otro gráfico que es probablemente (un poco) más representativo:
Si quieres explorar un dialecto realmente increíble de Scheme, echa un vistazo a Racket.
fuente
Si desea aprender programación funcional, es mejor que primero aprenda Haskell y luego use el idioma que desee. Puede aprender programación funcional usando los otros lenguajes, pero aún permiten código imperativo y orientado a objetos. Si escribe un programa real en Haskell, aprenderá la programación funcional más rápido porque los otros paradigmas no estarán disponibles para recurrir.
Después de escribir su programa Haskell, tendrá herramientas como mónadas y técnicas como codificación sin puntos para llevar al idioma de su elección. Los conceptos parecen correlacionar especialmente bien con Scheme.
fuente
En realidad, si pudieras implementar un sistema razonablemente complejo en Scheme, serías bastante deseable en empresas donde probablemente quieras trabajar. Al principio de mi carrera me encontré con algunos estudiantes que habían realizado una buena cantidad de trabajo en Scheme, y la única vez que fue una desventaja fue cuando no pudieron explicar su trabajo o no lo entendieron lo suficientemente bien como para implementar datos básicos. estructuras y algoritmos en un tiempo razonable. Siempre dejo que los candidatos respondan esas preguntas en su idioma preferido; Me encontré con algunas personas que pensaban que eran mejores en Scheme y que lograron luchar bastante con cosas que deberían ser fáciles, como agregar un elemento a una lista vinculada, lo que me desconcertó.
Pero si pudieras "obtener" el esquema lo suficientemente bien como para escribir incluso una aplicación web promedio, eso sería un buen punto de venta en la mayoría de las compañías de software serias.
Si estuvieras entrevistando en una tienda "blub" y los desarrolladores pensaran que eras raro por tu habilidad en Scheme o Haskell o F #, probablemente no querrías trabajar allí. En la mayoría de los casos, los desarrolladores competentes pueden elegir conciertos, así que no se preocupe por la "practicidad" a menos que las únicas opciones que pueda imaginar en su futuro sean corporativas. Trabaja para ser competente, flexible y resolver problemas.
La universidad no se trata de practicidad. Se trata de crear un ambiente seguro para explorar y aprender. De hecho, eso es útil, incluso si termina escribiendo software ordinario para el resto de su carrera.
Dicho esto, no veo por qué querría limitarse a una de esas opciones tan pronto. Podrías tener una idea fácil de los cuatro idiomas en aproximadamente 4 semanas, luego elegir uno para concentrarte en esas mallas con tus caprichos actuales. Luego, regrese a otra de sus opciones e intente implementar algo similar. Pase a algo más complejo y considere sus opciones nuevamente. La experimentación es buena. A menos que esté tratando de ganarse la vida el próximo mes, aún no necesita convertirse en especialista.
He escrito algunos en Scheme, F #, Emacs Lisp y Common Lisp, y leí al menos un poco de Haskell, al menos ocasionalmente en los últimos años. No puedo decir que soy un experto en ninguno de ellos, pero cada excursión a esos idiomas me ha beneficiado en todos los demás idiomas en los que trabajo profesionalmente (C #, Java, Ruby y, ocasionalmente, Boo, Perl y Python). La curiosidad te construirá una carrera más duradera y satisfactoria que cualquier otra cosa.
fuente
Me sumergí en Haskell por un tiempo, pero la conclusión a la que llegué fue que era demasiado académico. Fue muy difícil hacer algo práctico. En un lenguaje funcional puro, cosas como IO simplemente no encajan en el modelo, por lo que tienes que lidiar con mónadas. Decidí que tendría que dedicar una gran cantidad de tiempo para ser apenas competente, así que seguí adelante.
Hice Scheme en la universidad. Puede sonar trivial, pero todos los padres realmente distraen / molestan. Es difícil volver a eso después de usar lenguajes como Python.
Recientemente he estado explorando F #. Es funcional, pero también puede ser imperativo y orientado a objetos cuando lo desee. Esto, junto con la posibilidad de utilizar cualquier biblioteca .NET, permite mezclar fácilmente sus partes funcionales puras con cosas más prácticas como GUI, IO y redes. Puede obtener una versión independiente de F #.
http://www.microsoft.com/downloads/en/details.aspx?FamilyID=effc5bc4-c3df-4172-ad1c-bc62935861c5&displaylang=en
fuente
Evalué todos los principales lenguajes funcionales hace uno o dos años, desde la perspectiva de querer un lenguaje de programación funcional práctico y de propósito general.
Terminé eligiendo Clojure , que posteriormente resultó ser una excelente opción.
En términos generales, las razones clave fueron:
Ecosistema de bibliotecas : para que un idioma sea útil, necesita acceso a buenas bibliotecas. Estar en la JVM significa que tiene fácil acceso a la biblioteca de código abierto más grande y al ecosistema de herramientas, por lo que optar por un lenguaje JVM fue obvio desde una perspectiva pragmática. Scala también obtuvo una puntuación alta aquí.
Macro-metaprogramación : este aspecto de Lisp siempre me atrajo, especialmente porque anticipé generar bastante código. Aprecio mucho los argumentos formulados en el breve ensayo de Paul Graham " Superando los promedios ". Los diversos Lisps obtuvieron una fuerte puntuación aquí.
El rendimiento fue "suficientemente bueno": Clojure siempre se compila y obtiene los beneficios del optimizador JVM JIT y el excelente GC. Como siempre, hay un poco de sobrecarga en el uso de un lenguaje funcional, pero con Clojure estaba claro que cada uno puede acercarse a la velocidad de Java con un poco de esfuerzo (Clojure admite primitivas de Java y tipeo estático opcional para aquellas situaciones donde lo necesita). Mi estimación es que Clojure es de 2 a 5 veces más lento de lo que podría lograr con el código optimizado de Java o C ++, que es consistente con lo que ve en los puntos de referencia defectuosos , y con el tiempo espero que esa brecha se reduzca aún más. Además, es bastante fácil simplemente escribir código particularmente sensible al rendimiento en Java puro y llamarlo desde Clojure.
Concurrencia : Clojure tiene un enfoque bastante único y poderoso de concurrencia, particularmente para la concurrencia altamente multinúcleo Es un poco difícil de explicar, pero este video es excelente para dar una idea de los principios. Creo que Clojure actualmente tiene la mejor respuesta a la pregunta difícil "¿cómo debe administrar el estado compartido, concurrente y mutable en un lenguaje de programación funcional?".
Diseño del lenguaje : Clojure es IMO, un diseño de lenguaje muy bien pensado. Los ejemplos son tener literales vectoriales [] y de mapa {} además de los paréntesis regulares de Lisp, el uso de estructuras de datos persistentes inmutables, el apoyo a la pereza en todo el lenguaje a través de la abstracción de secuencia y proporcionar al programador una variedad de características ortogonales para resolver diferentes problemas . Vea el arte de la abstracción y lo simple hecho fácil .
Comunidad : siempre subjetiva, pero me gustó lo que vi en la comunidad de Clojure. La actitud fue muy útil, constructiva y pragmática. Hay un fuerte énfasis en "hacer las cosas", posiblemente reflejando el hecho de que mucha gente de Clojure (incluido el propio Rich Hickey) proviene de un entorno de construcción de sistemas empresariales complejos. El hecho de que la comunidad Clojure también tenga fuertes vínculos con la comunidad Java fue importante para convencerme de que Clojure no correría el riesgo de quedar atrapado en un "nicho".
Si tuviera que nombrar un par de inconvenientes menores de Clojure, estos serían:
Escritura dinámica : a menudo esto es una ventaja en términos de productividad, pero en promedio creo que cambiaría esto por una verificación e inferencia de tipos más fuertes. En general, esto se mitiga al tener un buen conjunto de pruebas automatizadas, pero si le gustan sus tipos validados estáticamente por el compilador, entonces Haskell o Scala pueden ser más su taza de té.
Vanguardia : Clojure se está desarrollando muy rápido y hay mucha innovación en curso; la desventaja de esto es que hay mucha experimentación, algunas bibliotecas y herramientas aún son inmaduras, y hay cambios ocasionales entre las versiones principales de Clojure. Necesito vigilar.
Sin embargo, en general, ¡no creo que pueda equivocarse con Clojure si desea un lenguaje funcional moderno excelente y pragmático!
fuente
Parece que has hecho tu tarea, por lo que probablemente ya lo sepas, pero Scheme es un dialecto de Lisp al igual que Common Lisp. Si le gustan muchas cosas sobre Scheme, pero no le gusta su naturaleza académica, pruebe Common Lisp. Según el índice TIOBE , es el decimotercer lenguaje más popular frente a Scheme en la posición 26.
Pocos de los idiomas que ha mencionado aparecen en las descripciones de trabajo que he visto recientemente, aunque ese podría ser mi pequeño conjunto de muestras. Personalmente aprenderé Haskell, aunque no espero usar ese idioma directamente en mi trabajo. Los conceptos de programación funcional son más valiosos para mí para futuros diseños de programas que la comercialización directa del lenguaje en sí.
fuente