Nix를 TypeScript로 컴파일하는 jinx, nixpkgs 231,777개 속성에서 Nix와 똑같은 drvPath 재현
- jinx는 .nix 파일을 같은 값, 같은 thunk, 같은 drvPath를 내는 .ts 모듈로 바꾸는 트랜스파일러이며 nixpkgs의 231,777개 속성 전부를 컴파일함
- nixpkgs 6510408d 기준 x86_64-linux, aarch64-linux, aarch64-darwin에서 229,063개 drvPath가 Nix와 동일했고 불일치 0개, 한쪽만 실패 0개, 양쪽 다 실패 2,714개(지원하지 않는 플랫폼, broken, insecure)였음
- Nix의 지연 평가를 흉내 내려고 식을 nix.thunk(() => ...)로 감싸고, jinx 평가는 /nix/store에 아무것도 쓰지 않으며 jinx instantiate가 만든 .drv 클로저를 nix-store --realise가 빌드함
- TypeScript를 고른 이유는 도구 생태계가 넓고 유연한 타입 시스템으로 derivation의 모양과 지연 평가의 예외까지 표현할 수 있어서이며, 대신 평가 속도는 3-5배 느림
- 컴파일된 트리는 fzakaria/jinx-nixpkgs 저장소에 nixpkgs 리비전당 커밋 하나로 공개됨
Hacker News 의견들
비슷한 시도로 glistix라는 것도 있더라. 저장소 링크 남겨둠
제목에 (Nix를 TypeScript로 컴파일)이라고 좀 붙여줬으면 좋겠음. 제목만 봐선 뭘 하는 건지 감이 안 오더라
Nix 언어 배울 만한 책이 따로 있나? 찾아봤을 때 학습 자료가 꽤 빈약했던 기억이 있음
nix.dev가 꽤 괜찮음. Nix 언어 튜토리얼부터 보면 됨
책까지 필요 없음. 언어가 워낙 작아서 nixcloud.io/tour 보고, stdlib는 noogle.dev에서 찾아보면 대부분의 Nix 코드를 읽을 수 있음. 전체 생태계 입문은 nix.dev, 빌드 시스템 내부는 Nix Pills, 결국 제일 좋은 교재는 nixpkgs 자체임
nix repl로 nixpkgs에 직접 질문 던지는 게 편함. builtins.getFlake로 unstable 받아놓고 라이선스 목록에서 GPL만 골라내는 식으로 놀 수 있음
nix lsp도 있지 않냐
굳이 다른 언어로 안 가도 nix eval .# --json --apply로 원하는 형태로 뽑아서 JSON으로 처리하면 됨. Nix에서 처리하는 게 너무 느리거나 불편할 때만 언어를 바꿀 만하고, 나는 flake 업데이트 체인지로그 요약 같은 데만 다른 도구를 씀
이 글 진짜 exceptional함. HN에 이런 글 보려고 온다. 소프트웨어 폭이 플랫폼 성공을 좌우하는데, CPU 종류며 OS며 컴파일러 버전 조합이 서로 안 맞아서 autotools가 그 난장판을 풀려고 했던 역사가 있음
Fzakaria는 AI 정신증의 정반대임. AI 플로우 상태더라
Nix 파일에 14만 개 레코드, 23만 개 속성짜리 문법이 따로 있다는 건가? 그럼 가벼운 에디터가 에러를 밑줄로 짚어줄 수 있나
패키지 목록이 문법인 게 아니라 그냥 map(string, derivation)임. JS에서 x["a"]랑 x.a가 같은 것과 같은 얘기임