Jaq, um clone do jq com foco em precisão, velocidade e simplicidade
(github.com/01mf02)Introdução ao jaq
- jaq é um clone do jq, a ferramenta de processamento de dados JSON, e tem como objetivo oferecer suporte a grande parte da sintaxe e das operações do jq.
- Os três principais objetivos do jaq são precisão, desempenho e simplicidade.
- Ele busca manter a compatibilidade com o jq, ao mesmo tempo em que oferece uma implementação mais precisa e previsível.
- Exemplos de comportamentos inesperados do jq incluem o fato de
nan > nanser falso enan < nanser verdadeiro, além dejqtravar ao executar[[[]] | implode. - Ele foi desenvolvido como uma solução para o longo tempo de inicialização do jq e apresenta um tempo de startup cerca de 30 vezes mais rápido que o jq 1.6.
- O jaq busca uma implementação simples e pequena para reduzir a possibilidade de bugs e facilitar contribuições.
Como instalar
Instalar a partir do código-fonte
- É necessário um toolchain Rust para compilar o jaq.
- O compilador Rust incluído em distribuições Linux pode ser antigo demais e não ser adequado para compilar o jaq.
- É possível instalar o jaq com os comandos
cargo install --locked jaqoucargo install --locked --git https://github.com/01mf02/jaq. - O jaq deve funcionar em todos os sistemas compatíveis com Rust; caso contrário, deve-se abrir uma issue.
Instalar binários
- É possível instalar o jaq com homebrew no macOS ou Linux.
Exemplos
- Os exemplos a seguir mostram o que o jaq consegue fazer atualmente.
- Ao executar
echo '{"a": 1, "b": 2}' | jaq '.a', a saída será1. - Ao executar
echo '{"a": 1, "b": 2}' | jaq 'add', a saída será3. - Ao executar
echo '[0, 1, 2, 3]' | jaq 'map(.*2) | [.[] | select(. < 5)]', a saída será[0, 2, 4].
Desempenho
- O desempenho de jaq, jq e gojq é comparado por meio de vários benchmarks.
- O benchmark
emptyé usado para medir o tempo de inicialização. - No benchmark
bf-fib, um interpretador Brainfuck escrito em jq executa um script Brainfuck que gera números de Fibonacci. - Os outros benchmarks avaliam diferentes filtros com valores de entrada
n. - Os resultados dos benchmarks mostram que o jaq-1.2 foi o mais rápido em 16 benchmarks, o jq-1.7 em 2, e o gojq-0.12.13 em 1.
Recursos
Recursos básicos
- Suporta vários recursos básicos, como tipos de dados fundamentais, condicionais, acesso, operadores, tratamento de erros, interpolação de strings e strings de formatação.
Caminhos
- Suporta indexação de arrays/objetos, iteração, indexação/iteração opcional, slice de arrays e slice de strings.
Operadores
- Suporta operadores de composição, binding, concatenação, atribuição, atualização por atribuição, alternativas, lógica, igualdade e comparação, aritmética, negação e supressão de erros.
Definições
- Suporta definições básicas e definições recursivas.
Filtros principais
- Suporta diversos filtros principais.
Filtros padrão
- Os filtros padrão são definidos com base em filtros mais fundamentais.
Filtros numéricos
- Suporta muitos filtros trazidos da libm.
Recursos avançados
- Alguns recursos do jq não são suportados, como módulos, operadores em estilo SQL e streaming.
Diferenças entre jq e jaq
Números
- Enquanto o jq usa todos os números como ponto flutuante de 64 bits, o jaq distingue entre inteiros e ponto flutuante.
NaN e infinito
- O jaq oferece um comportamento mais próximo do padrão IEEE 754 de aritmética de ponto flutuante.
Preservação de números fracionários
- O jaq preserva perfeitamente os números fracionários vindos de dados JSON.
Atribuição
- O jaq interpreta atribuição de forma diferente do jq.
Definições
- O jaq permite definições de filtros e, como no jq, argumentos podem ser passados por valor.
Argumentos
- O jaq permite definir argumentos pela linha de comando.
Redução
- O jaq fornece os filtros
reduceeforeach, com uma interpretação diferente da do jq.
Tratamento de erros
- O jaq usa um mecanismo de tratamento de erros diferente do jq.
Outros
- jq e jaq apresentam comportamentos diferentes em slurping, produto cartesiano, atualização de listas, leitura de entrada, junção e outros pontos.
Contribuição
- Contribuições para o jaq são bem-vindas, e após mudanças é preciso verificar se
cargo testé executado com sucesso.
Agradecimentos
- O jaq se beneficia bastante de várias bibliotecas e da biblioteca padrão do Rust.
Opinião do GN⁺
O ponto mais importante deste texto é a tentativa do jaq de melhorar desempenho e precisão enquanto mantém suporte à maior parte dos recursos do jq. Em especial, seu tempo de inicialização muito mais rápido que o do jq e o esforço para reduzir comportamentos inesperados podem chamar a atenção de muitos usuários. Além disso, por ser desenvolvido em Rust, ele também oferece vantagens em termos de segurança de memória e desempenho. Essas melhorias fazem dele uma ferramenta potencialmente útil para engenheiros de software que precisam processar dados JSON.
1 comentários
Comentários do Hacker News
nan > nanser falso enan < nanser verdadeiro segue fielmente o padrão de ponto flutuante IEEE 754 ou se isso é um bug.