Pular para o conteúdo

Onde este programa roda

Seis alvos descritos, com o que cada um suporta e por que não suporta o resto — lido dos adopt, e honesto sobre o que isso não prova.

Este programa roda no navegador? numa função serverless? num WASI? É uma pergunta real e ela aparece cedo — e a resposta dependia de alguém conhecer de cor o que cada ambiente suporta, e de lembrar, para cada adopt, se aquele módulo abre soquete, processo ou arquivo.

bash
dataforge alvo app.df                      # a tabela de todos
dataforge alvo app.df --alvo=navegador     # um so, e sai com 3 se nao roda
dataforge alvo app.df --json               # como dado
dataforge
adopt Arcane.Alvo as Alvo

assert sorted(keys(Alvo.alvos())) is
       ["cli", "embarcado", "funcao", "navegador", "servidor", "wasi"]

// o servidor suporta tudo
assert Alvo.alvos()["servidor"]["nao_suporta"] is []

Os seis alvos#

AlvoO que éNão tem
servidormáquina com sistema operacional completo — onde o DataForge foi feito para rodar
cliprograma de linha de comando na máquina do usuário
navegadoro CPython compilado para WebAssembly (Pyodide) dentro de uma abaarquivos, rede, processo, banco, threads, nativo, ambiente
wasiWebAssembly fora do navegador, com a interface de sistema do WASIrede, processo, banco, threads, nativo
funcaoserverless: processo efêmero, disco só de leitura fora de /tmpprocesso, threads, nativo
embarcadomicrocontrolador com MicroPython — memória em kilobytesquase tudo

E cada ausência vem com o motivo, não só com um não:

dataforge
adopt Arcane.Alvo as Alvo

porque := Alvo.porque("navegador", "threads")
assert "SharedArrayBuffer" in porque

assert "soquete cru" in Alvo.porque("navegador", "rede")
assert Alvo.porque("servidor", "rede") is ""     // ele tem

O mesmo vocabulário da capacidade#

As capacidades são as de `Arcane.Capacidade`: arquivos, rede, processo, banco, threads, nativo, python, ambiente.

Lá elas são cobradas em execução; aqui são lidas antes de rodar, e o alvo é quem diz quais existem. É a mesma pergunta feita de dois lados — e usar dois vocabulários faria as duas respostas divergirem no primeiro módulo novo.

dataforge
adopt Arcane.Alvo as Alvo
adopt Arcane.Capacidade as Cap

// os dois falam a mesma lingua
assert Cap.exige("Arcane.Process") is "processo"
assert "processo" in Alvo.alvos()["navegador"]["nao_suporta"]

O que esta leitura NÃO prova#

LimiteConsequência
a leitura é de um arquivoum módulo alcançado indiretamente — uma biblioteca do projeto que adota Arcane.Process — não aparece
adopt Python.x conta como python e para aío que aquele pacote faz por dentro, ninguém lê
não executa nadamemória, tempo e dependência nativa do Python continuam sendo problema de quem publica

Dito isso, o que ela dá é o que vale: a lista dos pontos que certamente não rodam, com a linha. Isso responde a pergunta em dois segundos, e o resto continua sendo trabalho de quem publica.