Jaq, bản sao của jq tập trung vào độ chính xác, tốc độ và sự đơn giản
(github.com/01mf02)Giới thiệu về jaq
- jaq là bản sao của jq, công cụ xử lý dữ liệu JSON, với mục tiêu hỗ trợ phần lớn cú pháp và phép toán của jq.
- Ba mục tiêu chính của jaq là độ chính xác, hiệu năng và sự đơn giản.
- Dự án hướng tới việc duy trì khả năng tương thích với jq đồng thời cung cấp một cách triển khai chính xác và dễ dự đoán hơn.
- Ví dụ về các hành vi khó lường của jq gồm việc
nan > nanlà sai cònnan < nanlại là đúng, và việc chạyjqvới[[[]] | implodegây sập. - jaq được phát triển như một giải pháp cho thời gian khởi động dài của jq, với thời gian khởi động nhanh hơn khoảng 30 lần so với jq 1.6.
- jaq hướng tới một triển khai đơn giản và nhỏ gọn để giảm khả năng phát sinh lỗi và giúp việc đóng góp trở nên dễ dàng hơn.
Cách cài đặt
Cài đặt từ mã nguồn
- Cần có bộ công cụ Rust để biên dịch jaq.
- Trình biên dịch Rust đi kèm trong các bản phân phối Linux có thể đã quá cũ và không phù hợp để biên dịch jaq.
- Có thể cài đặt jaq bằng lệnh
cargo install --locked jaqhoặccargo install --locked --git https://github.com/01mf02/jaq. - jaq được kỳ vọng sẽ hoạt động trên mọi hệ thống mà Rust hỗ trợ; nếu không, nên tạo issue.
Cài đặt bản nhị phân
- Có thể cài đặt jaq bằng homebrew trên macOS hoặc Linux.
Ví dụ
- Các ví dụ sau cho thấy những gì jaq hiện có thể làm.
- Chạy
echo '{"a": 1, "b": 2}' | jaq '.a'sẽ in ra1. - Chạy
echo '{"a": 1, "b": 2}' | jaq 'add'sẽ in ra3. - Chạy
echo '[0, 1, 2, 3]' | jaq 'map(.*2) | [.[] | select(. < 5)]'sẽ in ra[0, 2, 4].
Hiệu năng
- Hiệu năng của jaq, jq và gojq được so sánh qua nhiều benchmark.
- Benchmark
emptyđược dùng để đo thời gian khởi động. - Benchmark
bf-fibchạy một script Brainfuck tạo dãy Fibonacci bằng một trình thông dịch Brainfuck viết bằng jq. - Các benchmark khác đánh giá nhiều bộ lọc khác nhau với giá trị đầu vào
n. - Kết quả benchmark cho thấy jaq-1.2 nhanh nhất trong 16 benchmark, jq-1.7 nhanh nhất trong 2 benchmark, còn gojq-0.12.13 nhanh nhất trong 1 benchmark.
Tính năng
Tính năng cơ bản
- Hỗ trợ nhiều tính năng cơ bản như kiểu dữ liệu nền tảng, câu lệnh điều kiện, truy cập, toán tử, xử lý lỗi, nội suy chuỗi, chuỗi định dạng và hơn thế nữa.
Đường dẫn
- Hỗ trợ lập chỉ mục mảng/đối tượng, lặp, lập chỉ mục/lặp tùy chọn, cắt lát mảng và cắt lát chuỗi.
Toán tử
- Hỗ trợ các toán tử như kết hợp, binding, nối, gán, gán cập nhật, thay thế, logic, bằng nhau và so sánh, số học, phủ định và chặn lỗi.
Định nghĩa
- Hỗ trợ định nghĩa cơ bản và định nghĩa đệ quy.
Bộ lọc cốt lõi
- Hỗ trợ nhiều bộ lọc cốt lõi khác nhau.
Bộ lọc tiêu chuẩn
- Các bộ lọc tiêu chuẩn được định nghĩa thông qua những bộ lọc cơ bản hơn.
Bộ lọc số
- Hỗ trợ nhiều bộ lọc lấy từ libm.
Tính năng nâng cao
- Không hỗ trợ một số tính năng của jq, chẳng hạn như module, toán tử kiểu SQL, streaming, v.v.
Sự khác biệt giữa jq và jaq
Số
- jq sử dụng số dấu phẩy động 64 bit cho mọi số, trong khi jaq phân biệt giữa số nguyên và số dấu phẩy động.
NaN và vô cực
- jaq cung cấp hành vi gần hơn với chuẩn số học dấu phẩy động IEEE 754.
Bảo toàn số thập phân
- jaq bảo toàn hoàn toàn các số thập phân đến từ dữ liệu JSON.
Gán
- jaq diễn giải phép gán khác với jq.
Định nghĩa
- jaq cho phép định nghĩa bộ lọc và có thể truyền đối số theo giá trị giống như jq.
Đối số
- jaq có thể định nghĩa đối số qua dòng lệnh.
Gấp
- jaq cung cấp các bộ lọc
reducevàforeach, với cách diễn giải khác jq.
Xử lý lỗi
- jaq sử dụng cơ chế xử lý lỗi khác với jq.
Khác
- jq và jaq có hành vi khác nhau ở các khía cạnh như slurping, tích Descartes, cập nhật danh sách, đọc đầu vào, join, v.v.
Đóng góp
- Hoan nghênh đóng góp cho jaq, và cần đảm bảo
cargo testchạy thành công sau khi thay đổi.
Lời cảm ơn
- jaq hưởng lợi rất nhiều nhờ nhiều thư viện và thư viện chuẩn Rust.
Ý kiến của GN⁺
Điểm quan trọng nhất trong bài viết này là jaq đang cố gắng cải thiện hiệu năng và độ chính xác trong khi vẫn hỗ trợ phần lớn tính năng của jq. Đặc biệt, thời gian khởi động nhanh vượt trội so với jq và nỗ lực giảm các hành vi khó lường có thể sẽ hấp dẫn nhiều người dùng. Ngoài ra, việc được phát triển trên nền Rust cũng mang lại lợi thế về an toàn bộ nhớ và hiệu năng. Những cải tiến này được kỳ vọng sẽ biến nó thành một công cụ hữu ích cho các kỹ sư phần mềm cần xử lý dữ liệu JSON.
1 bình luận
Ý kiến trên Hacker News
nan > nanlà sai cònnan < nanlà đúng trong jq có thực sự tuân thủ chặt chẽ chuẩn số thực dấu phẩy động IEEE 754 hay chỉ là lỗi.