# 정확성, 속도, 그리고 단순성에 중점을 둔 jq 클론, Jaq

> Clean Markdown view of GeekNews topic #12098. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=12098](https://news.hada.io/topic?id=12098)
- GeekNews Markdown: [https://news.hada.io/topic/12098.md](https://news.hada.io/topic/12098.md)
- Type: GN+
- Author: [neo](https://news.hada.io/@neo)
- Published: 2023-11-30T10:35:13+09:00
- Updated: 2023-11-30T10:35:13+09:00
- Original source: [github.com/01mf02](https://github.com/01mf02/jaq)
- Points: 3
- Comments: 1

## Topic Body

### 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 데이터 처리가 필요한 소프트웨어 엔지니어에게 유용한 도구가 될 것으로 기대됨.

## Comments



### Comment 20979

- Author: neo
- Created: 2023-11-30T10:35:13+09:00
- Points: 1

###### [Hacker News 의견](https://news.ycombinator.com/item?id=38461249) 
- > **`[[[]] | implode` 버그와 jq 개발 중단**
  - jq 개발이 5년간 중단되었다가 최근 재개되어, 오랫동안 알려진 버그들이 수정되지 않은 상태였음. 개발 재개로 인해 점진적으로 누적된 문제들이 해결될 것으로 기대됨.

- > **다른 프로젝트 추천에 대한 감사**
  - 프로젝트가 다른 유사하거나 영감을 준 프로젝트를 추천할 때 멋짐. 특히 jql 프로젝트를 알게 되어 만족함.

- > **`nan > nan`과 `nan < 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의 문법과 문서가 이해하기 어렵다고 느끼며, 새로운 버전에서도 이 부분이 개선되지 않았다고 생각함. 직접 작성하는 것이 더 나을 수도 있음을 시사함.
