hirapi's blog

ちゃんとしたふりをする

builderscon tokyo 2018 聴講メモ #4「lld − 開発ツールの主要コンポーネントの1つをスクラッチから作成した話」by Rui Ueyamaさん

(スライド公開されたら貼らせていただきます)

※ 以下は私個人の解釈を多大に含んだメモ書きです。正確な講演内容はスライドか、もしくはYouTubeで公開される(?)公式動画をご覧ください。

lld − 開発ツールの主要コンポーネントの1つをスクラッチから作成した話

@rui314

テーマ

  1. lldの紹介
  2. 開発を始めた経緯
  3. 速くてシンプルなコードを書くためのポイント
  4. 具体的な高速化のテクニック

テイクホームメッセージ

  • 問題についてよく考えて、自分が良いと思うやり方を勇気をもって試してみよう
    仮にアンチパターンであっても
  • 存在しない問題を作り出さない。もともとの問題を直接解決できないのか、をよく考えよう
  • Unixの開発環境の標準リンカになる」という大きな目標も、誰も挑戦しないだけで意外と実現可能だったりするので、挑戦してみよう

内容

  • リンカ:オブジェクトファイルを1つの実行ファイル・DSOにまとめるもの
  • 何もしないプログラムのソースコードを、既存のリンカに入れて、出力されたバイナリを印刷して読んだ
    → 1bitだけ変えてみたりして理解していった。
  • 当時、Linux, Windows, mac OS すべてファイル形式違うのにひとつのリンカでやっていた
    → スクラッチで書き直し。Windowsだけターゲットとするようにした
    • 「書き直したくなる気持ちはわかるけど」「リファクタリングでいいのでは」などの意見
      → 無視して書いたら10倍早くなった。 いちいち対応してると 無い問題を解決しようとすることになる
    • 遅いプログラムを構造によって早くすることはできないが、構造によって自然と早いプログラムが書ける
      構造が先、コードは後
  • 他の人が、同じデザインでLinuxのリンカを作った → 4バージョンに対応することに
    • デザイン構造は共有するが、ソースコードは共有しない
      アンチパターンのように見えるが、トータルで見ると早い
      最適化する箇所を最小限にする
  • OSSとして、オーナーシップを持っておく
    • 1回しかコントリビュートしない人が、自分の(狭いスコープで)達成したいことのためにプルリクを出してくる
      → 送ること自体は良いが、それを取り入れるかはオーナーが判断する
      きれいなコードはオーナーが保つ
  • 2回書く ← 1回目から学ぶ。できれば3回書く

質疑

  • 「コードを2, 3回書き直してみる」:最初のコードに引きずられそう
    1回目書いてるときに思った「ここをこうしてみたら」を次に実践してみる、思いつくものは全部試す感じ。
    しっくりくるものを探す。
  • 「コードを共有しない」:改修コストがある反面、共通化するとif文が増えたりする。どう選んだ?
    勘です。
  • 次の目標は
    Linuxディストリビューション全体が10秒でビルドされる、とか?w

カーゴ・カルト・プログラミングはやらない。
80年代に決められたデフォルト値に従う理由は無い。

感想

さいしょわかんないとこ来ちゃったーと思いながら聞いてて、終わったときにはエンジニアとして何かを叩き起こされたような感じで、まだうまく言葉にできない……。
すごく素敵なセッションだった。動画公開されたらまた改めて聴いてみる。それでできれば改めてまとめてみる。