Python, Go e Rust na mesma equipe: como ler o mesmo arquivo de dados sem escrever um leitor para cada uma
Uma matéria de 8 de novembro sobre o systemd mostra por que a interface binária em C importa para bibliotecas compartilhadas. O jsonW segue o mesmo desenho: uma ABI C estável e um SDK por linguagem.

O que aconteceu
Em 8 de novembro de 2026, o Blog do Edivaldo publicou que o systemd, o componente que participa da inicialização e do gerenciamento de serviços do Linux, vai aceitar Rust em programas novos. As bibliotecas centrais continuam em C. A matéria atribui a decisão a uma publicação de Christian Brauner e Lennart Poettering. Fonte: Blog do Edivaldo, lido pelo Google Notícias.
O motivo está numa palavra técnica, a ABI, que define como funções são chamadas e como os dados se organizam em nível binário. Segundo a matéria, o Rust ainda não oferece uma ABI estável para bibliotecas compartilhadas, com a previsibilidade que os mantenedores precisam. Copiar o código Rust em cada um dos mais de 180 executáveis também foi descartado, porque duplicaria componentes e aumentaria o tamanho dos programas.
Por que isso importa para quem decide tecnologia
A questão que o systemd enfrentou aparece em quase toda empresa que usa mais de uma linguagem. Python, Go, PHP e Java precisam ler os mesmos dados, e cada equipe tende a escrever o seu próprio leitor. A leitura da Wortic é que uma base em C, com interface estável, reduz essa repetição: a regra de leitura fica num lugar só e cada linguagem chama essa base.
Esse é o desenho que o README do jsonW descreve. Há uma ABI C estável, em sdk/jsonw.h e libjsonw, e por cima dela um SDK para cada linguagem. O README lista estas opções:
- C e C++17
- Python 3 e Node.js
- PHP 8 (por FFI), Go (por cgo) e Rust
- Java 22 ou mais novo, Kotlin e Swift
flowchart LR
P["Python · Go · Rust · PHP"] --> S["SDK de cada linguagem"]
S --> A["ABI C estável (jsonw.h)"]
A --> L["libjsonw"]
L --> F[("arquivo .jsw")]
O que o jsonW substitui e o que não substitui
O README resume o problema de hoje: o mesmo dado passa por JSON para trafegar, por CSV ou Parquet para guardar, por um banco de vetores para a busca por significado e por uma camada de permissão. Cada conversão custa tempo e memória, e pode alterar o dado. O texto dá três exemplos: preço que vira texto, CPF que perde o zero e peso sem unidade clara.
Segundo o README, o jsonW tem três formas que se convertem sem perda: linha, coluna (o arquivo .jsw) e texto. Todo JSON válido já é jsonW-texto válido. A forma coluna, de acordo com o mesmo texto, ocupa o lugar de JSONL, CSV e Parquet. O README não afirma que o jsonW substitui esses formatos em todos os casos, e este texto também não afirma.
Os tipos que evitam o erro comum
O esquema cabe em uma linha: id:i64,produto:texto,preco:dinheiro,peso:medida[g],sku:codigo. Cada tipo tem uma regra que o README descreve:
- codigo: CNPJ, CPF, chave, placa, SKU e CEP ficam byte a byte, sem normalização nem corte de espaços.
- dinheiro: a moeda ISO 4217 vai em cada valor, e a soma só acontece na mesma moeda.
- medida[g]: a entrada é convertida ao gravar, então "1 kg" vira "1000 g".
- decimal[2]: o valor nunca passa por ponto flutuante.
Economia de disco, memória e rede
Os números do README vêm de uma medição com 100 mil registros, comparada ao mesmo conjunto em JSONL lido pelo leitor de JSON do próprio projeto:
- o arquivo ficou 4,9 vezes menor que o JSONL;
- a leitura de um campo de uma linha foi 3.281 vezes mais rápida.
O próprio README faz duas ressalvas. Bibliotecas de JSON mais otimizadas reduzem a diferença quando se lê e grava tudo, e a vantagem no acesso direto vem do formato em colunas. Para medir na sua máquina, o comando é wjsw medir.
Na rede, o leitor remoto baixa só o cabeçalho, o rodapé e os blocos que a pergunta precisa, por HTTP Range. O README diz que o Cloudflare R2 não cobra a saída de dados, então ler um pedaço de um arquivo de 10 GB custa o que custa o pedaço. O texto não calcula valor em reais, porque o README não traz preços.
Memória e custo de servidor não aparecem no README. Quem decide precisa medir isso com a própria carga antes de trocar qualquer formato.
Qualidade do dado: a conferência depois de gravar
O README diz que a custódia usa crc32c e SHA-256 em cadeia, e que qualquer byte trocado falha na conferência. A saída de exemplo do próprio README é esta:
$ wjsw conferir vendas.jsw
ok: 2 linhas, 1 blocos, sha256 e crc32c conferidos
Exemplo em C, a base que as outras linguagens chamam
O código abaixo vem do README. Ele grava uma linha JSON num arquivo .jsw e depois lê de volta um campo, com o tipo preservado:
#include "jsonw.h"
char erro[200], saida[256];
void *w = jsonw_criar("vendas.jsw", "id:i64,produto:texto,preco:dinheiro", erro, sizeof erro);
const char *linha = "{\"id\":1,\"produto\":\"Café especial\",\"preco\":\"12,50 BRL\"}";
jsonw_gravar_json(w, linha, strlen(linha), erro, sizeof erro);
jsonw_fechar_escritor(w);
void *a = jsonw_abrir("vendas.jsw", erro, sizeof erro);
jsonw_campo_json(a, 0, 2, saida, sizeof saida); /* "12.50 BRL" */
jsonw_fechar(a);
sequenceDiagram
autonumber
participant App as Aplicação em C
participant L as libjsonw
participant F as vendas.jsw
App->>L: jsonw_criar(esquema)
App->>L: jsonw_gravar_json(linha)
L->>F: grava a linha
App->>L: jsonw_abrir(vendas.jsw)
App->>L: jsonw_campo_json(linha 0, campo 2)
L->>App: devolve 12.50 BRL
O preço volta com a moeda, sem virar um número solto. Essa é a diferença que o README chama de liberdade funcional: a mesma regra de tipo vale para todas as linguagens que chamam a base.
Três situações do dia a dia
Os exemplos abaixo mostram como a equipe usaria o jsonW, com os comandos do README. Nenhum deles traz resultado medido.
1. Python grava o relatório e Go lê
Situação: o relatório semanal de vendas é gravado em Python e lido em Go, e de vez em quando alguém encontra um preço diferente entre as duas pontas.
O que fazer: defina o esquema uma vez, com dinheiro para o preço e codigo para o SKU. Grave com o SDK de Python e leia com o SDK de Go. Rode wjsw conferir depois de cada gravação.
Resultado esperado: a mesma linha lida nas duas linguagens, e uma conferência que acusa qualquer byte trocado no caminho.
2. O financeiro vê o valor, a recepção não
Situação: o mesmo arquivo de clientes tem CPF e valor, e cada área só pode ver o que lhe cabe.
O que fazer: marque a permissão no esquema, com cpf:codigo?+pessoal e valor:dinheiro+escopo(financeiro). Sem o escopo, a coluna sai nula.
Resultado esperado: a área sem o escopo recebe a linha sem o dado restrito. O README diz que a permissão é aplicada no servidor, antes de responder, então o dado escondido não sai.
3. Um mês de vendas do PostgreSQL vira arquivo para análise
Situação: a equipe quer analisar um mês de vendas sem mexer no banco de produção.
O que fazer: rode WSQL_URL=postgresql://papel@host:5432/banco wcon pg "select * from vendas" vendas.jsw, com a senha em PGPASSWORD ou em ~/.pgpass. Depois use wjsw calcular ou wjsw filtrar.
Resultado esperado: segundo o README, o tipo numeric vira decimal exato e o timestamptz volta com o mesmo valor. Para checar mudanças entre duas exportações, use wjsw comparar com a chave da linha.
Passo a passo para testar antes de decidir
- Escolha uma amostra real do arquivo JSONL que a equipe já usa.
- Escreva o esquema em uma linha, com os tipos de negócio (dinheiro, codigo, medida, decimal).
- Converta com
wjsw de-texto "esquema" amostra.jsonl amostra.jsw. - Confira com
wjsw conferir amostra.jsw. - Volte para JSON com
wjsw para-texto amostra.jsw --jsone compare com o original. - Meça o tamanho em disco e o tempo de leitura de um campo com
wjsw medir.
A métrica é o tamanho do arquivo, o tempo de leitura de um campo e a igualdade das linhas na volta. A hipótese de economia precisa aparecer na sua amostra. Se o tamanho não cair, a troca não se justifica para aquela carga.
O que o README não diz
- Não há comparação publicada com Parquet ou Protobuf. As medições são contra JSONL.
- Não há medição de memória, de custo de servidor nem de migração.
- No Windows, o
wcone owremotorodam pelo WSL. - O MySQL 8 entra, por enquanto, só com
mysql_native_password. - O layout interno do
.jswmuda entre versões. Use a ferramenta ou um SDK, nunca leia os bytes à mão. - A licença libera o uso dentro de produtos. Não permite oferecer o jsonW como serviço nem fazer engenharia reversa do núcleo.
- Na primeira execução, o
wjswenvia versão e plataforma. Isso pode ser desligado comJSONW_SEM_PING=1. A biblioteca e os SDKs nunca acessam a rede.
Próximos passos para a equipe
- Listar as bases que já têm leitores em mais de uma linguagem e medir o trabalho de manter cada um.
- Rodar o teste de seis passos numa amostra antes de qualquer migração.
- Definir no esquema quais colunas são pessoais e quais exigem escopo.
- Consultar a referência completa em
docs/JSONW.md, no repositório.
Para conhecer o projeto, veja o site do jsonW e o repositório no GitHub.
Perguntas frequentes
O que é o jsonW?
É um modelo de dados com três formas que se convertem sem perda: linha, coluna (arquivo .jsw) e texto. O núcleo é em C, sem dependências, e a Wortic mantém o projeto.
Por que a ABI em C importa para quem escolhe linguagem?
A ABI é a interface binária que as linguagens usam para chamar uma biblioteca compartilhada. Segundo a matéria do Blog do Edivaldo, o Rust ainda não oferece uma ABI estável nesse sentido. No jsonW, o README descreve a ABI C como estável e põe um SDK por linguagem por cima dela.
O jsonW substitui JSON, CSV e Parquet?
O README diz que a forma coluna ocupa o lugar de JSONL, CSV e Parquet, mas não traz comparação publicada com Parquet. Para saber se a troca compensa na sua carga, vale rodar o teste de seis passos numa amostra real.
Quanto o jsonW reduz o tamanho do arquivo?
Nas medições do README, o arquivo .jsw ficou 4,9 vezes menor que o JSONL dos mesmos dados, com 100 mil registros. A comparação foi feita com o leitor de JSON do próprio projeto.
Dá para ler um arquivo grande sem baixar tudo?
Sim, com o wremoto. Ele lê o cabeçalho e o rodapé e depois só os blocos que a consulta usa, por HTTP Range, inclusive em R2 e S3.
O jsonW controla quem vê dados pessoais dentro do arquivo?
O README descreve permissão por coluna, linha e célula, aplicada no servidor antes de responder. Sem o escopo exigido, a coluna sai nula. Os exemplos usam wjsw ver com a variável WJSW_ESCOPOS.
Posso usar o jsonW em Python, Go ou Rust?
Sim. O README lista SDKs para C, C++17, Python 3, Node.js, PHP 8, Go, Rust, Java 22 ou mais novo, Kotlin e Swift.
O jsonW é grátis?
O README diz que o uso dentro do seu produto é livre. A licença não permite revender o jsonW como serviço nem fazer engenharia reversa do núcleo.
Fontes
- Blog do Edivaldo: systemd adota Rust em componentes, mas mantém bibliotecas centrais em C (08/11/2026)
- README do jsonW, repositório developer-wortic/jsonw
- AGENTS.md do jsonW
- jsonW: site oficial
Perguntas frequentes
O que é o jsonW?
É um modelo de dados com três formas que se convertem sem perda: linha, coluna (arquivo .jsw) e texto. O núcleo é em C, sem dependências, e a Wortic mantém o projeto.
Por que a ABI em C importa para quem escolhe linguagem?
A ABI é a interface binária que as linguagens usam para chamar uma biblioteca compartilhada. Segundo a matéria do Blog do Edivaldo, o Rust ainda não oferece uma ABI estável nesse sentido. No jsonW, o README descreve a ABI C como estável e põe um SDK por linguagem por cima dela.
O jsonW substitui JSON, CSV e Parquet?
O README diz que a forma coluna ocupa o lugar de JSONL, CSV e Parquet, mas não traz comparação publicada com Parquet. Para saber se a troca compensa na sua carga, vale rodar o teste de seis passos numa amostra real.
Quanto o jsonW reduz o tamanho do arquivo?
Nas medições do README, o arquivo .jsw ficou 4,9 vezes menor que o JSONL dos mesmos dados, com 100 mil registros. A comparação foi feita com o leitor de JSON do próprio projeto.
Dá para ler um arquivo grande sem baixar tudo?
Sim, com o wremoto. Ele lê o cabeçalho e o rodapé e depois só os blocos que a consulta usa, por HTTP Range, inclusive em R2 e S3.
O jsonW controla quem vê dados pessoais dentro do arquivo?
O README descreve permissão por coluna, linha e célula, aplicada no servidor antes de responder. Sem o escopo exigido, a coluna sai nula. Os exemplos usam wjsw ver com a variável WJSW_ESCOPOS.
Posso usar o jsonW em Python, Go ou Rust?
Sim. O README lista SDKs para C, C++17, Python 3, Node.js, PHP 8, Go, Rust, Java 22 ou mais novo, Kotlin e Swift.
O jsonW é grátis?
O README diz que o uso dentro do seu produto é livre. A licença não permite revender o jsonW como serviço nem fazer engenharia reversa do núcleo.
Fontes
Quer isso funcionando na sua empresa?
Um consultor da Wortic olha o seu caso e mostra o caminho, sem compromisso.
Falar com um consultorEquipe editorial
Equipe editorial da Wortic especializada em automacao, IA, ERP, CRM e crescimento operacional.
- Automacao com IA
- Gestao empresarial
- CRM
- ERP
- Marketing digital


