Jaq, ein jq-Klon mit Fokus auf Genauigkeit, Geschwindigkeit und Einfachheit
(github.com/01mf02)Einführung in jaq
- jaq ist ein Klon von jq, einem Werkzeug zur Verarbeitung von JSON-Daten, und hat das Ziel, einen großen Teil der jq-Syntax und -Operationen zu unterstützen.
- Die drei Hauptziele von jaq sind Genauigkeit, Performance und Einfachheit.
- Es soll bei gleichzeitiger Wahrung der Kompatibilität mit jq eine genauere und besser vorhersehbare Implementierung bieten.
- Beispiele für unerwartetes Verhalten von jq sind, dass
nan > nanfalsch ist undnan < nanwahr ist, sowie dass bei der Ausführung vonjqmit[[[]] | implodeein Absturz auftritt. - Es wurde als Lösung für die lange Startzeit von jq entwickelt und bietet eine etwa 30-mal schnellere Startzeit als jq 1.6.
- jaq strebt eine einfache und kleine Implementierung an, um die Wahrscheinlichkeit von Bugs zu verringern und Beiträge zu erleichtern.
Installation
Installation aus dem Quellcode
- Zum Kompilieren von jaq wird eine Rust-Toolchain benötigt.
- Der in Linux-Distributionen enthaltene Rust-Compiler kann veraltet sein und sich daher möglicherweise nicht zum Kompilieren von jaq eignen.
- jaq kann mit den Befehlen
cargo install --locked jaqodercargo install --locked --git https://github.com/01mf02/jaqinstalliert werden. - jaq sollte auf allen Systemen funktionieren, die von Rust unterstützt werden; falls nicht, sollte ein Issue erstellt werden.
Installation per Binärdatei
- Unter macOS oder Linux kann jaq mit Homebrew installiert werden.
Beispiele
- Die folgenden Beispiele zeigen, was jaq derzeit leisten kann.
- Wenn
echo '{"a": 1, "b": 2}' | jaq '.a'ausgeführt wird, wird1ausgegeben. - Wenn
echo '{"a": 1, "b": 2}' | jaq 'add'ausgeführt wird, wird3ausgegeben. - Wenn
echo '[0, 1, 2, 3]' | jaq 'map(.*2) | [.[] | select(. < 5)]'ausgeführt wird, wird[0, 2, 4]ausgegeben.
Performance
- Mehrere Benchmarks vergleichen die Performance von jaq, jq und gojq.
- Der Benchmark
emptywird verwendet, um die Startzeit zu messen. - Im Benchmark
bf-fibführt ein in jq geschriebener Brainfuck-Interpreter ein Brainfuck-Skript aus, das Fibonacci-Zahlen erzeugt. - Andere Benchmarks werten verschiedene Filter mit dem Eingabewert
naus. - Die Benchmark-Ergebnisse zeigen, dass jaq-1.2 in 16 Benchmarks am schnellsten ist, jq-1.7 in 2 und gojq-0.12.13 in 1 Benchmark.
Funktionen
Grundfunktionen
- Es werden verschiedene Grundfunktionen unterstützt, darunter grundlegende Datentypen, Bedingungen, Zugriff, Operatoren, Fehlerbehandlung, String-Interpolation und Format-Strings.
Pfade
- Unterstützt werden Array-/Objekt-Indizierung, Iteration, optionale Indizierung/Iteration, Array-Slices und String-Slices.
Operatoren
- Unterstützt werden Operatoren für Komposition, Bindung, Verkettung, Zuweisung, Update-Zuweisung, Alternativen, Logik, Gleichheit und Vergleich, Arithmetik, Negation sowie Fehlerunterdrückung.
Definitionen
- Unterstützt werden grundlegende Definitionen und rekursive Definitionen.
Kernfilter
- Es werden verschiedene Kernfilter unterstützt.
Standardfilter
- Standardfilter werden über grundlegendere Filter definiert.
Numerische Filter
- Es werden viele aus libm übernommene Filter unterstützt.
Erweiterte Funktionen
- Einige Funktionen von jq werden nicht unterstützt, zum Beispiel Module, SQL-ähnliche Operatoren und Streaming.
Unterschiede zwischen jq und jaq
Zahlen
- jq verwendet für alle Zahlen 64-Bit-Gleitkommazahlen, während jaq zwischen Ganzzahlen und Gleitkommazahlen unterscheidet.
NaN und Unendlichkeit
- jaq bietet ein Verhalten, das näher am IEEE-754-Standard für Gleitkomma-Arithmetik liegt.
Erhaltung gebrochener Zahlen
- jaq bewahrt gebrochene Zahlen aus JSON-Daten vollständig.
Zuweisung
- jaq interpretiert Zuweisungen anders als jq.
Definitionen
- jaq erlaubt Filterdefinitionen und kann wie jq Argumente als Werte übergeben.
Argumente
- jaq kann Argumente über die Kommandozeile definieren.
Falten
- jaq bietet die Filter
reduceundforeachund interpretiert sie anders als jq.
Fehlerbehandlung
- jaq verwendet einen anderen Mechanismus zur Fehlerbehandlung als jq.
Sonstiges
- Beim Slurping, kartesischen Produkt, Listen-Update, Einlesen von Eingaben, Join und weiteren Punkten zeigen jq und jaq unterschiedliches Verhalten.
Mitwirken
- Beiträge zu jaq sind willkommen; nach Änderungen sollte geprüft werden, ob
cargo testerfolgreich ausgeführt wird.
Danksagung
- jaq profitiert stark von verschiedenen Bibliotheken und der Rust-Standardbibliothek.
Meinung von GN⁺
Das Wichtigste an diesem Artikel ist, dass jaq versucht, die meisten Funktionen von jq zu unterstützen und dabei gleichzeitig Performance und Genauigkeit zu verbessern. Besonders die im Vergleich zu jq deutlich schnellere Startzeit und der Versuch, unerwartetes Verhalten zu reduzieren, dürften für viele Nutzer interessant sein. Außerdem wird es auf Basis von Rust entwickelt, was auch bei Speichersicherheit und Performance Vorteile bietet. Diese Verbesserungen dürften jaq zu einem nützlichen Werkzeug für Softwareingenieure machen, die JSON-Daten verarbeiten müssen.
1 Kommentare
Hacker-News-Kommentare
nan > nanfalsch undnan < nanwahr ist.