3P by neo 12달전 | favorite | 댓글 1개

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는 reduceforeach 필터를 제공하며, jq와 다른 해석을 제공함.

오류 처리

  • jaq는 jq와 다른 오류 처리 메커니즘을 사용함.

기타

  • 슬러핑, 카테시안 곱, 리스트 업데이트, 입력 읽기, 조인 등에서 jq와 jaq는 다른 동작을 보임.

기여

  • jaq에 대한 기여를 환영하며, 변경 후 cargo test가 성공적으로 실행되는지 확인해야 함.

감사의 말

  • jaq는 여러 라이브러리와 Rust 표준 라이브러리 덕분에 큰 이득을 얻었음.

GN⁺의 의견

이 글에서 가장 중요한 것은 jaq가 jq의 기능을 대부분 지원하면서도 성능과 정확성을 개선하려는 시도임. 특히, 시작 시간이 jq에 비해 현저히 빠르고, 예상치 못한 동작을 줄이려는 점은 많은 사용자들에게 흥미로울 수 있음. 또한, Rust 기반으로 개발되어 메모리 안전성과 성능 측면에서도 장점을 가짐. 이러한 개선 사항은 JSON 데이터 처리가 필요한 소프트웨어 엔지니어에게 유용한 도구가 될 것으로 기대됨.

Hacker News 의견
  • [[[]] | implode 버그와 jq 개발 중단

    • jq 개발이 5년간 중단되었다가 최근 재개되어, 오랫동안 알려진 버그들이 수정되지 않은 상태였음. 개발 재개로 인해 점진적으로 누적된 문제들이 해결될 것으로 기대됨.
  • 다른 프로젝트 추천에 대한 감사

    • 프로젝트가 다른 유사하거나 영감을 준 프로젝트를 추천할 때 멋짐. 특히 jql 프로젝트를 알게 되어 만족함.
  • nan > nannan < nan의 비교 결과에 대한 의문

    • jq에서 nan > nan이 거짓이고 nan < nan이 참인 것은 부동소수점 표준인 IEEE 754를 충실히 따르는 것인지, 아니면 버그인지에 대한 의문 제기.
  • jq의 uint64 숫자 표시 문제

    • jq가 uint64 숫자를 제대로 표시하지 않는 것에 대한 불만 표출.
  • jq 대신 DuckDB 사용 경험 공유

    • jq는 강력하지만, 데이터가 표 형태일 경우 SQL을 사용하는 것이 더 자연스러움을 경험함.
  • jaq의 의존성이 많다는 지적

    • jaq 프로젝트의 의존성이 많다는 점에 대한 지적.
  • jq 사용 방법에 대한 질문

    • jq를 개발/데이터 분석 중에 JSON 파일을 탐색하는 용도로 사용하는지, 아니면 생산 환경에서 실행되는 프로그램에서 사용하는지에 대한 질문.
  • jq 대신 yq 사용에 대한 경험 공유

    • jq 대신 yq를 사용하기 시작했으며, 두 도구 사이의 주요 차이점에 대한 의견 교환.
  • PowerShell에서의 데이터 쿼리 방법

    • PowerShell을 사용하면 jq, xmlstarlet 등 다양한 도구의 문법을 배울 필요 없이 모든 데이터를 객체로 변환하여 PowerShell 문법으로 쿼리할 수 있음.
  • jq 문법과 문서의 난해함에 대한 의견

    • jq의 문법과 문서가 이해하기 어렵다고 느끼며, 새로운 버전에서도 이 부분이 개선되지 않았다고 생각함. 직접 작성하는 것이 더 나을 수도 있음을 시사함.