Clippyにcontributeするn個の理由

lapla

https://slide.lapla.dev/external/osakirs-4(.pdf)
whoami
whoami
  • Rustで書いたものたち
    • cattleya: ELFファイルを難読化するCLIツール
    • rustegex: 正規表現エンジン,3つの実装アプローチ
    • amia: RISC-V 64bitで動作するvirtio-netドライバが載ったOS
    • etc...
Intro: 本発表の目的
  • 発表者はここ数カ月Rustの公式linterであるClippyにパッチを日常的に投げている
  • 最近だと日常的にClippyにパッチを投げている日本人はほぼいない
    • (と思っている)
    • (なんなら1人ではと思っている)
よって自分が何故このような行動をしているのか
その動機などについて話したい
Intro: Clippy
  • ClippyはRustのコードを解析して,潜在的な問題を指摘する言語公式のlinter
  • lintルールが個別に定義されていていて,各ルールに引っかかると指摘が飛ぶ
  • lintルールによっては,修正後のコードも提案する
    • 「この部分が問題ですよ~」の指摘にとどまらず,「この部分が問題なので,こう書くと良いですよ~」の提案をする
理由1: コンパイルと密になっている
  • 本来lintという行為はコンパイルと相性が良い
    • AST(抽象構文木)などをコンパイラとlinterで別々に持つのは無駄だから
      • 特にRustのような中間表現を介する言語を対象とするならなおさら
    • だからコンパイラ(rustc)にも小さなlinterが入っている
      • Clippyはrustcがカバーしない範囲を(前衛的に)カバーする(前衛的という自覚はあるらしい)
理由1: コンパイルと密になっている

ところで...

  • 真に"良い"Rustのコードを書くにはコンパイラの内部構造を知っていると良い場合がある
    • 「内部的には各トークンはどの様な単位で分割されている?」
    • 「asyncはどのレイヤーでどの様に脱糖される?」
  • いきなりコンパイラのソースを読むのは大変...
  • ClippyはrustcとASTやHIRなどを共有している & 本質的には賢いパターンマッチ
コンパイラの内部構造を把握しやすくなる
理由2: 言語機能のキャッチアップに適する
  • Clippyは言語公式のもの
    • issueには安定化前の言語機能についての要望も出される
    • 変な書き方をしたりしてバグった例も出される
  • lintルールが細かく分かれているので,ユースケースに応じてベストプラクティスを学びやすい
より効率的な・ミスのないコードを
古くない書き方で書く能力が上がる
理由3: 世界中のRustコードのメタ的な効率化
  • lintはメタ的な行為
    • アプリケーションコードが存在して,それに対して指摘を行う
  • Clippyは広く使われているので,例えば「こう書くことでパフォーマンスが上がる」類のlintルールを実装すると,それに基づいて世界中のRustアプリケーションを速くすることができる(!)
    • 詳細は割愛するが,以前特定の処理を10倍程度速くするlintルールを実装したことがある
  • コードスタイル等に関するlintの改善をすると,コンパイラのレイヤーではできない効率化も可能
メタ的な視点から世界中のアプリケーションに影響を与えられる
けど...
「利点があるのは分かったけど,敷居が高いんだよね~🤔」
けど...
「利点があるのは分かったけど,敷居が高いんだよね~🤔」

そんなことないですよ!!!ってことを言う記事を書きました

話したりないこと
  • Clippy,その欠点
  • 他の検査ツールとの比較
  • Rustのエコシステムとの関わり
  • etc...
一家言などある方はぜひ懇親会などで...!
おまけ: 一石二鳥
  • ClippyのリポジトリRust本体のリポジトリと分けられている
  • しかし,(実は)ClippyはRustのリポジトリのsubtree
    • 大体2週間に1度のペースでsyncが行われる
  • よってClippyにコミットを積んでいるとRust本体のリポジトリにもコミットがいつの間にか積まれている1^1

1: こういったリポジトリは他にもあります.ここを見ると分かりやすいです