El compilador de Stalin se optimiza brutalmente, pero ¿cómo?


14

La declaración de investigación de JM Siskind dice:

Stalin es un compilador optimizador para Scheme que realiza análisis estáticos de todo el programa y utiliza los resultados de ese análisis para generar código extremadamente eficiente. Stalin utiliza una gran colección de técnicas de análisis estático. Realiza una nueva forma de análisis de flujo polivalente que utiliza análisis de flujo monovariante iterado para realizar la división dirigida por flujo: clonación de copias especializadas de procedimientos y asignación de objetivos por sitio de llamada a dichos clones. Utiliza los resultados del análisis de flujo para realizar análisis de tiempo de vida, análisis de escape, análisis de puntos y análisis de alias obligatorio. Estos análisis admiten una forma novedosa de conversión de cierre liviana que elimina la mayoría de las ranuras de cierre, utilizando técnicas como la globalización y localización variables, comprime la cadena de retorno estática y generalmente elimina la mayoría de los cierres de los programas. También utiliza los análisis anteriores para admitir la gestión de almacenamiento basada en la región dirigida por el flujo, donde la recolección de basura en tiempo de ejecución se reemplaza con la asignación estática y la desasignación por valor por resumen y por punto de programa. También realiza una conversión de CPS liviana dirigida al flujo, utilizando extensiones de las técnicas desarrolladas por primera vez con Screamer, para admitir continuaciones de primera clase extremadamente eficientes. Finalmente, admite la selección de representación de bajo nivel y en línea dirigida al flujo para elegir la implementación (o no implementación) de etiquetas, verificación de etiquetas y envío de etiquetas en función de cada valor abstracto y por punto de programa. Esto elimina la mayoría de las etiquetas de tiempo de ejecución, verificación de etiquetas, etiquetado, eliminación de etiquetas, despacho de etiquetas, boxeo y unboxing de los programas. donde la recolección de basura en tiempo de ejecución se reemplaza con asignación estática y desasignación en función de cada valor abstracto y por punto de programa. También realiza una conversión de CPS liviana dirigida al flujo, utilizando extensiones de las técnicas desarrolladas por primera vez con Screamer, para admitir continuaciones de primera clase extremadamente eficientes. Finalmente, admite la selección de representación de bajo nivel y en línea dirigida al flujo para elegir la implementación (o no implementación) de etiquetas, verificación de etiquetas y envío de etiquetas en función de cada valor abstracto y por punto de programa. Esto elimina la mayoría de las etiquetas de tiempo de ejecución, verificación de etiquetas, etiquetado, eliminación de etiquetas, despacho de etiquetas, boxeo y unboxing de los programas. donde la recolección de basura en tiempo de ejecución se reemplaza con asignación estática y desasignación en función de cada valor abstracto y por punto de programa. También realiza una conversión de CPS liviana dirigida al flujo, utilizando extensiones de las técnicas desarrolladas por primera vez con Screamer, para admitir continuaciones de primera clase extremadamente eficientes. Finalmente, admite la selección de representación de bajo nivel y en línea dirigida al flujo para elegir la implementación (o no implementación) de etiquetas, verificación de etiquetas y envío de etiquetas en función de cada valor abstracto y por punto de programa. Esto elimina la mayoría de las etiquetas de tiempo de ejecución, verificación de etiquetas, etiquetado, eliminación de etiquetas, despacho de etiquetas, boxeo y unboxing de los programas. utilizando extensiones de las técnicas desarrolladas por primera vez con Screamer, para admitir continuaciones de primera clase extremadamente eficientes. Finalmente, admite la selección de representación de bajo nivel y en línea dirigida al flujo para elegir la implementación (o no implementación) de etiquetas, verificación de etiquetas y envío de etiquetas en función de cada valor abstracto y por punto de programa. Esto elimina la mayoría de las etiquetas de tiempo de ejecución, verificación de etiquetas, etiquetado, eliminación de etiquetas, despacho de etiquetas, boxeo y unboxing de los programas. utilizando extensiones de las técnicas desarrolladas por primera vez con Screamer, para admitir continuaciones de primera clase extremadamente eficientes. Finalmente, admite la selección de representación de bajo nivel y en línea dirigida al flujo para elegir la implementación (o no implementación) de etiquetas, verificación de etiquetas y envío de etiquetas en función de cada valor abstracto y por punto de programa. Esto elimina la mayoría de las etiquetas de tiempo de ejecución, verificación de etiquetas, etiquetado, eliminación de etiquetas, despacho de etiquetas, boxeo y unboxing de los programas.Estos análisis y optimizaciones permiten a Stalin generar código extremadamente eficiente que supera a todos los demás compiladores de Scheme por factores que oscilan entre dos y cien, particularmente para el código numéricamente intensivo. Stalin a menudo genera código que supera el código manuscrito c y Fortran.

Pude encontrar el siguiente documento muy interesante sobre la implementación de cierres / llamadas de función: Conversión de cierre ligero dirigido por flujo . También le envié un correo electrónico al autor para preguntar sobre los documentos sobre otros temas, que se mencionan como escritos en el documento de conversión de cierre:

Siskind, JM 2000a. Conversión CPS ligera dirigida al flujo. En la preparación de.

Siskind, JM 2000b. Polivariancia dirigida al flujo. En la preparación de.

Siskind, JM 2000c. Selección de representación dirigida al flujo. En la preparación de.

Siskind, JM 2000d. Gestión de almacenamiento dirigida por flujo. En la preparación de

Desafortunadamente, nunca llegó a escribir esos papeles. Mi pregunta para usted es: ¿hay algún documento alternativo o relacionado que cubra estos temas? Estoy muy interesado en saber cómo Stalin (u otros compiladores) pueden compilar un lenguaje de alto nivel como Scheme que se recolecta basura, se escribe dinámicamente, admite funciones de primera clase e incluso las continuaciones de primera clase se pueden compilar estáticamente en un código tan eficiente . Aunque los documentos sobre análisis de flujo son bastante abundantes, los documentos sobre el uso de los resultados de dicho análisis para hacer las optimizaciones mencionadas anteriormente no lo son.

Respuestas:


11

La clave es probablemente el hecho de que utiliza el análisis de todo el programa y la optimización de todo el programa. Cuanto más sepa acerca de cómo se comporta un programa, más podrá especializarse, alinearse y ser más eficaz.

El compilador de MLton para ML estándar hace algo similar ( http://mlton.org/ ). Hay una presentación (al menos) al respecto: http://mlton.org/pages/References/attachments/060916-mlton.pdf .

Craig Chambers y su grupo de la Universidad de Washington realizaron un trabajo anterior (por ejemplo: http://www.cs.washington.edu/research/projects/cecil/www/pubs/jdean-thesis.html ). Esto se hizo en el contexto de Self y más tarde Cecil / Vortex.

Probablemente haya más trabajo en la comunidad Scheme / Lisp. Probablemente desee considerar buscar en Google "la optimización de todo el programa".

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.