Pular para o conteúdo

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.

As seis fases
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      executa

O comando#

dataforge ir
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 dado

Uma fase inventada é recusada com a lista — inclusive a que muita gente vai tentar primeiro:

A fase que não existe
$ 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.

dataforge
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ímboloA 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.resolucaoHIR
K.mir · K.blocos · K.corposMIR
K.alcance · K.constantes · K.escapam · K.vivas · K.talvez_nao_definidasas 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.