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

習うより慣れる Ruby AST / Ruby AST is better to get used to than to learn.

習うより慣れる Ruby AST / Ruby AST is better to get used to than to learn.

omotesando.rb#94 で発表したスライドです。
https://omotesandorb.connpass.com/event/308359/

rubocop-ast.wasm
https://rubocop-ast-wasm.vercel.app/

Shintani Teppei

February 01, 2024
Tweet

More Decks by Shintani Teppei

Other Decks in Programming

Transcript

  1. 自己紹介 新谷 哲平(@euglena1215) • 株式会社タイミー • バックエンドエンジニア • ホットなGemは packwerk

    • すき焼きのたれで肉じゃがを 作れることを知ってずっと作ってます
  2. AST = Abstract Syntax Tree(抽象構文木) 例えば、右の図だと 2 * (1 +

    3) に対応している。 Ruby プログラムを意味のあるかたまりごと(トーク ン)でツリー構造に変換したものが Ruby AST。 Ruby AST とは
  3. AST = Abstract Syntax Tree(抽象構文木) 例えば、右の図だと 2 * (1 +

    3) に対応している。 Ruby プログラムを意味のあるかたまりごと(トーク ン)でツリー構造に変換したものが Ruby AST。 Ruby AST とは 今回は直感的に理解するのが目的なので、 Ruby プログラムをツリー構造で表すなにかくらいの理解で大丈夫。 (説明しすぎると自分の理解にボロが出るという話もある)
  4. • Ruby プログラムを機械が解釈できるようにする ◦ ソースコードはあくまで文字列なので、文字列を解釈可能なものに変換する必要がある。 • RuboCop ◦ Ruby プログラムを

    Ruby AST に変換して、あらかじめ用意しておいた違反しているツリー構 造と一致しているかどうかをパターンマッチして警告を出している。 ◦ RuboCop のルールを作ること = Ruby AST のパターンマッチを書くこと Ruby AST がどんなところで使われているか
  5. • Ruby プログラムを機械が解釈できるようにする ◦ ソースコードはあくまで文字列なので、文字列を解釈可能なものに変換する必要がある。 • RuboCop ◦ Ruby プログラムを

    Ruby AST に変換して、あらかじめ用意しておいた違反しているツリー構 造と一致しているかどうかをパターンマッチして警告を出している。 ◦ RuboCop のルールを作ること = Ruby AST のパターンマッチを書くこと • Packwerk(ここの紹介は割愛する予定) ◦ 他言語にあるようなパッケージを仮想的に作り、他パッケージで宣言されている定数やクラス を自パッケージで参照しているかどうかをチェックし、予期しない依存関係があれば警告を出 すのが Packwerk。 ◦ パッケージ内での定数・クラスの宣言、定数・クラスの参照は Ruby プログラムを Ruby AST に変換した上で集計している。 Ruby AST がどんなところで使われているか
  6. メソッド呼び出し〜ローカル変数を宣言する〜 some_obj をローカル変数として定義したらどうなるか確認する。 lvar は local variable で、既に宣言されているローカル変数 some_obj を

    参照している。 1つ前では some_obj はメソッド呼び出しとして評価されていたけど、今回は ローカル変数として評価されるようになった。
  7. ちょっと宣伝 AST をちょっと触ってみるためのツールとして以前 Web ツールを作ったので 宣伝します。 Ruby プログラムがどんな AST になるのかパッと確認したり、逆に

    AST に対し てどんな Ruby プログラムがマッチするのかを確認できます。 「rubocop ast wasm」で検索 https://rubocop-ast-wasm.vercel.app/