Pregunta

Estoy trabajando en un compilador para mi propio lenguaje personalizado.Mientras leía un artículo sobre optimización de código, noté que se suponía que la representación intermedia del código ya se había formado.Aunque todavía no he empezado a escribir la sección de optimización de mi compilador, la he estado repasando mentalmente y parece preferible que el optimizador opere en el árbol de sintaxis antes de convertirlo a la representación intermedia.

¿Hay alguna razón para preferir un enfoque u otro o es más que nada una cuestión de gusto personal?

Por ejemplo, supongamos que tengo un if bloquear como

if ( some_expression ) {
    do_stuff
}

Si el compilador pudiera reconocer que some_expression siempre se evaluará como verdadero y no tendrá efectos secundarios, entonces podría eliminar su cálculo simplemente podando el árbol.

Sin embargo, si ya hubiera convertido el árbol en una representación intermedia, como una lista de instrucciones simples tipo ensamblado, los procesos de reconocimiento y resolución del escenario serían (en mi imaginación, ya que todavía no he intentado implementar esto) mucho más complicado.

¿Fue útil?

Solución

Hoy en día, la tendencia es optimizar con la representación intermedia.Verificar LVM Por ejemplo:

Las bibliotecas LLVM Core proporcionan un optimizador moderno independiente del origen y del destino, junto con soporte de generación de código para muchas CPU populares (¡así como algunas menos comunes!). Estas bibliotecas se basan en una representación de código bien especificada conocida como representación intermedia de LLVM. ("LLVMIR").Las bibliotecas LLVM Core están bien documentadas y es particularmente fácil inventar su propio lenguaje (o adaptar un compilador existente) para usar LLVM como optimizador y generador de código.

LLVM puede proporcionar un optimizador independiente de la fuente porque realiza su optimización sobre el código solo después de que se representa en LLVM IR.

¿Por qué podría ser mucho más complicado hacer esto?Depende de su representación intermedia.Uno de los objetivos del diseño de la representación intermedia sería facilitar diversas optimizaciones en lugar de complicarlas innecesariamente.Vea todas las optimizaciones que LLVM puede lograr trabajando en LLVM IR, por ejemplo, en este lista de pases de análisis y transformación.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a cs.stackexchange
scroll top