jq (프로그래밍 언어)

jq (programming language)
제이큐
The characters "./jq" in black, monospace font
공식 jq 로고
패러다임순수한 기능적 프로그래밍, JSON 지향 처리, 암묵적 프로그래밍
설계자스티븐 돌란
처음 등장2012년 8월 21일; 10년 전 (2012-08-21)
구현 언어jq: C
Gojq: Go
플랫폼크로스 플랫폼[주1]
OS크로스 플랫폼[주2]
면허증.MIT[주3]
웹사이트jqlang.github.io/jq

jq는 모든 JSON 값이 상수인 매우 높은 수준의 사전 범위 기능 프로그래밍 언어입니다. jq는 무한히 JSON 데이터 스트림의 역추적 및 관리를 지원합니다.아이콘해스켈 프로그래밍 언어와 관련이 있습니다.이 언어는 네임스페이스 기반 모듈 시스템을 지원하며 폐쇄를 일부 지원합니다.특히 함수와 함수식은 다른 함수의 매개 변수로 사용할 수 있습니다.

jq의 원래 구현은 C에 있었으며 gojq는 "순수한 Go" 구현입니다.표시 의미론이 [3]지정된 jq의 큰 하위 집합 [2]jaq의 Rust 구현도 있습니다.

gojq는 Go가 지원되는 모든 플랫폼에서 실행되어야 하며, 마찬가지로 jaq와 Rust에 대해서도 실행되어야 합니다.

역사

jq는 Stephen Dolan에 의해 만들어졌고 2012년 [4][5]10월에 출시되었습니다.그것은 "JSON [6]데이터를 위한 sed"로 묘사되었습니다.정규식 지원은 jq 버전 1.5에서 추가되었습니다.

yq라는 이름의 jq용 "래퍼" 프로그램은 YAML, XMLTOML대한 지원을 추가합니다.[7] 2017년에 처음 출시되었습니다.

Go 구현체인 gojq는 [8]2019년에 처음 출시되었습니다. gojq는 특히 JQ를 확장하여 YAML에 대한 지원을 포함합니다.

정규 표현식에 대한 광범위한 지원을 포함하는 jaq의 첫 번째 버전은 2023년 3월에 출시되었습니다.이 버전(0.10)에는 빠른 JSON 파서도 포함되어 있습니다.중첩 함수와 재귀적으로 정의된 함수에 대한 지원이 이후 추가되었지만 2023년 6월 현재 jaq는 최소한의 메모리 요구 사항으로 매우 큰 JSON 문서를 처리하기 위한 "스트리밍 파서"를 여전히 포함하지 않습니다.

사용.

명령줄 사용

jq는 일반적으로 명령줄에서 사용되며 컬과 같은 다른 명령줄 유틸리티와 함께 사용할 수 있습니다.다음은 의 출력을 보여주는 예입니다.curl명령을 jq 필터에 연결하여 이 위키백과 페이지와 관련된 범주 이름을 결정할 수 있습니다.

curl 'https://en.wikipedia.org/w/api.php?action=parse&page=jq_(programming_language)&format=json' jq'.categories[]."*"

이 파이프라인에서 생성되는 출력은 JSON 문자열 스트림으로 구성되며, 그 중 처음 몇 개는 다음과 같습니다.

"기사_with_short_description" "짧은_설명_일치_위키데이터" "Dynamic_type_programming_languages" "functional_languages" "프로그래밍_언어" "프로그래밍_languages_created_in_2012" "Query_languages" "2012_소프트웨어" 

curl위의 명령은 이 페이지에 대한 MediaWiki API를 사용하여 JSON 응답을 생성합니다.파이프 의 출력을 허용합니다.curl표준 유닉스[9]메커니즘인 jq에 의해 액세스됩니다.

표시된 jq 필터는 jq 파이프라인의 약어입니다.

.["categories"] .["categories"] .["*"]

이는 호출에 의해 생성된 중첩된 JSON 구조에 해당합니다.curlJQ 파이프라인은 다음과 같은 방법으로 구성됩니다. Unix 스타일 파이프라인과 같은 문자입니다.

임베디드 사용

C와 Go 구현은 모두 jq 기능이 다른 응용 프로그램 및 프로그래밍 환경에 포함될 수 있도록 라이브러리를 제공합니다.

예를 들어, gojq는 SQLite와 통합되어 다음과 같이jq함수는 SQL [10]에서 사용할 수 있습니다.이 기능은 "결정론적"으로 표시되므로 "CREATE INDEX" [11]명령에서 사용할 수 있습니다.

작동 모드

jq는 기본적으로 JSON 입력을 위한 "스트림 편집기" 역할을 하며, sed 유틸리티가 텍스트 줄을 위한 "스트림 편집기"로 생각될 수 있는 것과 매우 유사합니다.그러나 jq에는 다음과 같은 몇 가지 다른 작동 모드가 있습니다.

  1. 하나 이상의 소스로부터의 입력을 텍스트 라인으로 처리할 수 있습니다.
  2. 지정된 소스에서 JSON 어레이로 입력 스트림을 수집할 수 있습니다.
  3. 모든 "리프" 경로에 대해 [경로, 값] 배열의 스트림을 생성하는 이른바 "스트리밍 파서"를 사용하여 JSON 입력을 구문 분석할 수 있습니다.

