Para mim, a grande vantagem da AST heterogênea é que ela forma uma espécie de instrução switch
anotada e forçada (assumindo uma linguagem semelhante a C).
Para o AST homogêneo, você geralmente acaba com algum tipo de rotina ou classe com uma grande declaração switch
. Você precisa acompanhar qual nó filho é o que você mesmo. "Primeiro filho é o condicional, segundo o bloco verdadeiro, terceiro o falso bloco." Sempre que você altera o código, você se vê facilmente fazendo uma imagem mental de sua sintaxe DSL repetidas vezes.
É claro que você pode documentar muito, mas um bom programa deve ser auto-documentado o máximo possível. A AST heterogênea faz exatamente isso.
Além disso, você pode facilmente transformar uma AST heterogênea em uma homogênea, mas não o contrário. Adicione as informações da tag (o que é uma boa ideia, a menos que seu idioma ofereça suporte a uma consulta is-a
barata). Você pode adicionar métodos Node(int index)
para retornar os campos nomeados. Então você não perde nada em geral usando a AST heterogênea.
Não vou mencionar que o AST heterogêneo é ideal para o padrão Visitor, já que é tão fácil usar o padrão Strategy com a rotina switch
homogênea. É mais fácil adicionar funcionalidade específica à própria AST heterogênea, no entanto. Se você quiser transformá-lo em um intérprete, tudo o que você precisa fazer é adicionar algum tipo de método "eval".
Eu consideraria uma AST homogênea se houvesse circunstâncias limitantes . Se você precisar portar o compilador para um sistema sem linguagem OOP disponível, ou se precisar otimizar a velocidade. O AST homogêneo é mais fácil de combinar com um FSM. O último também pode ser uma vantagem se você quiser ter um compilador multi-uso geral que carregue regras de sintaxe rapidamente. Mas é mais fácil começar com um AST heterogêneo que irá gerar essas tabelas, depois que o compilador tiver sido completamente testado.
Portanto, apesar de tudo, eu diria que nenhuma das árvores oferece vantagens específicas em termos de "essa árvore ajuda ou dificulta, digamos, 'passes semânticos'?" A vantagem do AST heterogêneo é, na minha experiência, reduzir a quantidade de pensamento e concentração que você tem que colocar na codificação do material tedioso do compilador. Há muita repetitividade e contabilidade acontecendo, então deixe o computador fazer o trabalho para você o máximo possível, é o meu lema.