O compilador: o mapa
Item por item da parte 7 da referência Deep Tech — pipeline, lexer, parser, AST, HIR, MIR, LIR e análise estática — cruzado com o que o DataForge tem.
A sétima parte de uma referência Deep Tech abre o compilador: as oito seções vão do pipeline às análises. É a parte em que o DataForge tem mais do que parece — ele tem lexer, parser, AST, analisador e backend próprios — e ao mesmo tempo a primeira em que um item é honestamente não se aplica.
30 · Pipeline de compilação#
| Item | No DataForge | Onde |
|---|---|---|
| fluxo de fases | seis fases, e dataforge ir mostra cada uma | Pipeline |
| type checking | typechecker.py — 1752 linhas, entre o HIR e o MIR | Análise estática |
| borrow checking | Arcane.Posse mais as checagens de fluxo do check | Posse |
| LLVM IR, machine code, linker | não se aplica: o DataForge é interpretado. O backend é o compilador de fechamentos, e a última fase é chamar fechamento Python | Pipeline |
31 · Lexer#
| Item | No DataForge | Onde |
|---|---|---|
| tokenização, identificadores, keywords | lexer.py; 81 palavras reservadas, e as contextuais que não são | Palavras |
| literais, operadores | inteiro, real, texto, yes/no/void, tupla; ~/ para divisão inteira | Operadores |
| comentários | // é comentário por padrão, e vira divisão só quando o que segue confirma | Operadores |
| strings, interpolação | $"…{expr}…", com {x:.2f}; a string aninhada é copiada verbatim | Interpolação |
| source spans | linha, coluna e span em todo nó e em todo erro — é o que desenha a seta | Erros |
| erros léxicos | SyncError para tab na indentação, e a mensagem diz o que fazer | Erros |
| INDENT/DEDENT | além da lista: o lexer emite os dois, e é deles que sai a profundidade do formatador | Arquitetura |
32 · Parser#
| Item | No DataForge | Onde |
|---|---|---|
| recursive descent | parser.py, 1941 linhas, descendente recursivo | Arquitetura |
| precedência, associatividade | por nível de função (parse_or → parse_and → …) | Gramática |
| parsing de expressões e declarações | o conjunto todo, com a EBNF gerada do código | Gramática |
| AST construction | ast_nodes.py — 140 dataclasses | AST |
| Pratt parser | não é a técnica usada: a precedência é a cascata de funções. Pratt paga quando a tabela de operadores é dinâmica, e aqui ela é fixa | — |
| recuperação de erros | parcial: o check continua depois de um arquivo que não compila (a superfície devolve aberta = yes), mas dentro de um arquivo o primeiro erro de sintaxe encerra a leitura | — |
33 · AST#
| Item | No DataForge | Onde |
|---|---|---|
| nós de expressão e de declaração | 140 classes; dataforge ast e K.arvore(fonte) | Pipeline |
| tipos, funções, structs, traits, generics | TypeDeclaration, ActionDeclaration, RecordDeclaration, TraitDeclaration, type_params | Tipos |
| pattern matching | oito classes de padrão, de WildcardPattern a OrPattern | Pattern matching |
| metadados, source locations | line, column em toda ASTNode; a ação sabe em que arquivo nasceu | Erros |
| a árvore como dado | além da lista: Arcane.Macro a entrega como vault, e a volta é conferida | Macros |
34 · HIR#
| Item | No DataForge | Onde |
|---|---|---|
| desugaring | hir.normalizar — cinco açúcares, e oito formas que só parecem | HIR |
| resolução de nomes | hir.resolucao — parâmetro, local, livre, embutido, por corpo | HIR |
| normalização | é o mesmo passo: o HIR é a AST restrita ao núcleo | HIR |
| expansão de macros | roda na carga, no comptime e no decorador de macro — antes desta fase | comptime |
| representação semântica | o HIR usa as mesmas classes da AST, de propósito: é o que permite provar a equivalência rodando os dois | HIR |
35 · MIR#
| Item | No DataForge | Onde |
|---|---|---|
| basic blocks, controle de fluxo | mir.construir — um corpo por ação, arestas rotuladas | MIR |
| dataflow analysis | vivacidade, definição em todo caminho, propagação de constante | Análises |
| borrow checking | posse-movida, emprestimo-escapa, recurso-vazado — no typechecker, sobre a árvore | Posse |
| ownership analysis | a mesma família, e escapam responde quem mais alcança o valor | Análises |
| lifetime analysis | não há tempo de vida nomeado ('a): o coletor do Python responde pela memória, e um 'a sem nada para provar seria cerimônia | — |
| otimizações intermediárias | não há: o MIR é para analisar, não para reescrever. O ganho de velocidade vem do compilador de fechamentos, medido em 1,5× a 1,8× | — |
36 · LIR#
| Item | No DataForge | Onde |
|---|---|---|
| lowering | a árvore vira fechamentos Python, uma vez | LIR |
| operações primitivas | cada fechamento delega aos mesmos auxiliares do interpretador (_operar, _comparar) — não há segunda semântica | Arquitetura |
| preparação para backend | é o backend: dataforge ir --fase=lir diz o que compilou e o que recuou | LIR |
| calling conventions, ABI lowering | existem, mas só na fronteira com o C: Arcane.C declara a assinatura e o ctypes aplica a ABI da plataforma | FFI |
| representação de memória | o mesmo: C.estrutura dá tamanho, alinhamento e deslocamento de verdade | FFI |
| registradores, spilling | não se aplica | — |
37 · Análise estática#
| Item | No DataForge | Onde |
|---|---|---|
| type checking | dataforge check, e ele atravessa arquivos: aridade, tipo de parâmetro e de retorno pela fronteira do adopt | Análise estática |
| dataflow analysis | as cinco análises do MIR | Análises |
| reachability | alcancaveis, mais o unreachable depois de yield/halt/skip e o point-inalcancavel | Análises |
| dead code analysis | unused-variable, unused-import, unused-parameter no lint | Lint |
| constant propagation | constantes, e o check já provava indice-fora-do-alcance e chave-ausente a partir de literal | Análises |
| escape analysis | escapam, com quatro motivos | Análises |
| borrow / lifetime analysis | a família da posse; tempo de vida nomeado não existe | Posse |
| static assertions | assert dentro de comptime — o check o executa e acusa comptime-falhou | comptime |
| formal verification hooks | expects, promises, invariant são contratos cobrados em execução, e --plugin= deixa acoplar uma regra própria. Prova formal (SMT, refinamento provado) não existe | Contratos |
O resumo honesto#
Das oito seções, seis estão cobertas de ponta a ponta — e duas delas (HIR e MIR) passaram a existir como representação inspecionável, não só como código escondido dentro do analisador. O que fica de fora é o que depende de gerar código de máquina: LLVM, registradores, linker. Não é uma lacuna a preencher: é o que a escolha de ser interpretado significa, e o teto dessa técnica já está medido em ~6,5×.