3 pontos por GN⁺ 2023-11-30 | 1 comentários | Compartilhar no WhatsApp

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 > nan ser falso e nan < nan ser verdadeiro, além de jq travar 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 jaq ou cargo 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 reduce e foreach, 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

 
GN⁺ 2023-11-30
Comentários do Hacker News
  • Bug em [[[]] | implode e paralisação do desenvolvimento do jq

    • O desenvolvimento do jq ficou parado por 5 anos e foi retomado recentemente, então bugs conhecidos há muito tempo permaneceram sem correção. Com a retomada, espera-se que os problemas acumulados sejam resolvidos gradualmente.
  • Agradecimento por recomendar outros projetos

    • É muito legal quando um projeto recomenda outros projetos semelhantes ou que o inspiraram. Fiquei especialmente satisfeito por conhecer o projeto jql.
  • Dúvida sobre o resultado das comparações nan > nan e nan < nan

    • Foi levantada a dúvida se, no jq, nan > nan ser falso e nan < nan ser verdadeiro segue fielmente o padrão de ponto flutuante IEEE 754 ou se isso é um bug.
  • Problema do jq ao exibir números uint64

    • Reclamação de que o jq não exibe corretamente números uint64.
  • Relato de uso do DuckDB no lugar do jq

    • O jq é poderoso, mas, quando os dados estão em formato tabular, a experiência mostra que usar SQL é mais natural.
  • Observação de que o jaq tem muitas dependências

    • Foi apontado que o projeto jaq tem muitas dependências.
  • Pergunta sobre como o jq é usado

    • Pergunta se o jq é usado para explorar arquivos JSON durante desenvolvimento/análise de dados ou se é usado em programas executados em ambiente de produção.
  • Relato de experiência com yq no lugar do jq

    • A pessoa começou a usar yq no lugar do jq e houve troca de opiniões sobre as principais diferenças entre as duas ferramentas.
  • Como consultar dados no PowerShell

    • Com PowerShell, é possível converter todos os dados em objetos e consultá-los com a sintaxe do próprio PowerShell, sem precisar aprender a sintaxe de várias ferramentas como jq ou xmlstarlet.
  • Opinião sobre a dificuldade da sintaxe e da documentação do jq

    • Há a opinião de que a sintaxe e a documentação do jq são difíceis de entender, e que isso não parece ter melhorado na nova versão. Sugere-se que escrever algo diretamente talvez seja melhor.