Pular para o conteúdo

O que não existe, e o que está no lugar

Cinco componentes do desenho não existem. Cada um com o que faz a diferença: o motivo, o que responde pela mesma pergunta, e o número medido do substituto.

Esta é a página que uma referência técnica quase nunca tem, e é a mais útil de todas: o que a linguagem não faz.

Um mapa que marca tudo como pronto não é um mapa, é publicidade. Quem o lê descobre a ausência ao tentar — no pior momento, e depois de ter escolhido a linguagem por causa dele.

Backend LLVM, e gerador de código#

As duas maiores ausências, e são a mesma: não há compilação para código de máquina.

No desenhoAquiMedido
LLVM Backendcompilador.py — a árvore é percorrida uma vez e vira fechamentos Python, o que tira o despacho do caminho quente1,5× a 1,8× conforme a carga
Code Generatornão há. O que sai do compilador é um fechamento, e quem o executa é interpreter.py
Machine Code / WASMnão há. O artefato é a árvore compilada, em memória

O motivo não é falta de tempo. Amarrar o LLVM tiraria a única propriedade inegociável do projeto: zero dependência externa no runtime. E o teto desta técnica é conhecido.

A fase continua no mapa, marcada como ausente. Uma fase apagada do desenho não deixa a ausência aparecer — e é em dataforge ir --fase=lir que ela fica visível, porque o LIR mostra o que desceu para fechamento e o que recuou para a árvore.

Gerenciador de versões, e workspace — eram ausências, e não são mais#

Esta seção descrevia duas ausências. Elas foram fechadas, e o que ficou no lugar vale mais registrado que apagado — porque o limite de cada uma é o que decide se ela serve.

O que era ausênciaO que existe agoraO limite
não havia como manter versões lado a ladouma venv por versão em ~/.dataforge/versoes/<versao>, e dataforge versions listainstalar precisa de rede e de pip
não havia como fixar a versão por projetodataforge use <versao> escreve dataforge = "…" no [project] do forge.tomllinha a linha, sem apagar comentárioso campo já existia e ninguém o cobrava: dataforge info o mostrava, e era tudo
trocar de versão era reinstalardataforge upgrade instala ao lado: a versão que já roda não é tocadaum upgrade que falha no meio não deixa a máquina sem DataForge
nada olhava a árvore de pacotes inteiradataforge workspace acha todo forge.toml e acusa faixa incompatível, saindo com 2ele lê e relata: não instala

O limite que fica: *não há um shim no PATH*. O dataforge que você chama é o que está instalado, e é ele que redireciona — ver versões.

Alocador#

O alocador é o do CPython, e trocá-lo exigiria estar do lado de fora dele. O que se pode fazer daqui — e se faz — é mandar no coletor e medir a pausa dele.

O que existeOnde
arena: alocar em bloco e soltar de uma vezArcane.Memoria.Arena
ligar, desligar e rodar sem coletor num trechogc_ligar, gc_desligar, sem_gc
mudar os limiares das três geraçõesgc_limiares, gc_geracoes
congelar o que já existe, para não ser varrido de novogc_congelar
medir a pausa de cada coletaArcane.Perfil.gc_pausas
referência fraca e mapa fracoArcane.Memoria

A diferença entre "controlar memória" e "controlar o coletor" é real, e o projeto prefere nomeá-la a fingir que são a mesma coisa.

Bare-metal, kernel, microcontrolador#

Não há, e não há caminho a partir daqui: o runtime é o CPython.

Isso não fica como um silêncio. `Arcane.Alvo` descreve o alvo embarcado e diz, capacidade por capacidade, o que falta — não há threading do CPython, não há ctypes, e não é o CPython: é outro interpretador, com outra biblioteca padrão.

dataforge
adopt Arcane.Ecossistema as Eco

// As tres marcas, e o que cada uma quer dizer
assert "existe" in Eco.ESTADOS
assert "equivale" in Eco.ESTADOS
assert "nao-existe" in Eco.ESTADOS

faltam := Eco.o_que_nao_existe()
cycle f in faltam:
    assert f["porque"] is not ""       // toda ausencia tem motivo escrito

// e o que esta no lugar, quando ha algo no lugar
outra := Eco.equivalencias()
assert len(outra) bigger 0
out $"{len(faltam)} ausencias, {len(outra)} equivalencias"

O `equivale` não é um consolo#

Seis componentes estão marcados como equivale, e a distinção com existe é estrita: há outra peça, nomeada, que responde a mesma pergunta por outro mecanismo.

No desenhoO que está no lugarPor que não é a mesma coisa
Borrow CheckerArcane.Posse + três códigos do checknão há tempo de vida declarado; o que se protege é o protocolo (soltar uma vez, não usar depois), e não a integridade da memória — essa nunca esteve em risco
Build Systemforge.toml + dataforge devopsnão havendo compilação para binário, não há etapa de build a orquestrar: o artefato é o código mais o forge.lock
ABI e símbolosArcane.Abinão há layout binário a quebrar — e há exatamente o mesmo problema, com o mesmo sintoma cruel: não é erro de quem publicou, é de quem consome, depois
RISC-Vnada de arquitetura no projetoonde há CPython 3.10+, roda. Não é testado, e dizer "suportado" seria prometer o que ninguém verificou
WASMPyodidecompilar para WASM não existe; rodar em WASM funciona, com o interpretador inteiro junto
Driver (dfc)o próprio dataforgeum segundo executável duplicaria a resolução de caminho e a leitura do forge.toml