Upgrade to Pro — share decks privately, control downloads, hide ads and more …

🔨 小さなビルドシステムを作る

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.

🔨 小さなビルドシステムを作る

サイボウズ・ラボユース 夏合宿 2025 LT

Avatar for Mutsuha Asada

Mutsuha Asada

August 28, 2025
Tweet

More Decks by Mutsuha Asada

Other Decks in Programming

Transcript

  1. @momeemt @mutsuha_asada https://momee.mt 浅田 睦葉(Mutsuha Asada) 🎓 所属 ・筑波大学情報学群情報科学類 B4

    🐣 興味があること ・ビルドシステム(NixやMeson) ・サニタイザ ・コンパイラ、Language Server、プロファイラ → コンパイラツールチェーンを通じて開発者体験を向上させるこ とに興味がある 🍳 趣味 ・音楽: 羊文学、Laura day romance、カネコアヤノなど ・お笑い: シンクロニシティ、ダウ90000、ケビンスなど ・料理: https://sizu.me/momeemt に少しだけ載せてます 自己紹介 2
  2. 6 フロントエンドとバックエンド ・ビルドシステムはフロントエンドとバックエンドに分けられる  ・ツールとしては両面を担っているものもある(Nix, Bazel, ...) ・フロントエンド  ・設定やDSLを受け取って、依存グラフの解析や中間表現の生成を担う  ・例としてはMeson   ・バックエンドにNinjaを利用する

      ・表現豊かな言語から低レベルな入力に変換 ・バックエンド  ・具体的なタスク(コマンド)を実行するためのエンジン  ・例としてはNinja   ・Ninjaの入力ファイルは人間が書くことは想定しておらず、ツールが生成する
  3. 18 不動点 ・Haskellなどの再帰データ型を許す言語なら次のように表現できる  ・data Package = Package { ..., buildInputs:

    List Package } ・これは Package = F Package を解くことと同義  ・ここで、型Fは F r = { ..., buildInputs : List r } のように定義される ・ここで、Fを適用しても変わらない型Xを不動点と呼ぶ  → Package型を構成するためには、この方程式の不動点を構成する必要がある  ・再帰データ型を許す言語では不動点コンストラクタを自然に定義できる(Fix型)  ・Dhallは停止性が保証されているので再帰ができず、Fixをそのまま定義できない ・Church encodingすることで不動点を型として直接書かずに実装する
  4. 19 Church encoding ・再帰的データ構造を扱わずに再帰を表現する方法として、どのように畳み込むかに  よって表す方法がある  → Church encoding ・たとえば、自然数なら次のようにfを何回適用するかで表現できる  ・0

    = λf. λx. x  ・1 = λf. λx. f x  ・2 = λf. λx. f (f x) ・PackageをChurch encodingすると、Package = forall r (F r → r) → r  ・任意の r へのfoldを与えると、r を返す関数として表す   ・これでPackageを直接書かずに再帰を回避できた
  5. 32 まとめ ・小さなビルドシステムをDhall + Nimを使って実装した ・ビルドシステム: ソースからソフトウェアの生成物に変換するための仕組み  ・GNU make, Ninja,

    maven, Nix, Bazel, Meson, CMake, ... ・設定を受け取って依存グラフの解析や中間表現を担うフロントエンド ・具体的なタスクを実行するためのエンジンであるバックエンド ・最初にパッケージ名とビルド工程のみを持つ単純な構造体からビルド ・次に依存関係を定義; Dhallでは再帰ができないのでChurch encodingによって表現 ・最後に最終更新日時ベースのインクリメンタルビルドを実装