Dentro do compilador
Do texto ao que roda: as oito fases, o que cada uma entrega, e como ver cada uma de dentro da linguagem.
Um arquivo .df atravessa oito fases antes de rodar, e todas podem ser vistas de dentro da linguagem, pelo Arcane.Compilador, ou da linha de comando, por dataforge ir. Nenhuma é caixa-preta: o que o analisador conclui, o grafo em que ele concluiu e o que o backend compilou são dados que um programa lê.
adopt Arcane.Compilador as Comp
assert Comp.fases() is ["lexer", "parser", "hir", "mir", "analises", "ssa", "otimizado", "lir"]
out Comp.tokens("x := 1 + 2")[0]| Fase | Recebe | Entrega | Página |
|---|---|---|---|
| lexer | o texto | tokens com linha e coluna | Lexer |
| parser | tokens | a árvore sintática | Parser |
| analisador | a árvore | erros e avisos, antes de rodar | O analisador |
| HIR | a árvore | a árvore sem açúcar | HIR |
| MIR | o HIR | blocos básicos e arestas | MIR |
| análises | o MIR | vivas, constantes, alcance | O que o fluxo prova |
| SSA | o MIR | uma definição por nome, com φ | SSA |
| LIR | a árvore | o que o compilador de fechamentos cobriu | Backend |
Por onde seguir#
O caminho de compilação
as fases em sequência, com o custo de cada uma
Lexer
INDENT, DEDENT, e por que // às vezes é divisão
Parser
descida recursiva, precedência e a recuperação de erro
O analisador
o que ele prova, e por que cala quando não prova
Dominância
por onde todo caminho passa, e onde vão os φ
Desenhar o grafo
o fluxo em DOT, para o Graphviz
Variáveis vivas
o valor que ainda vai ser lido
Chamada de cauda
a recursão sem teto, e as quatro recusas
O cache de árvores
93% do parse, e a chave que impede o desastre