nikkie-ftnextの日記

イベントレポートや読書メモを発信

Lint Night #2に向けて#1のトーク「LintオタクによるLint解説」を復習するのです #dena_lint_night

はじめに

私服SHSエミリーが可愛い、nikkieです。

あっという間に8月ですね。
今週は響け!ユーフォニアムの新作が公開されますが、IT勉強会にも非常にワクワクするものが控えているんです!

目次

2023/08/04(金) Lint Night #2!!

昨年11月の#1から約9ヶ月のときを経て、第2弾の開催です!🎉

Lintに興味のあるすべての方のための勉強会 待望の第2回目

とってもよかった#1🤗

アーカイブも公開されています!👇👇

Kuniwakさん「LintオタクによるLint解説」

今回はKuniwakさんの「LintオタクによるLint解説」を復習します。

LintオタクがLintの教養(目的、特徴、構造)について話します。

以下の4点が扱われます

  • Lintとは
  • Lintの検出する問題
  • Lintの効果的な使い方
  • Lintの構造

当日話を聞きながら、「事前ブログの"静的解析のいろは"でちらっと見たところだー!」となっていました。

「LintオタクによるLint解説」再視聴メモ

15分程度の発表ですが、Lintについてざっと理解できる、とても素晴らしい発表です👏

  • KuniwakさんによるLintの定義が「プログラムの問題を 静的=プログラムを実際に実行することなく 検出するツール」(slide=7
  • Lintが検出する問題は、処理系が検出しないもの1
  • 使い方で言うと、例えば、プロジェクト内で実現された機能の誤用はLintで検出できる(slide=27
    • Lintのルールを実装する

Lintのルールを実装するための知識が「Lintの構造」パートで解説されます!
slide=30より

  • Lintの構造はどれも似通っている
  • 処理の流れも中間データが異なるだけでほとんど同じ

この2点目について、トークン列も抽象構文木も同じ流れで扱えるというのは目からウロコでした

中間データが「トークン列」か「抽象構文木」かの違いしかないんですよ!

検査の例として

  • JavaScriptのwith文を見つけたい(使用禁止)
    • トークン列からキーワードのwithを見つける
  • console.logを見つけたい

無知ゆえにトークン列の扱いと抽象構文木の扱いは全く別だと思っていた2のですが、共通の枠組みで扱えるとは!
ダニング・クルーガー効果の感はありますが、PythonのLintライブラリのソースコードが読めるかもと思い始めています。

終わりに

今週控えているLint Night #2に向けて、#1の「LintオタクによるLint解説」を復習しました。
改めて見たところ「処理の流れも中間データ(トークン列、抽象構文木)が異なるだけでほとんど同じ」という発見がありました!

今回はどんなお話が聞けるのか、当日が非常に楽しみですし、PythonのLintライブラリを覗いてみたい欲が高まっています!

P.S. flake8 (pycodestyle) のE721の関連プルリクエストを覗く

こちらの件です。

プルリクエストを覗いて驚いたのは、正規表現での実装みたいです!

https://github.com/PyCQA/pycodestyle/blob/2.11.0/pycodestyle.py#L128-L131

COMPARE_TYPE_REGEX = re.compile(
    r'[=!]=\s+type(?:\s*\(\s*([^)]*[^ )])\s*\))'
    r'|\btype(?:\s*\(\s*([^)]*[^ )])\s*\))\s+[=!]='
)

https://github.com/PyCQA/pycodestyle/blob/2.11.0/pycodestyle.py#L1451-L1470

match = COMPARE_TYPE_REGEX.search(logical_line)

  1. 処理系が静的に頑張る言語ほど、Lintが検出する問題は少なくなる(slide=11)
  2. 抽象構文木についてじわじわ素振りしています(まだまだこれから感)