Pular para o conteúdo
Tecnologia

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.

Por Equipe Wortic 13 min de leitura
Python, Go e Rust na mesma equipe: como ler o mesmo arquivo de dados sem escrever um leitor para cada uma

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

  1. Escolha uma amostra real do arquivo JSONL que a equipe já usa.
  2. Escreva o esquema em uma linha, com os tipos de negócio (dinheiro, codigo, medida, decimal).
  3. Converta com wjsw de-texto "esquema" amostra.jsonl amostra.jsw.
  4. Confira com wjsw conferir amostra.jsw.
  5. Volte para JSON com wjsw para-texto amostra.jsw --json e compare com o original.
  6. 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 wcon e o wremoto rodam pelo WSL.
  • O MySQL 8 entra, por enquanto, só com mysql_native_password.
  • O layout interno do .jsw muda 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 wjsw envia versão e plataforma. Isso pode ser desligado com JSONW_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

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

Conheça: jsonW em C: a ABI estável sem dependência.

Quer isso funcionando na sua empresa?

Um consultor da Wortic olha o seu caso e mostra o caminho, sem compromisso.

Falar com um consultor

Equipe editorial

Equipe editorial da Wortic especializada em automacao, IA, ERP, CRM e crescimento operacional.

  • Automacao com IA
  • Gestao empresarial
  • CRM
  • ERP
  • Marketing digital

Isso funcionando no seu negócio.

Um consultor mostra o sistema do seu ramo, com a IA dentro.