Introdução

IR (Intermediate Representation), é a representação intermediaria que é o conjunto de estruturas de dados para representar o código processado. A vantagem da utilização de uma representação intermediária é facilmente entendida na seguinte figura:

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/c07ade24-f44f-4785-ab8d-621cb8519073/Untitled.png

Fonte: https://www.cs.princeton.edu/courses/archive/spr03/cs320/notes/IR-trans1.pdf

A utilização de compiladores em três estágios é empregado no projeto LLVM. Talvez tenham ouvido falar do compilador Clang, que é usado pela Apple e no repl.it. Algumas linguagens mais recentes tem usado essa plataforma, como Rust e Swift.

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/ea862326-7c54-46b0-86e4-82fd2b8ce076/Untitled.png

Um exemplo de código na LLVM IR:

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/788ab789-3d54-4bf3-ac63-1e7249103685/Untitled.png

Fonte: https://llvm.org/docs/LangRef.html

Representações gráficas e ASTs

Uma árvore sintática (parse tree) é uma representação gráfica para a derivação, ou análise sintática, que corresponde ao programa de entrada (Cooper). Essas árvores terão os elementos presentes na sintaxe daquela linguagem, incluindo: parenteses, palavras chaves, demarcadores ..

Untitled

A árvore sintática abstrata (AST — Abstract Syntax Tree) retém a estrutura essencial da árvore de derivação, mas elimina os nós irrelevantes. A precedência e o significado da expressão permanecem, mas os nós irrelevantes desapareceram (Cooper). Por exemplo, para AST não importa se um bloco é demarcado por chaves, endentação ou palavras reservadas como begin e end. Por exemplo, uma AST:

Untitled