GN⁺: 닌자(2020)의 성공과 실패
(neugierig.org)-
Ninja의 성공과 실패
- 약 9년 전, 필자는 Make와 유사한 빌드 시스템인 Ninja를 발표했음. 초기에는 부끄러웠지만, 현재는 널리 사용되고 있음.
- Ninja를 사용하는 주요 프로젝트로는 Chrome, Android, Meson 프로젝트 등이 있음.
- Ninja는 필자의 가장 성공적인 오픈 소스 프로젝트로, 2011년에 발표하고 2014년에 소유권을 넘겼으며, 현재는 세 번째 유지보수자에게 전달되었음.
- 프로그래밍은 코드 작성보다 아키텍처가 중요하며, 아키텍처보다 사회적 문제가 더 중요하다는 것을 배웠음.
-
기술적 세부사항
- Ninja는 주어진 요구사항에 따라 명령을 실행하는 간단한 시스템임.
- Ninja는
ninja.build
파일을 받아 파일의 수정 시간을 확인하고 필요한 명령을 병렬로 실행함. - Make와 비교했을 때, Ninja는 입력 빌드 언어의 기능이 적고, 빠른 실행에 중점을 둠.
- Ninja는 입력 파일 경로를 메모리 객체로 매핑하여 경로 비교를 최적화함.
-
아키텍처 노트
- Ninja의 그래프 표현은 파일과 명령 사이의 이분 그래프를 사용하여 빌드 구조를 더 잘 캡처함.
- C 헤더 종속성을 처리하기 위해 추가적인 종속성 데이터를 사용함.
- Ninja는 비영구적인 데몬 프로세스가 아니며, 각 실행 시 처음부터 작업을 수행함.
- 파일 상태는 커널이 이미 캐시하고 있어 사용자 영역에서 다시 캐시할 필요가 거의 없음.
- Ninja는 Chrome의 빌드를 기반으로 설계되었으며, 대규모 프로젝트에서 확장성 문제를 겪고 있음.
-
'어셈블러' 은유
- Ninja는 다양한 빌드 시스템의 기능을 구현하지 않고, 액션 그래프만 구현하여 사용자가 다른 생성기 프로그램을 선택하도록 함.
- 이 설계는 Ninja를 빠르고 유연하게 만듦.
-
기본값의 중요성
- Ninja는 기본적으로 명령을 병렬로 실행하여, Make보다 더 안전하게 병렬 빌드를 수행함.
-
속도
- Ninja는 대규모 코드베이스의 증분 빌드 성능에 중점을 두었으며, 사용자 만족도에 큰 영향을 미침.
- Ninja는 CPU를 적게 사용하여 전체 빌드 성능도 개선됨.
-
CMake
- Ninja는 CMake와 잘 통합되었으며, 이 통합을 통해 LLVM 작업에 사용됨.
-
Windows 지원
- Ninja는 Windows에서도 작동하며, 많은 초기 사용자가 Windows 사용자였음.
-
관련 작업
- Ninja의 설계는 Google의 빌드 시스템인 blaze/bazel에서 영감을 받았음.
-
오픈 소스 유지보수
- 오픈 소스 유지보수는 즐겁지 않으며, 사용자로부터의 요구와 비판이 많았음.
- 필자는 소프트웨어를 통해 동료 해커들에게 인상을 주고자 함.
-
최종 감사
- Ninja의 유지보수자들과 기여자들에게 감사의 말을 전함.
Hacker News 의견
-
프로그래밍은 코드 작성보다 아키텍처가 중요하고, 아키텍처보다 사회적 이슈가 더 중요하다는 의견이 있음
- 이는 오랫동안 마음속에 있던 생각을 잘 표현한 것이라고 함
-
Android의 빌드 시스템에서 Ninja의 역할이 큼
- 초기에는 makefiles를 사용했으나, soong이라는 커스텀 선언적 빌드 시스템으로 복잡해졌음
- Google은 Makefiles를 Ninja 빌드 파일로 변환하는 kati를 개발했음
- Ninja로의 전환은 시간이 걸리지만, 전환 후에는 빠르게 작동함
-
Google이 지연(latency)에 대한 연구를 진행했으며, 이 연구가 공개되기를 바라는 의견이 있음
-
CMake를 사용할 때 C++20 모듈에 Ninja가 필요하기 때문에 당분간 사용될 것이라는 의견이 있음
-
Ninja 대신 Samurai로 전환했으며, 모든 면에서 개선되었다고 함
- 빌드 시스템은 모든 입력의 해시를 계산하고 레지스트리에 존재 여부를 확인하는 것이 필요하다고 생각함
-
정확성과 편리성, 성능 사이에서 타협이 필요하며, 의도적으로 선택해야 한다는 의견이 있음
- 편리성을 위해 정확성을 포기하는 도구가 더 정확한 생태계를 만들 수 있다고 함
-
빌드 시스템에 대한 경험이 있으며, Ninja는 좋아하는 프로그래밍 언어로 구현할 수 있을 만큼 작다고 함
- 자신의 빌드 시스템을 만드는 단계별 튜토리얼이 있는지 궁금하다고 함
-
Ninja의 이름이 좋다고 생각하며, 더 빠르게 만들 수 있는 방법이 있다고 함
- 도구가 이전 실행의 상태를 의도적으로 유지하지 않는다고 설명함