haskell - ¿Qué es la supercompilación?
compilation supercompilation (2)
Corto y dulce: he visto varias fuentes hablando de "supercompilación". Pero todavía tengo que encontrar un solo documento en cualquier parte de Internet que describa de qué se trata . Presumiblemente porque parece lo suficientemente simple para quien sea que ni siquiera vale la pena explicarlo.
¿Alguien sabe lo que es esto en realidad?
De Wikipedia en Metacompilation :
La metacompilación es una computación que involucra transiciones de metasistema (MST) de una máquina de computación M a una metamaquina M ''que controla, analiza e imita el trabajo de M. La transformación de programas basada en semántica, como la evaluación parcial y supercompilación (SCP), es metacomputación .
Más sobre Metasystems en Wikipedia .
No estoy bien informado sobre el tema, pero daré mi comprensión de la descripción. Digamos que teníamos un programa simple que podía copiar stdin a stdout. Esta sería nuestra máquina de computación M. Nuestra metamachine M ''es un segundo programa que toma la fuente de M como entrada (o está construida para conocer inherentemente M) y, por lo tanto, es capaz de comprender no solo lo que M hace, sino cómo lo hace.
Si mi comprensión es correcta, entonces la pregunta obvia es ¿por qué nos preocupamos por M ''? Lo que me viene a la mente son las optimizaciones automáticas. Si podemos entender cómo funciona M y qué M está tratando de lograr, M ''puede resolver formas de mejorar la operación de M, ya sea en el espacio o en el tiempo. Además, y lo que es más importante, M ''puede sustituir a M ya que M'' puede lograr cualquier cosa que M hiciera. Esto significa que M '''' puede mejorar las formas en que M ''optimizó M, y luego reemplaza M'', y así sucesivamente.
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 en tiempo de compilación, como convertir el map f (map g xs)
en un map (f . g) xs
sin nada más que la definición de map
(Al menos creo que obtuve 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 la creación de líneas. 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, envuelva el resultado en un case
o haga algo diferente con sus valores imaginarios.
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 una serie de buenas presentaciones que lo describen.
Espero que eso ayude.