Estaba leyendo el libro "Programación funcional para el mundo real". Comenzó con la comparación entre los lenguajes de programación imperativos y funcionales. Y estableció cómo los "valores" y las "expresiones" en la programación funcional son diferentes de las "variables" y las "funciones" de la programación imperativa. De la discusión, desarrollé una idea que:
Los lenguajes de programación funcional tienen más oportunidades de optimizar el tiempo de compilación que sus contrapartes imperativas.
¿Es verdad?
fuente
En principio, es probable que haya más posibilidades de optimización del tiempo de compilación para lenguajes funcionales que para sus contrapartes imperativas.
Sin embargo, es más interesante si se implementan realmente en los compiladores actuales y qué tan relevantes son estas optimizaciones en la práctica (es decir, el rendimiento final del código idiomático 'vida real (TM)' en un entorno de producción, con una configuración de compilador predecible a priori).
por ejemplo, las presentaciones de Haskell para el infame juego de pruebas de lenguaje de computadora (por malo que sea, pero no es que haya, por el momento, algo significativamente mejor por ahí) dan la impresión de que se ha invertido una cantidad significativa de tiempo en Las optimizaciones manuales, que se enfrentan a la afirmación sobre "posibles optimizaciones del compilador debido a
insert some property about FP languages here
", hacen que parezca que las optimizaciones son (al menos actualmente) más una posibilidad teórica que una realidad relevante.Sin embargo, me alegraría que se demuestre que estoy equivocado en este punto.
fuente
En estilo funcional, el flujo de valores a través de un programa es muy, muy visible (tanto para el compilador como para el programador). Esto le da al compilador mucha libertad de acción para decidir dónde almacenar los valores, cuánto tiempo mantenerlos, etc.
En un lenguaje imperativo, el compilador promete al programador un modelo en el que la mayoría de las variables corresponden a ubicaciones reales en la memoria que permanecen durante una vida útil definida. Potencialmente, cualquier declaración puede leer (o escribir en) cualquiera de estas ubicaciones, por lo que el compilador solo puede reemplazar ubicaciones de memoria con asignación de registros, fusionar dos variables en una única ubicación de almacenamiento o realizar optimizaciones similares después de realizar un minucioso análisis de dónde más en el programa se puede hacer referencia a esa variable.
Ahora, hay dos advertencias:
Pero para responder a la pregunta general, sí, un paradigma funcional le da al compilador mucha libertad para optimizar que no tiene en un entorno imperativo.
fuente
main
es una función de transformación de estado en lugar de algo que usa el estado en sí.