¿Deberíamos usar más lenguajes de programación funcionales y / o lógicos?

8

He programado un poco de Haskell y Prolog como parte de un par de cursos uni, pero eso es todo. Y nunca he visto que se use en la industria (no es que tenga mucha experiencia laboral para empezar, pero nunca he visto un anuncio donde se requiera que los conozca).

Entonces, ¿deberíamos usar lenguajes de programación funcionales y / o lógicos con más frecuencia? ¿Hay alguna ventaja o desventaja para usarlos o no?

gablin
fuente

Respuestas:

9

Creo en usar la herramienta adecuada para el trabajo. Los lenguajes imperativos y funcionales tienen su lugar y no hay necesidad de presionar para usar un tipo más que el otro.

Por las ventajas / desventajas, no creo que pueda superar la respuesta de Eric Lippert a "¿Por qué la programación funcional aún no se ha hecho cargo?" Tan pregunta.

Adam Lear
fuente
Hmm? ¿Por qué el voto negativo?
Adam Lear
1
No he votado negativamente, pero no estoy de acuerdo con su respuesta (como 'confundir' la concurrencia y el paralelismo; en el mundo funcional, esos términos significan dos cosas diferentes). Sin embargo, no significa que piense que es una mala respuesta.
Maciej Piechotka
De hecho, Eric Lippert fue una respuesta muy informativa. Gracias por la direccion.
gablin
5

En primer lugar, porque el compilador tiene que hacer mucho más. Si desea crear un compilador imperativo, puede hacer una transformación de 1-1 en ensamblador y el código producido tendrá una velocidad aceptable (claro, podría haber mucho que hacer, pero es 'básicamente' 1-1 compilación + optimización). Los compiladores funcionales TIENEN QUE manejar una alineación bien ajustada, una optimización de llamadas de cola, etc. Por lo tanto, la implementación de lenguajes funcionales fue mucho más lenta que C / C ++ / ... en el pasado (sin embargo, ganan mucha velocidad en cada iteración a medida que los compiladores mejoran).

En segundo lugar, los programadores están tan acostumbrados a afirmar que no pueden "aceptar" el enfoque de "no hay spoo ... estado". Claro, la falta de estado no es útil en cada condición, pero la falta de estado (global) no significa falta de estado local.

En tercer lugar, la programación funcional no tiene una buena historia detrás. Los OOP tienen una buena historia ya que los objetos se asignan a sustantivos y lo intuitivo que es. Después, sabes que no es tan simple porque no puedes crear una clase Managercomo una subclase de la Employeeque se Employeepuede promocionar Managery tienes que jugar con decoradores. Los programas funcionales tienen una historia en matemáticas que, en mi humilde opinión, es más útil pero menos comercializable.

Como internamente desde la perspectiva de la computadora: no hay diferencia entre la computación paralela y concurrente, muchos programadores no ven la diferencia y muchos lenguajes tienen las mismas primitivas para manejar ambos. Gracias a la falta de estado local y de hilos livianos en lenguajes de programación funcionales, la paralelización del algoritmo es mucho más fácil. Sin embargo, la programación concurrente no se hace automáticamente más fácil ya que la concurrencia se trata del estado global.

Finalmente, hay muchos programas antiguos escritos en estilo no operativo. Incluso la transferencia del lenguaje imperativo al lenguaje imperativo es mucho más simple que funcional.

Hasta donde yo sé, los bancos de inversión comienzan a adoptar los programas funcionales internamente, por lo que sí entran en XXI c. (en un área muy importante aunque oculta), por lo que ganan impulso.

PD. Si bien creo que los programas funcionales son "mejores" en el sentido de que ocultan la complejidad mejor que otros enfoques, no significa que no hay áreas como los scripts que sean inherentemente imprescindibles.

Maciej Piechotka
fuente
2

Un lenguaje de programación es una forma de representación de información. En este caso, las instrucciones que debe seguir la computadora. Sin embargo, la representación también es importante para el público objetivo (es decir, los programadores).

El concepto funcional / lógico no se usa tan comúnmente en la vida diaria como los conceptos de procedimiento. Si lee las instrucciones (es decir, cómo usar su televisor, reproductor de DVD o construir algunos muebles de IKEA), en su mayoría están escritas de manera procesal (aunque en lenguaje natural).

Por lo tanto, muchas personas que no están muy involucradas en matemáticas o ciencias a menudo están mucho más familiarizadas con dichos conceptos de procedimiento que los lógicos o funcionales.

Creo que esto tiene un gran impacto en la elección de qué clase de lenguaje de programación se utiliza. Al final, el conjunto de problemas que se pueden resolver con cualquiera de estos lenguajes de programación es prácticamente el mismo (siempre y cuando todos estén completos).

Sin embargo, muchos lenguajes de procedimiento obtienen más y más facetas de otros conceptos. Python puede hacer cálculos lambda y cierres, también rubí. Javascript, que se usa mucho en la industria, en realidad es realmente un lenguaje funcional (incluso la mayoría del "uso indebido" de la gente es al usarlo más de manera procesal). Por lo tanto, es realmente tarea del programador usar esas características de manera apropiada donde encajan.

txwikinger
fuente
1
¿Desde cuándo JavaScript es un lenguaje funcional?
Jonas
1
@Jonas - De hecho, es un lenguaje funcional y siempre lo ha sido. Por supuesto, un lenguaje puede seguir muchos paradigmas a la vez como lo hace JavaScript.
ChaosPandion
1
@ChaosPandion: ¿Solo porque tiene cierres y funciones de alto orden? :)
Jonas
@Jonas - De hecho, obviamente no estamos hablando de Haskell aquí, pero todavía puedes llamarlo funcional.
ChaosPandion
2
Supongo que deberías considerar un enfoque general del problema de manera idiomática. Por lo tanto, si el lenguaje de programación sugiere dividir el problema en funciones puras, es funcional. Si sugiere dividir el problema en objetos, está orientado a objetos. Si sugiere "hacer esto y luego hacer eso", es imprescindible. Por lo tanto, lambdas, continuaciones, etc. no son características necesarias solo para lenguajes funcionales y JS no es un lenguaje funcional, ya que no 'sugiere' pensar en términos de funciones y datos inmutables.
Maciej Piechotka