O caminho de compilação
As seis fases que um arquivo .df atravessa, o comando que mostra cada uma — e a fase que não existe, dita com esse nome.
Um .df não vai direto do texto ao resultado. Ele atravessa seis fases, e cada uma responde a uma pergunta diferente sobre o mesmo programa. dataforge tokens e dataforge ast mostravam a primeira e a terceira; as do meio não apareciam em lugar nenhum.
texto
↓ lexer.py tokens, com linha e coluna
↓ parser.py AST — 140 formas de no
↓ hir.py HIR — a arvore depois do acucar
↓ typechecker.py nomes, aridade, tipos, posse
↓ mir.py MIR — bloco basico, aresta, laco, tratador
↓ compilador.py LIR — a arvore vira fechamentos
↓ interpreter.py executaO comando#
dataforge ir app.df # o caminho inteiro
dataforge ir app.df --fase=hir # quanto acucar o arquivo usa
dataforge ir app.df --fase=mir # o grafo de fluxo
dataforge ir app.df --fase=analises
dataforge ir app.df --fase=lir # o que compilou, e o que recuou
dataforge ir app.df --fase=mir --acao=classificar
dataforge ir app.df --json # as mesmas fases como dadoUma fase inventada é recusada com a lista — inclusive a que muita gente vai tentar primeiro:
$ dataforge ir app.df --fase=llvm
Erro: fase 'llvm' nao existe.
Fases: tokens, ast, hir, mir, analises, lir, tudo
Nao ha fase de LLVM nem de codigo de maquina: o backend e o
compilador de fechamentos.De dentro da linguagem#
Arcane.Compilador entrega as mesmas fases como dado. É o que permite a um plugin do `check` perguntar coisas de fluxo, e não só de forma — e Arcane.Macro sozinho não alcança isso: ele para na árvore.
adopt Arcane.Compilador as K
fonte := "action f(n):\n given n:\n yield 1\n orif n is 0:\n yield 2\n"
assert K.fases() is ["lexer", "parser", "hir", "mir", "analises",
"ssa", "otimizado", "lir"]
assert K.acucares(fonte) is {"orif-aninhado": 1}
assert K.corpos(fonte) is ["(programa)", "f"]
assert K.lir(fonte)["proporcao"] bigger 0| Símbolo | A fase |
|---|---|
K.fases() | os nomes, na ordem |
K.tokens(fonte) | lexer — um vault por token |
K.arvore(fonte) | parser — a árvore como vault, igual ao Arcane.Macro |
K.hir · K.acucares · K.resolucao | HIR |
K.mir · K.blocos · K.corpos | MIR |
K.alcance · K.constantes · K.escapam · K.vivas · K.talvez_nao_definidas | as análises |
K.lir(fonte) | o que virou fechamento, e o que recuou |
K.texto(fonte, fase) | a fase escrita, igual ao dataforge ir |
Onde o lexer e o parser já estavam documentados#
As duas primeiras fases têm página própria desde antes: a gramática formal em EBNF, as palavras reservadas e a arquitetura do interpretador. O que estas páginas acrescentam é o meio do caminho.