Slide 1

Slide 1 text

LLVMのコード自動生成機構における コード記述を支援するツールの作成 アドバイザ教員: 前田 敦司 情報学群情報科学類1年 安藤 慎

Slide 2

Slide 2 text

2024/01/16 | LLVMのコード自動生成機構におけるコード記述を支援するツールの作成 | 安藤 慎 背景 / コンパイラの基本構成 2 フロントエンド ソースコードを パース・解析 バックエンド CPUが実行可能な 機械語を出力 コンパイラ ソースコード 機械語

Slide 3

Slide 3 text

2024/01/16 | LLVMのコード自動生成機構におけるコード記述を支援するツールの作成 | 安藤 慎 背景 / LLVM: コンパイラを作るためのライブラリ ● コンパイラを作るたびにバックエンドを作るのは難しい ○ 世界では数多の種類のCPUが使われているため ○ そこでバックエンドの実装として使えるLLVMが誕生した ● C(Clang), C++(Clang), Rust, Swift, Juliaなどで使われ ている 3

Slide 4

Slide 4 text

2024/01/16 | LLVMのコード自動生成機構におけるコード記述を支援するツールの作成 | 安藤 慎 ● LLVMはCPUの情報を記述するためにTableGenを使う ○ CPUの{レジスタ, 機能, 命令}など ○ CPUに合わせて機械語を出力するために必要となる 背景 / TableGen: LLVMのコード自動生成機構(DSL) 4 例: TableGenでx86-64のレジスタを記述

Slide 5

Slide 5 text

2024/01/16 | LLVMのコード自動生成機構におけるコード記述を支援するツールの作成 | 安藤 慎 ● TableGenを書く際にエディタの支援を受けられない ○ エラーの表示、入力補完、シンタックスハイライトなど ● 現在、約57万行のTableGenコードがLLVM内に存在する ○ 57万行のプログラムをメモ帳で書くのと同じような状況 目指すこと: エディタの支援を受けながらTableGenのコードを 快適に書きたい 課題 / TableGenの開発環境が快適ではない 5

Slide 6

Slide 6 text

2024/01/16 | LLVMのコード自動生成機構におけるコード記述を支援するツールの作成 | 安藤 慎 ● エディタ支援を実装する方法として言語サーバがある ○ Microsoftが発表したLanguage Server Protocol(LSP)を 実装するサーバ ● LSPに対応したエディタならば言語サーバの機能を使うこ とができる ○ Vim, Emacs, VSCodeなどが対応している 方針 / TableGenの言語サーバを作る 6

Slide 7

Slide 7 text

2024/01/16 | LLVMのコード自動生成機構におけるコード記述を支援するツールの作成 | 安藤 慎 ● RustでTableGenの言語サーバを実装し、GitHubと Marketplaceで成果物を公開した ○ https://github.com/arata-nvm/tablegen-lsp ● 工夫した点(詳細は省略) ○ Red-Green Treeを使用しているため、不完全なソースコードを 扱うことができる ○ ソースコードのパース結果や解析結果をキャッシュしているた め、余分な処理をスキップできる ○ パーサを言語サーバと分離しているため、別のプロジェクトで再 利用できる 実装 7

Slide 8

Slide 8 text

2024/01/16 | LLVMのコード自動生成機構におけるコード記述を支援するツールの作成 | 安藤 慎 ● デモのためにVSCode向けの拡張機能を作成した ● 実装した以下の機能について、おおまかな使用例を紹介 する ○ エラーの表示 ○ シンタックスハイライト ○ 定義へ移動 / 参照へ移動 ○ ホバー時のドキュメント表示 ○ 入力補完 ○ インレイヒント 使用例 8

Slide 9

Slide 9 text

2024/01/16 | LLVMのコード自動生成機構におけるコード記述を支援するツールの作成 | 安藤 慎 使用例 / エラーの表示 9

Slide 10

Slide 10 text

2024/01/16 | LLVMのコード自動生成機構におけるコード記述を支援するツールの作成 | 安藤 慎 使用例 / シンタックスハイライト 10

Slide 11

Slide 11 text

2024/01/16 | LLVMのコード自動生成機構におけるコード記述を支援するツールの作成 | 安藤 慎 使用例 / 定義へ移動/参照へ移動 11

Slide 12

Slide 12 text

2024/01/16 | LLVMのコード自動生成機構におけるコード記述を支援するツールの作成 | 安藤 慎 使用例 / ホバー時のドキュメント表示 12

Slide 13

Slide 13 text

2024/01/16 | LLVMのコード自動生成機構におけるコード記述を支援するツールの作成 | 安藤 慎 使用例 / 入力補完 13

Slide 14

Slide 14 text

2024/01/16 | LLVMのコード自動生成機構におけるコード記述を支援するツールの作成 | 安藤 慎 使用例 / インレイヒント 14

Slide 15

Slide 15 text

2024/01/16 | LLVMのコード自動生成機構におけるコード記述を支援するツールの作成 | 安藤 慎 ● TableGenのすべての構文を処理できるようにする ○ 現在は対応していない一部の構文を無視している ● 使い勝手を改善する ○ 補完候補が表示される順番の最適化、型チェックなど ● 言語サーバーのWASM化 ○ 現在はプラットフォームごとのバイナリをバンドルしている 今後の展望 15

Slide 16

Slide 16 text

2024/01/16 | LLVMのコード自動生成機構におけるコード記述を支援するツールの作成 | 安藤 慎 ● LLVMではマシンの情報を記述するためにTableGen言語 が使われている ● TableGenをエディターで書きやすくするために言語サー バをRustで実装した ● メモ帳でプログラミングをする必要がなくなった まとめ 16