Jaq โคลนของ jq ที่เน้นความถูกต้อง ความเร็ว และความเรียบง่าย
(github.com/01mf02)แนะนำ jaq
- jaq เป็นโคลนของ jq ซึ่งเป็นเครื่องมือประมวลผลข้อมูล JSON โดยมีเป้าหมายที่จะรองรับไวยากรณ์และการทำงานของ jq ได้เป็นส่วนใหญ่
- เป้าหมายหลัก 3 ประการของ jaq คือ ความถูกต้อง, ประสิทธิภาพ, และ ความเรียบง่าย
- มีเป้าหมายที่จะคงความเข้ากันได้กับ jq พร้อมมอบการติดตั้งใช้งานที่แม่นยำและคาดเดาได้มากกว่า
- ตัวอย่างพฤติกรรมที่ไม่คาดคิดของ jq ได้แก่
nan > nanให้ค่าเป็นเท็จ แต่nan < nanให้ค่าเป็นจริง และการรันjqด้วย[[[]] | implodeทำให้เกิดการแครช - มันถูกพัฒนาขึ้นเพื่อแก้ปัญหาเวลาเริ่มต้นที่ยาวนานของ jq และมีเวลาเริ่มต้นเร็วกว่าประมาณ 30 เท่าเมื่อเทียบกับ jq 1.6
- jaq ตั้งเป้าให้มีการติดตั้งใช้งานที่เรียบง่ายและขนาดเล็ก เพื่อลดโอกาสเกิดบั๊กและช่วยให้การมีส่วนร่วมทำได้ง่ายขึ้น
วิธีติดตั้ง
ติดตั้งจากซอร์ส
- ต้องมี Rust toolchain เพื่อคอมไพล์ jaq
- Rust compiler ที่มากับลินุกซ์ดิสโทรบางตัวอาจเก่าเกินไปและไม่เหมาะสำหรับการคอมไพล์ jaq
- สามารถติดตั้ง jaq ได้ด้วยคำสั่ง
cargo install --locked jaqหรือcargo install --locked --git https://github.com/01mf02/jaq - jaq ควรทำงานได้บนทุกระบบที่ Rust รองรับ และหากไม่เป็นเช่นนั้นควรเปิด issue
ติดตั้งแบบไบนารี
- สามารถติดตั้ง jaq บน macOS หรือ Linux ได้ด้วย homebrew
ตัวอย่าง
- ตัวอย่างต่อไปนี้แสดงให้เห็นว่าในตอนนี้ 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]
ประสิทธิภาพ
- มีการเปรียบเทียบประสิทธิภาพของ jaq, jq และ gojq ผ่านเบนช์มาร์กหลายชุด
- เบนช์มาร์ก
emptyใช้สำหรับวัดเวลาเริ่มต้น - เบนช์มาร์ก
bf-fibรันอินเทอร์พรีเตอร์ Brainfuck ที่เขียนด้วย jq เพื่อให้ทำงานกับสคริปต์ Brainfuck ที่สร้างลำดับฟีโบนักชี - เบนช์มาร์กอื่น ๆ เป็นการประเมินฟิลเตอร์หลากหลายแบบร่วมกับค่าอินพุต
n - ผลเบนช์มาร์กแสดงว่า jaq-1.2 เร็วที่สุดใน 16 เบนช์มาร์ก, jq-1.7 เร็วที่สุดใน 2 รายการ, และ gojq-0.12.13 เร็วที่สุดใน 1 รายการ
ความสามารถ
ความสามารถพื้นฐาน
- รองรับความสามารถพื้นฐานหลากหลาย เช่น ชนิดข้อมูลพื้นฐาน, เงื่อนไข, การเข้าถึง, ตัวดำเนินการ, การจัดการข้อผิดพลาด, string interpolation, format string และอื่น ๆ
พาธ
- รองรับการทำดัชนีอาร์เรย์/อ็อบเจ็กต์, การวนซ้ำ, การทำดัชนี/วนซ้ำแบบทางเลือก, การ slice อาร์เรย์ และการ slice สตริง
ตัวดำเนินการ
- รองรับตัวดำเนินการสำหรับ composition, binding, concatenation, assignment, update assignment, alternative, logic, equality และ comparison, arithmetic, negation และ error suppression
การนิยาม
- รองรับทั้งการนิยามพื้นฐานและการนิยามแบบ recursive
ฟิลเตอร์แกนหลัก
- รองรับฟิลเตอร์แกนหลักหลากหลายแบบ
ฟิลเตอร์มาตรฐาน
- ฟิลเตอร์มาตรฐานถูกนิยามขึ้นจากฟิลเตอร์พื้นฐานมากกว่า
ฟิลเตอร์เชิงตัวเลข
- รองรับฟิลเตอร์จำนวนมากที่นำมาจาก libm
ความสามารถขั้นสูง
- ยังไม่รองรับบางความสามารถของ jq เช่น โมดูล, ตัวดำเนินการสไตล์ SQL, สตรีมมิง เป็นต้น
ความแตกต่างระหว่าง jq และ jaq
ตัวเลข
- jq ใช้ตัวเลขทั้งหมดเป็น floating point แบบ 64 บิต ขณะที่ jaq แยกใช้จำนวนเต็มและ floating point
NaN และอินฟินิตี้
- jaq ให้พฤติกรรมที่ใกล้เคียงกับมาตรฐานเลขคณิต floating point IEEE 754 มากกว่า
การคงค่าเลขเศษส่วน
- jaq สามารถคงค่าเลขเศษส่วนที่มาจากข้อมูล JSON ได้อย่างสมบูรณ์
การกำหนดค่า
- jaq ตีความ assignment แตกต่างจาก jq
การนิยาม
- jaq อนุญาตให้มีการนิยามฟิลเตอร์ และสามารถส่งอาร์กิวเมนต์เป็นค่าได้เหมือน jq
อาร์กิวเมนต์
- jaq สามารถนิยามอาร์กิวเมนต์ผ่าน command line ได้
การพับค่า
- jaq มีฟิลเตอร์
reduceและforeachและให้การตีความที่ต่างจาก jq
การจัดการข้อผิดพลาด
- jaq ใช้กลไกการจัดการข้อผิดพลาดที่ต่างจาก jq
อื่น ๆ
- jq และ jaq มีพฤติกรรมต่างกันในเรื่อง slurping, Cartesian product, list update, การอ่านอินพุต, การ join และส่วนอื่น ๆ
การมีส่วนร่วม
- ยินดีต้อนรับการมีส่วนร่วมกับ jaq และควรตรวจสอบให้แน่ใจว่า
cargo testรันผ่านสำเร็จหลังจากแก้ไขแล้ว
คำขอบคุณ
- jaq ได้รับประโยชน์อย่างมากจากหลายไลบรารีและ Rust standard library
ความเห็นของ GN⁺
สิ่งสำคัญที่สุดของบทความนี้คือ jaq พยายามรองรับความสามารถส่วนใหญ่ของ jq ขณะเดียวกันก็ปรับปรุงทั้งประสิทธิภาพและความถูกต้อง โดยเฉพาะเวลาเริ่มต้นที่เร็วกว่า jq อย่างชัดเจน และความพยายามลดพฤติกรรมที่ไม่คาดคิด ซึ่งน่าจะดึงดูดความสนใจของผู้ใช้จำนวนมาก นอกจากนี้ยังพัฒนาด้วย Rust จึงมีข้อดีด้าน memory safety และประสิทธิภาพด้วย การปรับปรุงเหล่านี้มีแนวโน้มทำให้มันเป็นเครื่องมือที่มีประโยชน์สำหรับวิศวกรซอฟต์แวร์ที่ต้องประมวลผลข้อมูล JSON
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
nan > nanเป็นเท็จ และnan < nanเป็นจริงนั้น เป็นการทำตามมาตรฐานเลขทศนิยมลอยตัว IEEE 754 อย่างเคร่งครัด หรือเป็นบั๊กกันแน่