La supercompilación se puede abordar como una generalización de la evaluación parcial. La idea detrás de la evaluación parcial es que muchas partes de un programa se pueden evaluar en tiempo de compilación, y así debería ser. La supercompilación extiende esto, evaluando cosas que no se pueden completar completamente en tiempo de compilación, como convertir map f (map g xs)
en map (f . g) xs
sin nada además de la definición de map
(Al menos creo que obtuve una evaluación parcial correcta, solo he leído mucho sobre supercompilación)
Otra forma de verlo es como una combinación de muchas otras optimizaciones, como la deforestación, la especialización y el alineamiento. Al actuar como si ya conociera las entradas a las funciones y la evaluación, puede obtener un método más directo para calcular el resultado: puede deshacerse de las estructuras de datos intermedias al ver cómo se usarán o puede conectar todos los valores posibles y luego ajuste el resultado en un case
, o haga otra cosa con sus valores simulados.
Max Bolingbroke tiene una serie de documentos útiles sobre el tema - Recomiendo el primero, Supercompilation by Evaluation, como introducción. La Sección 2 presenta el tema con el ejemplo y el resto, aunque es un poco difícil de entender, es muy informativo sobre el proceso. Neil Mitchell también tiene un number of good presentations que lo describe.
Espero que ayude.
http://c2.com/cgi/wiki?SuperCompiler – vulkanino
Consulte las presentaciones en la página Supero de Neil Mitchell, en pocas palabras, el programa se evalúa en tiempo de compilación.Cuando el programa no tiene dependencias de datos de tiempo de ejecución, se puede evaluar completamente, de lo contrario, se deja una expresión "residual" que forma parte del ejecutable. –