Jaq, klon jq yang berfokus pada akurasi, kecepatan, dan kesederhanaan
(github.com/01mf02)Pengenalan jaq
- jaq adalah klon dari jq, alat pemrosesan data JSON, yang bertujuan mendukung sebagian besar sintaks dan operasi jq.
- Tiga tujuan utama jaq adalah akurasi, performa, dan kesederhanaan.
- Sambil mempertahankan kompatibilitas dengan jq, jaq berupaya memberikan implementasi yang lebih akurat dan dapat diprediksi.
- Contoh perilaku jq yang tidak terduga antara lain
nan > nanbernilai salah dannan < nanbernilai benar, serta terjadinya crash saat menjalankanjqdengan[[[]] | implode. - jaq dikembangkan sebagai solusi atas waktu startup jq yang lama, dan memiliki waktu startup sekitar 30 kali lebih cepat dibanding jq 1.6.
- jaq menargetkan implementasi yang sederhana dan kecil untuk mengurangi kemungkinan bug dan memudahkan kontribusi.
Cara instalasi
Instalasi dari source
- Untuk mengompilasi jaq, diperlukan toolchain Rust.
- Compiler Rust yang disertakan dalam distribusi Linux mungkin sudah terlalu lama dan tidak cocok untuk mengompilasi jaq.
- Anda dapat menginstal jaq melalui perintah
cargo install --locked jaqataucargo install --locked --git https://github.com/01mf02/jaq. - jaq seharusnya berjalan di semua sistem yang didukung Rust; jika tidak, sebaiknya buat issue.
Instalasi biner
- Di macOS atau Linux, jaq dapat diinstal menggunakan homebrew.
Contoh
- Contoh berikut menunjukkan hal-hal yang saat ini dapat dilakukan jaq.
- Menjalankan
echo '{"a": 1, "b": 2}' | jaq '.a'akan menghasilkan1. - Menjalankan
echo '{"a": 1, "b": 2}' | jaq 'add'akan menghasilkan3. - Menjalankan
echo '[0, 1, 2, 3]' | jaq 'map(.*2) | [.[] | select(. < 5)]'akan menghasilkan[0, 2, 4].
Performa
- Berbagai benchmark digunakan untuk membandingkan performa jaq, jq, dan gojq.
- Benchmark
emptydigunakan untuk mengukur waktu startup. - Benchmark
bf-fibmenjalankan interpreter Brainfuck yang ditulis dalam jq untuk mengeksekusi skrip Brainfuck yang menghasilkan bilangan Fibonacci. - Benchmark lain mengevaluasi berbagai filter dengan nilai input
n. - Hasil benchmark menunjukkan bahwa jaq-1.2 adalah yang tercepat pada 16 benchmark, jq-1.7 pada 2 benchmark, dan gojq-0.12.13 pada 1 benchmark.
Fitur
Fitur dasar
- Mendukung berbagai fitur dasar seperti tipe data dasar, kondisional, akses, operator, penanganan error, interpolasi string, format string, dan lainnya.
Path
- Mendukung indexing array/objek, iterasi, indexing/iterasi opsional, slice array, slice string, dan lainnya.
Operator
- Mendukung operator komposisi, binding, konkatenasi, assignment, update assignment, alternatif, logika, kesetaraan dan perbandingan, aritmetika, negasi, serta penekanan error.
Definisi
- Mendukung definisi dasar dan definisi rekursif.
Filter inti
- Mendukung berbagai filter inti.
Filter standar
- Filter standar didefinisikan melalui filter yang lebih mendasar.
Filter numerik
- Mendukung banyak filter yang diambil dari libm.
Fitur lanjutan
- Beberapa fitur jq tidak didukung, misalnya modul, operator bergaya SQL, streaming, dan lainnya.
Perbedaan jq dan jaq
Angka
- jq menggunakan semua angka sebagai floating point 64-bit, sedangkan jaq membedakan antara integer dan floating point.
NaN dan tak hingga
- jaq memberikan perilaku yang lebih dekat dengan standar aritmetika floating point IEEE 754.
Preservasi angka pecahan
- jaq mempertahankan angka pecahan yang berasal dari data JSON secara sempurna.
Assignment
- jaq menafsirkan assignment secara berbeda dari jq.
Definisi
- jaq mengizinkan definisi filter, dan seperti jq, dapat meneruskan argumen sebagai nilai.
Argumen
- jaq dapat mendefinisikan argumen melalui command line.
Fold
- jaq menyediakan filter
reducedanforeach, dengan interpretasi yang berbeda dari jq.
Penanganan error
- jaq menggunakan mekanisme penanganan error yang berbeda dari jq.
Lainnya
- Pada slurping, hasil kali Kartesius, pembaruan daftar, pembacaan input, join, dan hal lainnya, jq dan jaq menunjukkan perilaku yang berbeda.
Kontribusi
- Kontribusi untuk jaq sangat diterima, dan setelah melakukan perubahan, pastikan
cargo testberjalan sukses.
Ucapan terima kasih
- jaq mendapat banyak manfaat berkat berbagai library dan Rust standard library.
Opini GN⁺
Hal terpenting dalam tulisan ini adalah bahwa jaq berupaya meningkatkan performa dan akurasi sambil tetap mendukung sebagian besar fitur jq. Khususnya, waktu startup yang jauh lebih cepat dibanding jq dan upayanya untuk mengurangi perilaku tak terduga dapat menarik bagi banyak pengguna. Selain itu, karena dikembangkan berbasis Rust, jaq juga memiliki keunggulan dari sisi keamanan memori dan performa. Perbaikan-perbaikan ini diharapkan menjadikan jaq alat yang berguna bagi software engineer yang membutuhkan pemrosesan data JSON.
1 komentar
Opini Hacker News
nan > nanyang salah dannan < nanyang benar di jq benar-benar mengikuti standar floating point IEEE 754, atau justru merupakan bug.