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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a cs.stackexchange
scroll top