सटीकता, गति और सरलता पर केंद्रित jq क्लोन, Jaq
(github.com/01mf02)jaq का परिचय
- jaq JSON डेटा प्रोसेसिंग टूल jq का एक क्लोन है, जिसका लक्ष्य jq के सिंटैक्स और ऑपरेशन्स के बड़े हिस्से को सपोर्ट करना है.
- jaq के तीन मुख्य लक्ष्य सटीकता, परफ़ॉर्मेंस, और सरलता हैं.
- यह jq के साथ कम्पैटिबिलिटी बनाए रखते हुए अधिक सटीक और पूर्वानुमानित इम्प्लीमेंटेशन देने की कोशिश करता है.
- jq के अप्रत्याशित व्यवहार के उदाहरणों में
nan > nanका false होना औरnan < nanका true होना, तथाjqमें[[[]] | implodeचलाने पर crash होना शामिल है. - इसे jq के लंबे startup time की समस्या के समाधान के रूप में विकसित किया गया था, और इसका startup time jq 1.6 की तुलना में लगभग 30 गुना तेज़ है.
- jaq का लक्ष्य एक सरल और छोटा इम्प्लीमेंटेशन रखना है ताकि bugs की संभावना कम हो और योगदान देना आसान बने.
इंस्टॉलेशन
source से इंस्टॉल करना
- jaq को compile करने के लिए Rust toolchain की आवश्यकता होती है.
- Linux distributions में शामिल Rust compiler पुराना हो सकता है और jaq को compile करने के लिए उपयुक्त न हो.
cargo install --locked jaqयाcargo install --locked --git https://github.com/01mf02/jaqकमांड के जरिए jaq को इंस्टॉल किया जा सकता है.- Rust द्वारा सपोर्ट किए जाने वाले सभी systems पर jaq को काम करना चाहिए, और यदि ऐसा न हो तो issue दर्ज किया जाना चाहिए.
binary इंस्टॉलेशन
- macOS या Linux पर homebrew का उपयोग करके jaq को इंस्टॉल किया जा सकता है.
उदाहरण
- नीचे दिए गए उदाहरण दिखाते हैं कि jaq अभी क्या-क्या कर सकता है.
echo '{"a": 1, "b": 2}' | jaq '.a'चलाने पर1आउटपुट होता है.echo '{"a": 1, "b": 2}' | jaq 'add'चलाने पर3आउटपुट होता है.echo '[0, 1, 2, 3]' | jaq 'map(.*2) | [.[] | select(. < 5)]'चलाने पर[0, 2, 4]आउटपुट होता है.
परफ़ॉर्मेंस
- कई benchmarks के जरिए jaq, jq, और gojq की परफ़ॉर्मेंस की तुलना की गई है.
emptybenchmark का उपयोग startup time मापने के लिए किया जाता है.bf-fibbenchmark में jq में लिखा गया Brainfuck interpreter, Fibonacci numbers बनाने वाली Brainfuck script को चलाता है.- अन्य benchmarks विभिन्न filters को
ninput values के साथ evaluate करते हैं. - benchmark परिणाम दिखाते हैं कि jaq-1.2, 16 benchmarks में सबसे तेज़ है, jq-1.7, 2 में, और gojq-0.12.13, 1 में सबसे तेज़ है.
फीचर्स
मूल फीचर्स
- यह basic data types, conditionals, access, operators, error handling, string interpolation, format strings आदि जैसे कई मूल फीचर्स को सपोर्ट करता है.
paths
- यह array/object indexing, iteration, optional indexing/iteration, array slices, string slices आदि को सपोर्ट करता है.
operators
- यह composition, binding, concatenation, assignment, update assignment, alternatives, logic, equality और comparison, arithmetic, negation, तथा error suppression जैसे operators को सपोर्ट करता है.
definitions
- यह basic definitions और recursive definitions को सपोर्ट करता है.
core filters
- यह कई core filters को सपोर्ट करता है.
standard filters
- standard filters को अधिक बुनियादी filters के माध्यम से परिभाषित किया जाता है.
numeric filters
- यह libm से लिए गए कई filters को सपोर्ट करता है.
उन्नत फीचर्स
- jq की कुछ सुविधाएँ सपोर्ट नहीं की जातीं, जैसे modules, SQL-style operators, streaming आदि.
jq और jaq के बीच अंतर
numbers
- jq जहाँ सभी numbers को 64-bit floating point के रूप में उपयोग करता है, वहीं jaq integers और floating point numbers के बीच अंतर करता है.
NaN और infinity
- jaq, IEEE 754 floating point arithmetic standard के अधिक करीब व्यवहार प्रदान करता है.
fractional numbers का संरक्षण
- jaq, JSON डेटा से आने वाले fractional numbers को पूरी तरह सुरक्षित रखता है.
assignment
- jaq, assignment को jq से अलग तरीके से interpret करता है.
definitions
- jaq, filter definitions की अनुमति देता है, और jq की तरह arguments को values के रूप में पास किया जा सकता है.
arguments
- jaq, command line के जरिए arguments को define करने की अनुमति देता है.
folding
- jaq,
reduceऔरforeachfilters प्रदान करता है और jq से अलग interpretation देता है.
error handling
- jaq, jq से अलग error handling mechanism का उपयोग करता है.
अन्य
- slurping, Cartesian product, list updates, input reading, joins आदि में jq और jaq अलग व्यवहार दिखाते हैं.
योगदान
- jaq में योगदान का स्वागत है, और बदलाव के बाद यह सुनिश्चित करना चाहिए कि
cargo testसफलतापूर्वक चलता है.
आभार
- jaq को कई libraries और Rust standard library से बड़ा लाभ मिला है.
GN⁺ की राय
इस लेख की सबसे महत्वपूर्ण बात यह है कि jaq, jq की अधिकांश क्षमताओं को सपोर्ट करते हुए भी परफ़ॉर्मेंस और सटीकता को बेहतर बनाने की कोशिश करता है. खास तौर पर, jq की तुलना में इसका startup time काफी तेज़ है और अप्रत्याशित व्यवहार को कम करने पर इसका ध्यान कई उपयोगकर्ताओं के लिए दिलचस्प हो सकता है. साथ ही, Rust-आधारित होने के कारण इसे memory safety और परफ़ॉर्मेंस दोनों के लिहाज़ से भी फायदे मिलते हैं. इन सुधारों के कारण JSON डेटा प्रोसेसिंग की ज़रूरत वाले software engineers के लिए यह एक उपयोगी टूल बन सकता है.
1 टिप्पणियां
Hacker News राय
nan > nanfalse औरnan < nantrue होना क्या IEEE 754 floating-point standard का सही पालन है, या यह एक बग है.