Jaq, un clone de jq axé sur la précision, la rapidité et la simplicité
(github.com/01mf02)Présentation de jaq
- jaq est un clone de jq, l’outil de traitement de données JSON, qui vise à prendre en charge une grande partie de la syntaxe et des opérations de jq.
- Les trois objectifs principaux de jaq sont la précision, les performances et la simplicité.
- Il cherche à maintenir la compatibilité avec jq tout en proposant une implémentation plus précise et plus prévisible.
- Parmi les exemples de comportements inattendus de jq, on peut citer le fait que
nan > nansoit faux et quenan < nansoit vrai, ou encore qu’un plantage se produise lors de l’exécution dejqavec[[[]] | implode. - Il a été développé pour répondre au long temps de démarrage de jq et affiche un démarrage environ 30 fois plus rapide que jq 1.6.
- jaq vise une implémentation simple et compacte afin de réduire les risques de bugs et de faciliter les contributions.
Installation
Installation depuis les sources
- Un outillage Rust est nécessaire pour compiler jaq.
- Le compilateur Rust fourni dans les distributions Linux peut être trop ancien pour convenir à la compilation de jaq.
- Vous pouvez installer jaq avec les commandes
cargo install --locked jaqoucargo install --locked --git https://github.com/01mf02/jaq. - jaq devrait fonctionner sur tous les systèmes pris en charge par Rust ; si ce n’est pas le cas, il faut ouvrir une issue.
Installation du binaire
- Il est possible d’installer jaq avec homebrew sur macOS ou Linux.
Exemples
- Les exemples suivants montrent ce que jaq peut faire actuellement.
- En exécutant
echo '{"a": 1, "b": 2}' | jaq '.a', la sortie est1. - En exécutant
echo '{"a": 1, "b": 2}' | jaq 'add', la sortie est3. - En exécutant
echo '[0, 1, 2, 3]' | jaq 'map(.*2) | [.[] | select(. < 5)]', la sortie est[0, 2, 4].
Performances
- Plusieurs benchmarks comparent les performances de jaq, jq et gojq.
- Le benchmark
emptyest utilisé pour mesurer le temps de démarrage. - Le benchmark
bf-fibexécute, en jq, un interpréteur Brainfuck qui lance un script Brainfuck générant des nombres de Fibonacci. - Les autres benchmarks évaluent différents filtres avec des valeurs d’entrée
n. - Les résultats montrent que jaq-1.2 est le plus rapide sur 16 benchmarks, jq-1.7 sur 2, et gojq-0.12.13 sur 1.
Fonctionnalités
Fonctionnalités de base
- Prise en charge de nombreuses fonctionnalités de base, comme les types de données fondamentaux, les conditions, l’accès, les opérateurs, la gestion des erreurs, l’interpolation de chaînes et les chaînes de formatage.
Chemins
- Prise en charge de l’indexation de tableaux/objets, de l’itération, de l’indexation/itération optionnelle, des tranches de tableaux et des tranches de chaînes.
Opérateurs
- Prise en charge d’opérateurs tels que la composition, la liaison, la concaténation, l’affectation, la mise à jour par affectation, l’alternative, la logique, l’égalité et la comparaison, l’arithmétique, la négation et la suppression d’erreurs.
Définitions
- Prise en charge des définitions de base et récursives.
Filtres essentiels
- Prise en charge de divers filtres essentiels.
Filtres standard
- Les filtres standard sont définis à partir de filtres plus fondamentaux.
Filtres numériques
- Prise en charge de nombreux filtres issus de libm.
Fonctionnalités avancées
- Certaines fonctionnalités de jq ne sont pas prises en charge, comme les modules, les opérateurs de style SQL ou le streaming.
Différences entre jq et jaq
Nombres
- Alors que jq utilise des nombres à virgule flottante 64 bits pour toutes les valeurs numériques, jaq distingue les entiers des nombres à virgule flottante.
NaN et infini
- jaq propose un comportement plus proche de la norme IEEE 754 pour l’arithmétique en virgule flottante.
Préservation des nombres fractionnaires
- jaq préserve parfaitement les nombres fractionnaires provenant des données JSON.
Affectation
- jaq interprète l’affectation différemment de jq.
Définitions
- jaq autorise les définitions de filtres et, comme jq, permet de passer des arguments par valeur.
Arguments
- jaq permet de définir des arguments via la ligne de commande.
Réduction
- jaq fournit les filtres
reduceetforeach, avec une interprétation différente de celle de jq.
Gestion des erreurs
- jaq utilise un mécanisme de gestion des erreurs différent de celui de jq.
Divers
- jq et jaq présentent aussi des comportements différents pour le slurping, le produit cartésien, la mise à jour de listes, la lecture d’entrée, les jointures, etc.
Contribution
- Les contributions à jaq sont les bienvenues, et il faut vérifier que
cargo tests’exécute avec succès après toute modification.
Remerciements
- jaq a grandement bénéficié de plusieurs bibliothèques ainsi que de la bibliothèque standard de Rust.
Avis de GN⁺
Le point le plus important ici est que jaq cherche à prendre en charge l’essentiel des fonctionnalités de jq tout en améliorant les performances et la précision. Son temps de démarrage nettement plus rapide que celui de jq, ainsi que sa volonté de réduire les comportements inattendus, peuvent particulièrement intéresser de nombreux utilisateurs. Développé en Rust, il présente aussi des avantages en matière de sécurité mémoire et de performances. Ces améliorations en font un outil potentiellement utile pour les ingénieurs logiciels ayant besoin de traiter des données JSON.
1 commentaires
Commentaires sur Hacker News
nan > nansoit faux etnan < nanvrai : est-ce une application fidèle de la norme IEEE 754 pour les nombres à virgule flottante, ou un bug ?