"스트리밍 파서"는 메모리 요구 사항이 일반적으로 매우 작기 때문에 JSON 입력 중 하나가 너무 커서 메모리에 들어갈 수 없을 때 특히 유용합니다.예를 들어, 임의로 큰 JSON 개체 배열의 경우 최대 메모리 요구 사항은 가장 큰 최상위 개체를 처리하는 데 필요한 수준에 불과합니다.

이러한 작동 모드는 특정 제한 내에서 결합될 수 있습니다.

구문 및 의미론

종류들

모든 JSON 값은 그 자체가 jq의 값이므로 아래 [12]표에 표시된 유형을 가집니다.gojq 구현은 정수와 정수가 아닌 숫자를 구별하며, 무한 정밀 정수 산술을 지원합니다.

jq의 지원되는 유형 요약
유형
"숫자"
  • 3
  • 3.2
  • 1e6
  • nan
  • infinite
"문자열"
  • "Hello"
  • "😐"
"스캐너덜너덜
  • true
  • false
"어레이"
  • [1, "2", {"mixed": "type"}, [3,4]]
"개체"
  • {"one": 1, "two": "2", "three": [3]}
"스캐너덜너덜
  • null

null 는 다른 JSON 스칼라와 마찬가지로 값입니다. 포인터나 "null-pointer"가 아닙니다.nan(NaN에 해당) 및infinite(IEEE 754 참조)는 JSON 값이 아닌 유일한 두 개의 jq 스칼라입니다.

양식

함수 생성, 조건부, 스트림 감소 및 모듈 시스템을 위한 특별한 구문 형식이 있습니다.

필터

다음은 2부터 36까지의 모든 기본값에서 정수 형식을 지정하기 위한 명명된 매개 변수화된 필터를 정의하는 방법을 보여주는 예입니다.구현은 암묵적(또는 포인트 프리) 프로그래밍을 보여줍니다.

무한 정밀 정수 산술 def to base($b)에 gojq 사용: defdigit: "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"[dhda.+1]; def mod: . % $b; def div: (. - mod) / $b); def digits: recurse(선택().>= $b) mod; (2 < = $b and $b < = 36) [숫자] 역추가;

다음 예제는 고전적인 "SEND MORE MONEY" 언어 산술 게임에서 제너레이터의 사용을 보여줍니다.

def send_more_money: def choose(m;n+1): ([범위(m;n+1)] - used): ([범위(m;n+1)]; (a;b;c;d): 1000*a + 100*b + 10*c + d; defn(a;c;c;d;e): 10*n(a;c;d) + e; 첫 번째(1) $m0을 선택(8; $o(8;9)$로 선택(2;(9)$로 선택합니다;(2;(2)$ 선택t(num($s;$e;$n;$d) + num($m;$o;$r;$e) == num($m;$o;$e;$y) [$s,$e,$d,$m,$o,$e,$m,$o,$e,$y]

식 문법 구문 분석

jq와 구문 분석 표현 문법(PEG) 형식 사이에는 매우 밀접한 관계가 있습니다.[13] 이 관계는 다음 표에 표시된 7가지 기본 PEG 연산과 jq 구조의 동등성에서 비롯됩니다.

PEG 연산과 jq 등가물 간의 대응 관계
PEG작업명 PEG 표기법 jq 연산 또는 def
순서 e1 e2 e1 e2
순서선택 e1 / e2 e1 // e2
제로 또는 그 이상 e* def star(E): (E star(E)) // . ;
하나 이상 e+ def plus(E): E (plus(E) // . );
선택적. e? def optional(E): E // .;
And-predicate &e def amp(E): . as $in E $in;
서술하지 않음 !e def neg(E): select( [E] == [] );

메모들

  1. ^ jq의 C 및 Go 구현체는 런타임 [1]종속성이 없습니다.
  2. ^ 윈도우즈, 리눅스macOS포함합니다.Go 구현은 Go가 [1]지원되는 모든 플랫폼에서 컴파일할 수 있습니다.
  3. ^ jq의 C 구현체는 ICU 라이센스로 라이센스가 부여된 decNumber라는 소수 부동 소수점 라이브러리와 BSD [1]라이센스가 부여된 Oniguruma regex 라이브러리를 사용합니다.

레퍼런스

서지학

  • Janssens, Jeroen (2021). Data Science at the Command Line. O'Reilly Media. ISBN 9781492087885.
  • Janssens, Jeroen (2014). Data Science at the Command Line: Facing the Future with Time-Tested Tools. O'Reilly Media. ISBN 9781491947807.
  • Marrs, Tom (2017). JSON at Work: Practical Data Integration for the Web. O'Reilly Media. ISBN 9781491982419.

다른이들

  1. ^ a b c "Download jq". jq. Retrieved January 6, 2023.
  2. ^ "jaq". jaq. Retrieved March 11, 2023.
  3. ^ Färber, Michael (2023). "Denotational Semantics and a fast interpreter for jq". arXiv:2302.10576 [cs.LO].
  4. ^ Jansens 2014.
  5. ^ "jq". jq. Retrieved January 6, 2023.
  6. ^ "like sed". Archived from the original on 2013-04-14.
  7. ^ "Release v2.0.0 · kislyuk/yq". GitHub.
  8. ^ "Release v0.0.1 · itchyny/gojq". GitHub.
  9. ^ "Tutorial". jq. Retrieved January 6, 2023.
  10. ^ "sqlite_jq". GitHub.
  11. ^ "FAQ". GitHub.
  12. ^ "Manual". jq. Retrieved January 6, 2023.
  13. ^ "PEG". PEG.

외부 링크