ventajas programacion perezosa orientada objetos inteligencia funcional evaluacion desventajas artificial aplicaciones haskell optimization functional-programming compiler-optimization inlining

haskell - perezosa - programacion funcional ventajas y desventajas



¿Cuál es la diferencia entre la evaluación parcial y la función en línea en un lenguaje funcional? (1)

Yo sé eso:

  1. La función inline es reemplazar una llamada de función con la definición de función.
  2. La evaluación parcial es para evaluar las partes conocidas (estáticas) de un programa en tiempo de compilación.

Hay una distinción entre los dos en lenguajes imperativos como C, donde los operadores son distintos de las funciones. Sin embargo, ¿hay alguna diferencia entre los dos en idiomas funcionales como Haskell donde los operadores también son funciones?

¿Es la única diferencia entre los dos que la función en línea se puede realizar en partes selectivas de un programa mientras que la evaluación parcial se realiza en todo el programa (es decir, vs )?

¿Cuáles son las diferencias semánticas entre las dos técnicas de optimización?


Hay una diferencia entre

  • evaluar expresiones constantes sobre un conjunto dado de operadores y funciones conocidas por el compilador (o incluso el preprocesador), que ocurre en tiempo de compilación . Por ejemplo, el compilador compila la print(2*2) como print(4) . Esto no debe limitarse a las expresiones del operador, como parece implicar (por ejemplo, print(sqrt(2.0) )
  • evaluación parcial, que es un concepto más amplio. Un compilador podría darse cuenta de que print(myfunc(2)) podría transformarse en print(c) donde c es el resultado de llamar a myfunc(2) . Entonces podría (en " tiempo de especialización ") llamar a myfunc(2) para determinar c . Por supuesto, esto va a ir muy mal si myfunc tiene efectos secundarios, como borrar el disco duro propio en lugar del usuario del programa. Por lo tanto, el compilador necesita algún tipo de anotación o atributo para saber cuándo se permite / desea (por ejemplo, el constexpr de C ++ 11)

Inlinear es un concepto no relacionado. Alinear una llamada de función significa reemplazar la llamada por el cuerpo de la función llamada. Este cuerpo no es evaluado.

Hay una distinción entre los dos en lenguajes imperativos como C, donde los operadores son distintos de las funciones. Sin embargo, ¿hay alguna diferencia entre los dos en idiomas funcionales como Haskell donde los operadores también son funciones?

Esta distinción (operadores vs. funciones) es puramente sintáctica, y no está relacionada con la diferencia entre la evaluación en línea y parcial:

Ambas llamadas a funciones y expresiones con operadores pueden ser inlineadas y evaluadas en tiempo de compilación en C. La evaluación en tiempo de compilación está restringida a expresiones sobre un conjunto fijo de operadores y funciones (principalmente operadores, pero eso es un accidente histórico)

Ambos conceptos tienen sentido y son distintos en Haskell.

  • Inlineación: ghc tiene {-# INLINE f #-} , donde f no puede ser recursivo, por razones obvias,
  • Evaluación parcial: generalmente se generaliza a Supercompilación, donde no solo se transforman las expresiones de tipo base, sino incluso las funciones, por ejemplo, transformando el map f (map g xs ) en el map (f . g) xs ). Puede (pero no necesita) hacer inline también. La plantilla Haskell es otra manera de (explícitamente) evaluar parte de un programa en tiempo de compilación.

La respuesta a la pregunta de su título es: la diferencia entre la evaluación parcial y la parcial no tiene nada que ver con la diferencia entre funciones y operadores, y es muy similar en las lenguas funcionales como en C. La evaluación parcial es probablemente más difícil en C debido a los efectos secundarios (consulte el disco duro borrado arriba)