5

He estado leyendo sobre las técnicas de compilación de optimización local, pero sigo sin obtener cómo se implementan. La idea es que el optimizador mira una 'ventana' del código cada vez y de alguna manera detecta patrones y los reemplaza con versiones más optimizadas.patrones de optimización de mirilla

Mi pregunta es, ¿cómo uno descubre estos patrones? (digamos que su plataforma es una máquina virtual que genera código ensamblador para una computadora inventada, como Schock's Hack).

¿La gente realmente inspecciona el código manualmente (usando Gráficos de control de flujo o DAG o lo que sea) y luego reúne todos los patrones identificados y los codifica en el optimizador? O hay una manera automática.

Por ejemplo, alimenta el código que se va a optimizar en un analizador y arroja dichos patrones. Si es así, ¿cómo se puede comenzar a escribir uno?

+0

Creo que esto generalmente se llama 'caché en línea'. Encontrará mucha literatura sobre motores de JavaScript recientes que usan esta técnica en tiempo de ejecución. Ver http://wingolog.org/archives/2012/05/29/inline-cache-applications-in-scheme. – leppie

+0

Eso es interesante, la primera vez que me encuentro con esto. En general estaba pensando en operaciones como la reducción de la fuerza, la evaluación constante, el control de flujo opt, etc. – gfountis

+0

Esto parece estar dirigido a 'tiempo de ejecución' sí? ¿O se usa para generar un código de ensamblaje más ajustado? – gfountis

Respuesta

3

Las optimizaciones de la mirilla clásica no se tratan de la reducción de la fuerza y ​​otras cosas que usted nombra. Son 2-3 secuencias de instrucciones, como por ejemplo

BRANCH FALSE $1 
BRANCH $2 
$1: 

que puede ser reducido a

BRANCH TRUE $2 

secuencias como esta puede surgir en los generadores de código ingenuos tales como vienen con compiladores de un solo paso que no lo hacen generar AST, como algunos compiladores COBOL en los que he trabajado.

+0

Ya veo, pero ¿cómo se pueden descubrir estas secuencias? ¿Hay una lista de patrones en algún lugar publicado? ¿Las personas compilan código aleatorio y luego comienzan a buscarlas por sí mismos? – gfountis

+0

Además, ¿no era un ejemplo de optimización de flujo de control?=) – gfountis

+1

@gfountis Claro que sí, pero los compiladores de los que estoy hablando no hacen análisis de flujo. Las secuencias de mirilla serían obvias para cualquier programador de ensamblaje decente, si queda alguno. Simplemente inspecciona la salida y piensas 'hmm ...'. Esto está todo en los libros habituales. – EJP

1

Depende de usted si desea escribir su propio analizador o utilizar los existentes. En cualquier caso, su analizador sigue revisando el código hasta que no sea más optimizado. Si toma un ejemplo de GCC, tiene pases específicos para la optimización. El código intermedio de su programa se le da a estos pases que se ejecuta uno tras otro y optimiza su código. Además, cualquier pase puede ejecutarse más de una vez.
Si realmente desea ir a través de cómo escribir estas optimizaciones, simplemente vaya a través de passes.h archivo en GCC.

+0

Entonces, en el caso de querer optimizar la generación de código que no sea x86 (para una plataforma de juguetes), la única forma es escribir su propio analizador o hacerlo "a mano" ¿no? – gfountis

+0

La pregunta es acerca de la optimización de mirilla, y no la ha respondido. – EJP