GN⁺: 정확성, 속도, 그리고 단순성에 중점을 둔 jq 클론, Jaq
(github.com/01mf02)jaq의 소개
- jaq는 JSON 데이터 처리 도구인 jq의 클론으로, jq의 문법과 연산의 상당 부분을 지원함을 목표로 함.
- jaq의 세 가지 주요 목표는 정확성, 성능, 그리고 단순성임.
- jq와의 호환성을 유지하면서 더 정확하고 예측 가능한 구현을 제공하려 함.
- jq의 예상치 못한 동작 예시로는
nan > nan
이 거짓이고nan < nan
이 참인 점,jq
에서[[[]] | implode
실행 시 충돌이 발생하는 점 등이 있음. - jq의 긴 시작 시간에 대한 해결책으로 개발되었으며, jq 1.6보다 약 30배 빠른 시작 시간을 자랑함.
- jaq는 버그의 가능성을 줄이고 기여를 용이하게 하기 위해 간단하고 작은 구현을 목표로 함.
설치 방법
소스로부터 설치
- jaq를 컴파일하기 위해서는 Rust 도구체인이 필요함.
- Rust 컴파일러는 리눅스 배포판에 포함된 것이 오래되어 jaq를 컴파일하기에 적합하지 않을 수 있음.
-
cargo install --locked jaq
또는cargo install --locked --git https://github.com/01mf02/jaq
명령어를 통해 jaq를 설치할 수 있음. - Rust가 지원하는 모든 시스템에서 jaq가 작동해야 하며, 그렇지 않은 경우 이슈를 제기해야 함.
바이너리 설치
- 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]
가 출력됨.
성능
- 여러 벤치마크를 통해 jaq, jq, gojq의 성능을 비교함.
-
empty
벤치마크는 시작 시간을 측정하기 위해 사용됨. -
bf-fib
벤치마크는 jq로 작성된 Brainfuck 인터프리터가 Fibonacci 수를 생성하는 Brainfuck 스크립트를 실행함. - 다른 벤치마크는 다양한 필터를
n
입력값과 함께 평가함. - 벤치마크 결과는 jaq-1.2가 16개 벤치마크에서 가장 빠르고, jq-1.7은 2개, gojq-0.12.13은 1개에서 가장 빠름을 보여줌.
기능
기본 기능
- 기본 데이터 타입, 조건문, 접근, 연산자, 오류 처리, 문자열 보간, 포맷 문자열 등 다양한 기본 기능을 지원함.
경로
- 배열/객체 인덱싱, 반복, 선택적 인덱싱/반복, 배열 슬라이스, 문자열 슬라이스 등을 지원함.
연산자
- 구성, 바인딩, 연결, 할당, 업데이트 할당, 대안, 논리, 동등성 및 비교, 산술, 부정, 오류 억제 등의 연산자를 지원함.
정의
- 기본 정의 및 재귀 정의를 지원함.
핵심 필터
- 다양한 핵심 필터를 지원함.
표준 필터
- 표준 필터는 더 기본적인 필터를 통해 정의됨.
수치 필터
- libm에서 가져온 많은 필터를 지원함.
고급 기능
- jq의 몇몇 기능은 지원하지 않음, 예를 들어 모듈, SQL 스타일 연산자, 스트리밍 등.
jq와 jaq의 차이점
숫자
- jq는 모든 숫자를 64비트 부동 소수점으로 사용하는 반면, jaq는 정수와 부동 소수점을 구분하여 사용함.
NaN과 무한대
- jaq는 IEEE 754 부동 소수점 산술 표준에 더 가까운 동작을 제공함.
분수 숫자의 보존
- jaq는 JSON 데이터에서 오는 분수 숫자를 완벽하게 보존함.
할당
- jaq는 할당을 jq와 다르게 해석함.
정의
- jaq는 필터 정의를 허용하며, jq와 같이 인자를 값으로 전달할 수 있음.
인자
- jaq는 명령줄을 통해 인자를 정의할 수 있음.
접기
- jaq는
reduce
와foreach
필터를 제공하며, jq와 다른 해석을 제공함.
오류 처리
- jaq는 jq와 다른 오류 처리 메커니즘을 사용함.
기타
- 슬러핑, 카테시안 곱, 리스트 업데이트, 입력 읽기, 조인 등에서 jq와 jaq는 다른 동작을 보임.
기여
- jaq에 대한 기여를 환영하며, 변경 후
cargo test
가 성공적으로 실행되는지 확인해야 함.
감사의 말
- jaq는 여러 라이브러리와 Rust 표준 라이브러리 덕분에 큰 이득을 얻었음.
GN⁺의 의견
이 글에서 가장 중요한 것은 jaq가 jq의 기능을 대부분 지원하면서도 성능과 정확성을 개선하려는 시도임. 특히, 시작 시간이 jq에 비해 현저히 빠르고, 예상치 못한 동작을 줄이려는 점은 많은 사용자들에게 흥미로울 수 있음. 또한, Rust 기반으로 개발되어 메모리 안전성과 성능 측면에서도 장점을 가짐. 이러한 개선 사항은 JSON 데이터 처리가 필요한 소프트웨어 엔지니어에게 유용한 도구가 될 것으로 기대됨.
Hacker News 의견
-
[[[]] | implode
버그와 jq 개발 중단- jq 개발이 5년간 중단되었다가 최근 재개되어, 오랫동안 알려진 버그들이 수정되지 않은 상태였음. 개발 재개로 인해 점진적으로 누적된 문제들이 해결될 것으로 기대됨.
-
다른 프로젝트 추천에 대한 감사
- 프로젝트가 다른 유사하거나 영감을 준 프로젝트를 추천할 때 멋짐. 특히 jql 프로젝트를 알게 되어 만족함.
-
nan > nan
과nan < nan
의 비교 결과에 대한 의문- jq에서
nan > nan
이 거짓이고nan < nan
이 참인 것은 부동소수점 표준인 IEEE 754를 충실히 따르는 것인지, 아니면 버그인지에 대한 의문 제기.
- jq에서
-
jq의 uint64 숫자 표시 문제
- jq가 uint64 숫자를 제대로 표시하지 않는 것에 대한 불만 표출.
-
jq 대신 DuckDB 사용 경험 공유
- jq는 강력하지만, 데이터가 표 형태일 경우 SQL을 사용하는 것이 더 자연스러움을 경험함.
-
jaq
의 의존성이 많다는 지적- jaq 프로젝트의 의존성이 많다는 점에 대한 지적.
-
jq 사용 방법에 대한 질문
- jq를 개발/데이터 분석 중에 JSON 파일을 탐색하는 용도로 사용하는지, 아니면 생산 환경에서 실행되는 프로그램에서 사용하는지에 대한 질문.
-
jq 대신 yq 사용에 대한 경험 공유
- jq 대신 yq를 사용하기 시작했으며, 두 도구 사이의 주요 차이점에 대한 의견 교환.
-
PowerShell에서의 데이터 쿼리 방법
- PowerShell을 사용하면 jq, xmlstarlet 등 다양한 도구의 문법을 배울 필요 없이 모든 데이터를 객체로 변환하여 PowerShell 문법으로 쿼리할 수 있음.
-
jq 문법과 문서의 난해함에 대한 의견
- jq의 문법과 문서가 이해하기 어렵다고 느끼며, 새로운 버전에서도 이 부분이 개선되지 않았다고 생각함. 직접 작성하는 것이 더 나을 수도 있음을 시사함.