Doğruluk, hız ve sadeliğe odaklanan bir jq klonu: Jaq
(github.com/01mf02)jaq'a giriş
- jaq, JSON veri işleme aracı jq'nun bir klonudur ve jq'nun sözdizimi ile işlemlerinin büyük bölümünü desteklemeyi hedefler.
- jaq'ın üç temel hedefi doğruluk, performans ve sadeliktir.
- jq ile uyumluluğu korurken daha doğru ve öngörülebilir bir uygulama sunmayı amaçlar.
- jq'nun beklenmedik davranışlarına örnek olarak
nan > nanifadesinin yanlış,nan < nanifadesinin ise doğru olması vejqiçinde[[[]] | implodeçalıştırıldığında çökme yaşanması verilebilir. - jq'nun uzun başlangıç süresine çözüm olarak geliştirildi ve jq 1.6'ya kıyasla yaklaşık 30 kat daha hızlı başlangıç süresi sunar.
- jaq, hata olasılığını azaltmak ve katkıyı kolaylaştırmak için basit ve küçük bir uygulama olmayı hedefler.
Kurulum
Kaynaktan kurulum
- jaq'ı derlemek için Rust araç zinciri gerekir.
- Linux dağıtımlarında yer alan Rust derleyicisi eski olabilir ve jaq'ı derlemek için uygun olmayabilir.
- jaq,
cargo install --locked jaqveyacargo install --locked --git https://github.com/01mf02/jaqkomutlarıyla kurulabilir. - jaq, Rust'ın desteklediği tüm sistemlerde çalışmalıdır; aksi halde bir issue açılmalıdır.
İkili dosyadan kurulum
- macOS veya Linux'ta Homebrew kullanarak jaq kurulabilir.
Örnekler
- Aşağıdaki örnekler, jaq'ın şu anda neler yapabildiğini gösterir.
echo '{"a": 1, "b": 2}' | jaq '.a'çalıştırıldığında1çıktısı alınır.echo '{"a": 1, "b": 2}' | jaq 'add'çalıştırıldığında3çıktısı alınır.echo '[0, 1, 2, 3]' | jaq 'map(.*2) | [.[] | select(. < 5)]'çalıştırıldığında[0, 2, 4]çıktısı alınır.
Performans
- Çeşitli benchmark'lar üzerinden jaq, jq ve gojq'nun performansı karşılaştırılır.
emptybenchmark'ı başlangıç süresini ölçmek için kullanılır.bf-fibbenchmark'ında jq ile yazılmış bir Brainfuck yorumlayıcısı, Fibonacci sayıları üreten bir Brainfuck betiğini çalıştırır.- Diğer benchmark'lar, çeşitli filtreleri
ngirdi değerleriyle birlikte değerlendirir. - Sonuçlar, jaq-1.2'nin 16 benchmark'ta en hızlı olduğunu, jq-1.7'nin 2 benchmark'ta ve gojq-0.12.13'ün 1 benchmark'ta en hızlı olduğunu gösterir.
Özellikler
Temel özellikler
- Temel veri türleri, koşullar, erişim, operatörler, hata işleme, string interpolation, biçim dizeleri gibi çeşitli temel özellikleri destekler.
Yollar
- Dizi/nesne indeksleme, yineleme, isteğe bağlı indeksleme/yineleme, dizi dilimleme ve string dilimleme desteklenir.
Operatörler
- Bileşim, bağlama, birleştirme, atama, güncelleme ataması, alternatif, mantıksal, eşitlik ve karşılaştırma, aritmetik, olumsuzlama ve hata bastırma operatörleri desteklenir.
Tanımlar
- Temel tanımlar ve özyinelemeli tanımlar desteklenir.
Çekirdek filtreler
- Çeşitli çekirdek filtreler desteklenir.
Standart filtreler
- Standart filtreler daha temel filtreler üzerinden tanımlanır.
Sayısal filtreler
- libm'den alınan çok sayıda filtre desteklenir.
Gelişmiş özellikler
- jq'nun bazı özellikleri desteklenmez; örneğin modüller, SQL tarzı operatörler ve streaming.
jq ile jaq arasındaki farklar
Sayılar
- jq tüm sayıları 64 bit kayan nokta olarak kullanırken, jaq tamsayılar ile kayan noktalı sayıları ayırt eder.
NaN ve sonsuzluk
- jaq, IEEE 754 kayan nokta aritmetiği standardına daha yakın bir davranış sunar.
Kesirli sayıların korunması
- jaq, JSON verisinden gelen kesirli sayıları eksiksiz biçimde korur.
Atama
- jaq, atamayı jq'dan farklı şekilde yorumlar.
Tanımlar
- jaq, filtre tanımlarına izin verir ve jq'daki gibi argümanları değer olarak iletebilir.
Argümanlar
- jaq, komut satırı üzerinden argüman tanımlayabilir.
Katlama
- jaq,
reduceveforeachfiltrelerini sunar ve bunları jq'dan farklı yorumlar.
Hata işleme
- jaq, jq'dan farklı bir hata işleme mekanizması kullanır.
Diğer
- Slurp, Kartezyen çarpım, liste güncelleme, girdi okuma ve join gibi konularda jq ile jaq farklı davranışlar gösterir.
Katkı
- jaq'a katkılar memnuniyetle karşılanır; değişiklikten sonra
cargo testkomutunun başarıyla çalıştığı doğrulanmalıdır.
Teşekkür
- jaq, çeşitli kütüphaneler ve Rust standart kütüphanesi sayesinde büyük fayda sağlamıştır.
GN⁺ görüşü
Bu yazının en önemli noktası, jaq'ın jq'nun özelliklerinin büyük kısmını desteklerken performans ve doğruluğu iyileştirmeye çalışmasıdır. Özellikle başlangıç süresinin jq'ya göre belirgin biçimde daha hızlı olması ve beklenmedik davranışları azaltmayı hedeflemesi, birçok kullanıcı için ilgi çekici olabilir. Ayrıca Rust tabanlı geliştirilmiş olması, bellek güvenliği ve performans açısından da avantaj sağlar. Bu iyileştirmelerin, JSON veri işleme ihtiyacı olan yazılım mühendisleri için faydalı bir araç olması bekleniyor.
1 yorum
Hacker News görüşleri
nan > nanifadesinin yanlış,nan < nanifadesinin ise doğru olmasının, kayan nokta standardı IEEE 754'e sadık bir davranış mı yoksa bir hata mı olduğu sorgulanıyor.