Backend: o mapa
Item por item da parte 8 da referência Deep Tech — LLVM IR, pipeline de otimização, passes customizados e cross compilation — cruzado com o que o DataForge tem.
A oitava parte de uma referência Deep Tech é sobre o backend do LLVM. É a primeira em que a resposta honesta é em boa medida não se aplica — e a parte em que essa resposta é mais útil que qualquer aproximação, porque cada item aqui pressupõe gerar código de máquina.
38 · LLVM IR#
| Item | No DataForge | Onde |
|---|---|---|
| SSA | existe de verdade: ssa.py, com dominância, fronteira de dominância e nó φ | SSA |
| basic blocks | mir.py — um corpo por ação, arestas rotuladas | MIR |
| instructions | as instruções continuam sendo nós da árvore; a versão SSA é anexada, não reescrita em três endereços | SSA |
| metadata, source locations | line/column em todo nó, e a ação sabe em que arquivo nasceu | Erros |
| debug information | existe, mas é a da linguagem: o DAP, com vigia e ponto de parada | Editor |
| emissão de LLVM IR, tipos LLVM | não existe: emitir o texto é fácil, mas usá-lo exigiria llc/clang instalado, e a linguagem passaria a depender de um compilador C para rodar | Backend |
| intrinsics | não se aplica | — |
| calling conventions | só na fronteira com o C, onde são reais | FFI |
39 · Pipeline de otimização#
| Item | No DataForge | Onde |
|---|---|---|
| constant folding | dobra-de-constante, e nada que possa falhar é dobrado | Otimização |
| dead code elimination | ramo-morto (com prova do SSA) e inalcancavel; mais unused-* no lint | Otimização |
| o pipeline em si | compilador.py: a árvore vira fechamentos, com cobertura medida — 90,9% dos nós do repositório | Otimização |
| loop optimization | parcial, e pelo outro lado: o escopo de uma volta é reaproveitado quando o corpo não captura — medido, e a otimização mais perigosa do interpretador | Arquitetura |
| inlining | não existe. Numa linguagem em que uma ação pode ser substituída em tempo de execução (f := outra, método sobrescrito na filha), embutir o corpo exigiria provar identidade — e é a mesma conferência que a chamada de cauda faz na hora, em vez de assumir | — |
| vectorization, alias analysis | não se aplica: não há registrador SIMD nem ponteiro a desambiguar | — |
| interprocedural / whole-program | não existe no otimizador. O que atravessa fronteira é a análise: aridade, tipo de parâmetro e de retorno pelo adopt | Análise estática |
| global optimization | não existe, e há número dizendo por quê: os passes rendem 1,01× em código real | Otimização |
40 · Passes customizados#
| Item | No DataForge | Onde |
|---|---|---|
| custom optimization passes | --plugin= — uma regra escrita em DataForge, que vê o MIR e o SSA por Arcane.Compilador | Backend |
| static analysis | é o uso que paga: ramo-morto e talvez-nao-definida nasceram exatamente assim | Análises |
| instrumentation | Arcane.Macro.reescrever troca o corpo de uma ação na carga | Macros |
| IR transformation | os três passes de otimizar.py, sobre o HIR | Otimização |
| backend hooks | parcial: o que dá para ligar é análise e reescrita de árvore, não a geração de código — porque ela não existe | Backend |
| plugins C++, LLVM passes | não se aplica: não há IR do LLVM para transformar | — |
41 · Cross compilation#
| Item | No DataForge | Onde |
|---|---|---|
| Linux, Windows, macOS | o release.yml constrói nas quatro plataformas e roda os exercícios pelo binário em cada uma | Download |
| ARM64 e x86_64 | os dois, no macOS; o Linux sai como .deb e PKGBUILD | Instalação |
| contêiner para outra arquitetura | dataforge devops gera Dockerfile e manifesto do Kubernetes | DevOps |
| target triples, cross compiler | não existe: não há código de máquina a produzir, então não há alvo a nomear. O que atravessa plataforma é o interpretador, e ele atravessa por ser Python | |
| RISC-V, WebAssembly, bare-metal, embarcados | não existe. Rodar em WebAssembly seria rodar o CPython em WebAssembly — o que funciona, e não é uma porta desta linguagem | |
| targets personalizados | não se aplica |
O resumo honesto#
Das quatro seções, uma (§38) transferiu substancialmente — SSA, blocos básicos e dominância são teoria de compilador, não de LLVM, e valem igual num interpretador. Uma segunda (§40) transferiu pelo análogo: o passe customizado existe, escrito na linguagem, e é a forma como os dois diagnósticos novos nasceram. A §39 transferiu e foi medida, com o resultado contrariando a expectativa. A §41 não se aplica, e o que ocupa o lugar dela — construir para quatro plataformas — já existia.