Nix 언어
Nix 패키지 빌드, 개발 환경, NixOS 설정 등을 정의할 때 사용하는 언어입니다.
먼저 Nix 빠른 시작부터 따라가고, 개념 문서는 주로 보충 설명이 필요할 때 참고하기를 권합니다. 오른쪽의x를 누르면 모든 개념 문서에서 이 안내를 숨길 수 있습니다.
Nix는 Nix 패키징 시스템을 구동하는 프로그래밍 언어입니다.
왜 프로그래밍 언어입니까?
Nix에 도대체 왜 프로그래밍 언어가 필요한지 궁금하실 수 있습니다. 왜 패키지를 JSON, YAML, TOML 같은 스키마로 선언할 수는 없습니까? 그 방식의 문제는 Nix가 패키지를 설정하고 서로 조합할 수 있게 하는 방식이 동적이라는 데 있습니다. 프로그래밍 언어로서의 Nix는 일종의 “함수가 있는 JSON”이라고 생각할 수 있습니다. 모든 구문은 선언형입니다. 즉, Nix 패키지를 구성하는 순차적인 명령 흐름이 없습니다. 그 대신 속성 집합의 필드에 값을 할당하는 함수가 호출되며, 이 값은 다시 다른 값에 할당될 수 있습니다.
Nix는 어떻게 동작합니까?
Nix는 프로그래밍 언어 설계의 몇 가지 중요한 특성을 활용하여 동작합니다. 이 용어들이 무엇을 의미하고 서로 어떻게 맞물려 동작하는지 아직 익숙하지 않다면, 일부 용어는 어렵게 느껴질 수 있습니다. 그러니 먼저 다음 원칙들을 살펴봅시다.
Nix는 순수하고, 함수형이며, 지연 평가되고, 선언형이며, 재현 가능한 프로그래밍 언어입니다.
| 개념 | 설명 |
|---|---|
| 순수 | 함수가 부수 효과를 일으킬 수 없도록 하는 프로그래밍 언어 설계 개념입니다. 유일한 결과는 함수가 반환하는 값입니다 |
| 함수형 | 함수를 함수 인자로 전달하거나 결과로 반환할 수 있도록 하는 프로그래밍 언어 설계 개념입니다 |
| 지연 평가 | 함수와 데이터 컬렉션이 계산을 완료하는 데 필요해질 때까지 평가되지 않도록 하는 프로그래밍 언어 설계 개념입니다 |
| 선언형 | 결과를 어떻게 달성할지 컴퓨터에 지시하는 대신, 시스템의 결과를 기술하는 것입니다 |
| 재현 가능 | 두 번 수행한 작업이 같은 결과를 냅니다. 같은 입력은 같은 출력에 대응합니다 |
구문 기초
앞서 언급했듯이 Nix는 할당을 사용하여 패키지, 모듈 및 기타 유틸리티를 위한 데이터를 계산하고 처리합니다. 예를 들어 아래 코드는 my_function이라는 함수를 매개변수 2와 3으로 호출하고, 그 출력을 my_value 필드에 할당합니다.
{ my_value = my_function 2 3;}함수는 다음 구문으로 정의하며, 여기서 x와 y는 함수에 전달되는 속성입니다:
{ my_function = x: y: x + y;}함수 본문은 함수의 결과를 자동으로 반환합니다. 위 예제에서 볼 수 있듯이, 함수는 함수와 매개변수 사이를 공백으로 구분하여 호출합니다. 매개변수를 구분하는 데 쉼표는 필요하지 않습니다.
가장 흔히 쓰이는 두 가지 데이터 구조는 속성 집합과 리스트입니다. 속성 집합은 키-값 저장소입니다. 리스트는 서로 다른 타입의 값을 담을 수 있으며, 쉼표로 구분할 필요가 없습니다.
rec { number_key = 5; list_key = [ number_key true "Hello" ];}rec 키워드를 사용하면 속성 집합이 자기 자신을 참조할 수 있습니다.
구문에 대한 더 자세한 설명은 Nix 언어 매뉴얼 섹션을 확인하십시오.
Derivation
Nix를 다른 프로그래밍 언어와 구별 짓고 단순한 설정 언어 이상의 것으로 만들어 주는 요소는 바로 derivation 함수입니다. 이는 패키지의 빌드 과정을 정의하는 데 사용하는 내장 함수입니다. 자세한 내용은 derivation 개념 문서를 참조하십시오.