-
Ninjaの成功と失敗
- 約9年前、筆者はMakeに似たビルドシステムであるNinjaを公開した。最初は気恥ずかしかったが、今では広く使われている。
- Ninjaを使う主要なプロジェクトには、Chrome、Android、Mesonプロジェクトなどがある。
- Ninjaは筆者にとって最も成功したオープンソースプロジェクトで、2011年に公開し、2014年に所有権を引き継ぎ、現在は3人目のメンテナに受け継がれている。
- プログラミングではコードを書くことよりアーキテクチャが重要であり、さらにアーキテクチャより社会的な問題のほうが重要だということを学んだ。
-
技術的詳細
- 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のメンテナたちと貢献者たちに感謝の言葉を述べている.
1件のコメント
Hacker Newsの意見
プログラミングではコードを書くことよりアーキテクチャが重要であり、さらにアーキテクチャより社会的な問題のほうが重要だという意見がある
AndroidのビルドシステムではNinjaの役割が大きい
Googleがレイテンシに関する研究を進めており、その研究が公開されることを望む意見がある
CMakeを使う際、C++20モジュールにはNinjaが必要なため、しばらくは使われ続けるだろうという意見がある
Ninjaの代わりにSamuraiへ移行し、あらゆる面で改善されたという
正確性と利便性、性能の間にはトレードオフが必要であり、意図的に選択すべきだという意見がある
ビルドシステムの経験があり、Ninjaは好きなプログラミング言語で実装できるほど小さいという
Ninjaという名前は良いと思っており、さらに高速化する方法があるという