Pular para o conteúdo

O ecossistema, conferido

O inventário da implementação com uma marca por componente — e uma conferência nas duas direções, para que o mapa não possa mentir.

A referência fecha com um desenho do ecossistema: dfc com onze fases, dfup, dfpm, um runtime de seis peças, sete ferramentas e oito alvos.

Um desenho desses é o texto mais fácil de escrever num projeto — e o mais fácil de deixar envelhecer. Ele não roda, ninguém o executa, e no dia em que uma peça muda de nome o mapa passa a mentir sem nada denunciar.

As três marcas#

Cada componente do desenho carrega um de três estados, e o terceiro é o que dá valor ao mapa:

MarcaEstadoQuer dizer
[+]existea peça está aqui, com esse papel
[~]equivalenão há essa peça; há outra que responde a mesma pergunta por outro mecanismo — nomeada, com o porquê
[-]nao-existenão há, e o motivo está escrito

A lista é fechada de propósito. Um quarto estado seria o lugar onde "mais ou menos" se esconderia — e é exatamente o que se quer não ter num inventário.

bash
dataforge ecossistema              # o inventario inteiro
dataforge ecossistema --ausencias  # so o que nao existe, e o motivo
dataforge ecossistema --json       # para o CI ler

A conferência nas duas direções#

O que impede o mapa de envelhecer não é cuidado de quem escreve: é conferir(), e ele cobra duas coisas.

DireçãoO que cobraO que impede
faltandotodo caminho citado no mapa existe no discoa peça foi renomeada e o mapa continua apontando para o nome antigo
orfaostodo módulo de dataforge/ aparece em algum componenteum módulo novo nasce fora do mapa, e o inventário fica incompleto em silêncio
dataforge
adopt Arcane.Ecossistema as Eco

n := Eco.numeros()
assert n["componentes"] bigger 30
assert n["nao_existem"] bigger 0

c := Eco.conferir()
assert c["ok"] is yes
assert len(c["faltando"]) is 0
assert len(c["orfaos"]) is 0
out $"{n['componentes']} componentes, {c['citados']} caminhos conferidos"

O comando sai com 1 quando o mapa e o disco discordam. É o que faz um CI reprovar um inventário que passou a mentir — a mesma escolha do dataforge abi, que sai com 2 quando o contrato quebra.

Os grupos, e o que há em cada um#

O dfc do desenho não é um binário separado aqui: o driver é o próprio dataforge, e cada fase tem um comando que a mostratokens, ast, ir, percurso.

GrupoO que existeO que não
dfclexer, parser, AST, HIR, verificador de tipos, MIR, dataflow, SSA, LIRbackend LLVM e gerador de código de máquina
dfupos instaladores, e dataforge versiongerenciador de versões: não há como manter duas lado a lado nem fixar por projeto
dfpmresolver com semver, forge.lock, integridade, empacotar, publicarworkspace com várias peças resolvidas de uma vez
Runtimeescalonador, laço de eventos, async, threads, processos, errosalocador próprio e runtime bare-metal
ToolingLSP, depurador, formatador, linter, testes, bench, profiler, doc— (o depurador é a peça que o desenho do documento não lista)
InteropFFI para C, ponte para o Python, Arcane.Abi— (o layout binário não existe, e o problema dele existe)
AlvosLinux, macOS, Windows, ARM, ARM64bare-metal; e WASM só na direção "rodar em"

As peças que faltam no desenho também estão no mapa, e a mais importante é o Execution Engine: o desenho supõe compilação antecipada, e por isso não tem onde pôr o interpretador. Aqui ele é o centro.

Os números saem do mesmo lugar que os publica#

numeros() não tem um único valor escrito à mão. A contagem de símbolos usa o mesmo levantamento que gera a página da biblioteca.

dataforge
adopt Arcane.Ecossistema as Eco

n := Eco.numeros()
// tudo derivado: nada aqui e escrito a mao
assert n["modulos"] bigger 60
assert n["simbolos"] bigger 1800
assert n["comandos"] bigger 40
assert n["existem"] + n["equivalem"] + n["nao_existem"] is n["componentes"]
out $"{n['modulos']} modulos, {n['simbolos']} simbolos, {n['comandos']} comandos"