こんにちは、テックフィード白石です。
日本のエンジニア界隈をリードするエキスパートに、テクノロジーの最前線を語っていただくYouTube動画連載「Ask the Expert」の新着動画が公開されました!
今回は、Emacsのエキスパートうさみけんた(tadsan)さんに、Emacsの最新動向について詳しく伺ってきました。

うさみけんた(tadsan)さんのアカウントをぜひフォローしましょう!
うさみけんた(tadsan)さん(Emacs Lisper)
ついでに白石のもフォロー推奨:
聞き手: テックフィード白石
以下に掲載するのは、インタビュー動画の内容の要約です(正確な書き起こしではありません)。
内容をフルにご覧になりたい方は、ぜひ動画をご視聴ください。
(ご質問、ご感想などはYouTubeのコメント、もしくはこの記事のコメント欄でも受け付けております)
マシン語へのコンパイルが可能に
tadsan:Emacsは30年以上の歴史のあるエディターですが、今でも継続的に開発されています。
最近の目玉機能としては、 ネイティブコンパイル、つまりCPUやOSに特化した実行ファイルにコンパイルすることで効率よく実行できる機能が正式に入りました 。Emacs Lispはインタプリターなのでパフォーマンスがあまり良くないという特徴がありましたが、今後はかなり高速に動作する環境が整いつつあります。

白石:これはLispコードをすべてマシン語にコンパイルするということですか?
tadsan:そうです。私が開発しているphp-modeというEmacs拡張でも、正規表現マッチでかなりCPUを使う処理がありましたが、ネイティブコンパイルでかなり最適化されました。巨大なファイルを編集する時でも、ストレスを感じにくくなりました。

白石:今までも一応コンパイルはありましたよね?
tadsan:いわゆるバイトコンパイルですね。
事前に構文解析をしておいてバイトコード化しておくことで、かなり効率的に動いてはいたんですけれども、今回の最適化で、バイトコードをマシン語にコンパイルするようになりました。
ここらへんは開発者が論文も出していたり、とても面白いトピックだと思います。
白石:面白そうですね。ちなみにそういうことができるようになったということは、Emacs全体、全てのLispコードがネイティブ化されているということですか?
tadsan: はい、全部ですね 。元が動的言語なので、C言語並に速くはなりませんが、それでも今までのバイトコードより数倍速い場合が多いと思います。

Tree-sitter ー 編集中のソースコードを構文解析
白石: では次の話題です。Tree-sitterというツールについてご紹介頂けるとのことですが、それはどのようなものですか?
tadsan: Tree-sitterは、編集中のソースコードを構文解析するためのライブラリ です。
編集中のプログラムのコードって、カッコが不統一だったり、ダブルクォートが入力途中だったり、メソッド名も不完全だったり…と必ずシンタックスエラーがある状態だと思います。
Tree-sitterはそういった入力途中みたいなものを前提にしつつ、文脈を読んで構文解析をしやすいパーサーを作るためのツールで、それをもとにいろいろなプログラミング言語のパーサーが開発されています。
ツール自体は共通のインターフェースになっていて、EmacsでもこのTree-sitterを使っていこうという流れが最近できています。

白石:今までも、Emacsでは入力途中に補完されたりエラーが表示されたりしていましたよね。このTree-sitterに移行することによって、さらに進化したり速くなったりするんですか?
tadsan:そうですね。例えばphp-modeでは、「今はif文の中」「今はswitch文の中」みたいなものを検出するのに、正規表現の処理を何百個も実行してその現在値を特定する みたいなことをやるのでCPUの負荷が高いんです。
でも今後は、コードのパース処理をTree-sitter製のライブラリに置き換えることで、正規表現を使ったヒューリスティックなパースよりも、速くて安定したものになるんじゃないかと思います。
商用レベルの静的解析ツール、PHPStan
白石: 最後はPHPStanというツールについてご紹介頂けるとのことですね。PHPStanとはどのようなものでしょう?
tadsan:PHPStanは、最近人気が出てきた静的解析ツールです。
これまでは、テキストエディターによる静的解析、それをもとにした入力補完やエラー検出などの点では、PHPStormなどの有料製品に遅れを取っているような状態だったんです。
でも、この2018年以降、いくつかPHP向けの(オープンソースの)静的解析ツールが登場しました。PHPStanもその1つです。
こうしたツールをEmacsや他のテキストエディターやPhpStormと組み合わせることで、 有料の環境にも引けを取らないような効率的な編集 や、製品の品質を保ったままの開発ができる体制が作れるようになってきています。
私もコントリビューターとして機能や修正を提案したり、日本語のコミュニティやカンファレンスでPHPStanの説明や布教をしたりしているところです。

白石:これ自体はEmacs専用ではなくて、PHPの構文解析をして解析をするというライブラリなんですね?それをEmacsから呼び出すんですか。
tadsan:はい。例えばPHPStanを呼び出すと、「どこのファイルの何行目に問題がある」というのをすぐに出してくれます。それを、こちらの画面真ん中にあるように、ユーザーに知らせていけばいい。

白石:ちなみに、 Emacsと繋ぎ込みのところはtadsanがもうほとんどメインで開発されている?あと、PHPStan自体にもコントリビュートしてらっしゃる?
tadsan: はい、そうです。
白石: すごい…!