2P by neo 9일전 | favorite | 댓글 1개
  • 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의 이름이 좋다고 생각하며, 더 빠르게 만들 수 있는 방법이 있다고 함

    • 도구가 이전 실행의 상태를 의도적으로 유지하지 않는다고 설명함