Otimização de código - sintaxe árvore vs.representação intermediária
-
29-09-2020 - |
Pergunta
Eu estou trabalhando em um compilador para o meu próprio idioma personalizado.Como eu estava lendo um artigo sobre otimização de código, percebi que ele pressupõe-se que a representação intermediária do código já havia sido formado.Embora eu ainda não comecei a escrever a seção otimização da minha compilador, eu tenho de passar por isso na minha cabeça e parece preferível ter o otimizador de operar sobre a sintaxe da árvore antes de converter a representação intermediária.
Existe uma razão para preferir uma abordagem para o outro ou é mais uma questão de gosto pessoal?
Por exemplo, suponha que eu tenha um if
bloco como
if ( some_expression ) {
do_stuff
}
Se ele pudesse ser reconhecido pelo compilador que some_expression
será sempre avaliada como verdadeiro e não têm efeitos colaterais, então eu poderia remover a sua computação simplesmente por poda de árvore.
No entanto, se eu já tinha convertido a árvore para uma representação intermediária, como uma assembleia-ish lista de instruções simples, os processos de reconhecer e resolver o cenário poderia ser (na minha imaginação, já que eu ainda não tentou implementado este) muito mais complicada.
Solução
Estes dias, a tendência é para fazer a otimização com a representação intermediária.Confira O LLVM por exemplo:
O LLVM Núcleo de bibliotecas fornecem uma fonte moderna - e-alvo-independente otimizador, juntamente com o suporte de geração de código para muitos populares CPUs (bem como alguns menos comuns!) Essas bibliotecas são construídos em torno de um bem especificado representação em código conhecido como o LLVM representação intermediária ("LLVM IR").O LLVM bibliotecas centrais estão bem documentados, e é particularmente fácil inventar sua própria língua (ou a porta de um existente do compilador) para usar o LLVM como um otimizador e gerador de código.
O LLVM pode fornecer uma fonte independente de optimizer porque ele está executa a sua optimização passa sobre o código só depois é representado no LLVM IR.
Por que poderia ser muito mais complicado para fazer isso?Isso depende de sua representação intermediária.Um dos objetivos do projeto para a representação intermediária seria para facilitar várias otimizações em vez de torná-los desnecessariamente complicado.Ver todas as otimizações que o LLVM pode alcançar a trabalhar no LLVM IR, por exemplo, neste lista de análise e de transformação passa.