No.
La recursión no siempre tiene que usar la pila. Hay dos formas generales de evitar esto: en una configuración estricta, la eliminación de llamadas de cola no usa la pila, y en una configuración perezosa podemos reificar nuestro cálculo como una estructura de datos perezosa que usa el montón.
Al igual que podemos reescribir cualquier procedimiento recursivo con un bucle y una estructura de datos explícita basada en el montón para el almacenamiento en un lenguaje imperativo, siempre podemos reescribir una función recursiva al estilo de paso de continuación para evitar completamente el uso de la pila. Esto significa que podemos tener el mismo tipo de control sobre el uso del montón y la pila en un programa funcional con recursividad que en un programa imperativo con bucles. Por supuesto, esto requiere llamadas de cola adecuadas, ¡pero eso es algo que todo lenguaje funcional razonable tiene!
- ¿Es el sistema embebido lo mismo que una computadora de placa única?
- ¿Es bueno usar Buck Converter para suministrar microcontrolador?
- ¿Qué es Embedded Computer Vision y en qué se diferencia de los sistemas embebidos?
- ¿Cuál es el mejor instituto para capacitación en sistemas integrados en Bangalore con buenas ubicaciones?
- ¿Es necesario aprender sobre la arquitectura del kernel y la programación del controlador del dispositivo para convertirse en un desarrollador integrado? ¿Cuál es la importancia de eso?
Además, toda la separación de pila / montón es solo un detalle de implementación. ¡Nada dice que cada lenguaje debe tener una pila y un montón como C! Un lenguaje funcional siempre podría implementar la pila de una manera diferente o simplemente hacerla más grande.
El uso de la pila no es el problema. Pero el uso de memoria es, al menos para algunas aplicaciones.
Cuando los lenguajes funcionales tienen problemas de memoria, el problema no es la recurrencia o incluso el uso de la pila en general. Más bien, el problema es doble: control limitado sobre la asignación y la recolección de basura . Los lenguajes funcionales modernos naturalmente asignan muchos valores en rápida sucesión y, por lo tanto, requieren un recolector de basura particularmente activo ajustado para este caso de uso. Desafortunadamente, el rendimiento de este tipo de recolector de basura es difícil de predecir. (No estoy seguro de si es mucho peor que los GC de lenguajes como Java).
Esta dependencia de la recolección de basura y el control limitado sobre la memoria hacen que la mayoría de los lenguajes funcionales modernos se adapten mal a ciertas aplicaciones integradas, especialmente a aquellas con poca memoria o limitaciones de tiempo real.
Sin embargo, son una opción perfectamente razonable para otras aplicaciones integradas. Algunos chips incrustados, por ejemplo, ejecutan Java o incluso lenguajes recolectados de basura menos eficientes; en estos casos, usar OCaml o incluso Haskell no debería ser un gran problema. Requeriría un poco más de disciplina que la programación OCaml / Haskell normal, pero eso también es cierto para los lenguajes imperativos en estos sistemas.
Por lo tanto, los lenguajes funcionales encajan mal en ciertos sistemas embebidos, no debido a la recurrencia, sino al comportamiento de la memoria que es más difícil de predecir, en gran parte gracias a la recolección de basura.