¿Por qué la evaluación parcial no se usa más comúnmente en los lenguajes de programación?

Respuesta corta:
La evaluación parcial puede optimizar el programa, pero ciertamente no puede vencer la ley de Moore o su intuición.

Respuesta larga:
En teoría, la evaluación parcial es una idea en la que podemos evaluar previamente partes del programa para hacerlo más rápido sin cambiar su comportamiento general. En la práctica, esta idea se utiliza de diversas maneras en diversos contextos con diversos efectos.

Si bien la precompilación o la preevaluación de partes del código pueden mejorar el rendimiento del programa, las ganancias serán pequeñas si las partes del programa que se están compilando no están activas. Dado que es increíblemente difícil / imposible saber qué partes del código estarán activas en tiempo de ejecución, las personas usan JITing para mitigar esto. La compilación JIT funciona bien para programas de larga ejecución como máquinas virtuales Java.

A veces, las partes que pueden ser evaluadas previamente son obvias. En tales casos, los programas se pueden optimizar durante la fase de diseño en sí. Por ejemplo, el analizador de espíritu utiliza inteligentemente la metaprogramación de plantillas de C ++ para generar previamente el analizador en la fase de compilación. Otros DSL también pueden hacer que la evaluación parcial sea redundante.

Si bien la evaluación parcial puede sonar bien en papel y puede funcionar bien en algunos casos, no se puede aplicar en la mayoría de los casos en los que puede parecer un buen lugar para aplicarla. En la práctica, es difícil hacerlo automáticamente debido a 2 razones

  • Puede haber información incompleta para optimizar realmente el programa automáticamente.
  • También es realmente difícil juzgar qué es un programa correcto pero con mejor desempeño en presencia de bloqueos, múltiples hilos y múltiples procesos.

Incluso en casos simples donde la evaluación parcial es simple de aplicar, puede afectar el rendimiento. Por ejemplo, la compilación previa puede causar errores de caché y alineaciones incorrectas de líneas de caché que pueden obstaculizar el rendimiento en lugar de mejorarlo.

Incluso después de todas estas optimizaciones, las ganancias de rendimiento obtenidas se verán eclipsadas por los beneficios obtenidos de los medios arquitectónicos o algorítmicos o la ley de Moore.