第10期ラボユース成果発表会での発表資料. https://labs.cybozu.co.jp/en/
x64/aarch64コンパイラを含むミニツールチェーン+αの開発第10期ラボユース成果発表会言語処理系ゼミ 菅原大和/Drumato
View Slide
一年間まとめ● x86_64/AArch64コードの生成ができるコンパイラを設計/実装した○ 生成コードの効率は悪いが,Typed ASTという中間表現を用いてシンプル● x86_64用のELFを生成するミニツールチェーンを実装した○ 上記コンパイラ+アセンブラ/リンカが協調動作する● 高い抽象度を持たせたRust用ELFライブラリを開発した● 上記ライブラリでTUI版readelfを実装した● 既存のリンカスクリプトの欠点を考察し,一つのアイデアを提案した○ 後ほど解説
目次● デモ● 一年間で達成できた目標/できなかった目標● Linker Script Generatorについて● これからの目標
DEMO1: ツールチェーンの動作(6/9時点の画像)
DEMO2:TUI版readelfでの解析
一年間で達成できた目標#実装物● peachili … 自作言語とそれをサポートするコンパイラ○ アセンブラとリンカをシンプルにするため,Bundlerが動いて依存関係を解決しグラフを構築○ 複数のファイルで構成されたPeachiliコードから,最終的に単一のアセンブリファイルを生成● asmpeach … x86_64のアセンブラ○ 構成としては,アセンブリファイルのパーサ/命令の変換/オブジェクトファイルの生成● pld … x86_64のstatic linker● elf-utilities … RustでELFをスマートに使えるライブラリ○ できるだけスマートに使えるように多くを抽象化している■ ex. セクション追加時にユーザがehdr.e_shnumをインクリメントしなくていい等● elfpeach … TUIで操作できるreadelf○ これも最低限の機能しか持っておらず,実質プロトタイプ● py-linkage … Linker Script Generator(ただしプロトタイプ)○ これについては後述
一年間で達成できなかった目標● コンパイラのアーキテクチャは結局初歩的なものだった○ スタックマシン実装であり,生成コードの効率は非常に悪い○ SecHack365参加時はなんちゃってレジスタマシン実装だったが,よっぽど速い○ 最適化パスは実装できなかった● 作りたかった言語機能のいくつかを保留にした○ Arena Allocatorのような標準ライブラリ○ RustのEnumやZigのtagged unionのような機能○ Goのような言語組み込みのテストフレームワーク
活動2ヶ月後にとりあえず"最小の自作ツールチェーン"は達成した
まだまだ開発することは沢山ある(動的リンカ/言語拡張/LTO/etc)
ところで,他になにか"新しいこと"はできないか?
アイデア:Linker Script Generatorについて
Linker Script Generator#background● 既存のリンカはconfiguration interfaceにリンカスクリプトを用意● リンカスクリプトは重要かつ便利だが,学習コストが高い○ 特に日本語のドキュメントは少なく,理解しづらい● section size/location pointerの計算など,ある程度表現力を持つ○ yamlなどの(学習コストが低くて)読みやすい形式では代替できない○ "スクリプト"の機能がなければならない
Pythonライブラリを動かしてconfigを"生成"できないか?
Linker Script Generator#proposal in Python● 新たに文法を覚える必要はない○ 普通のPythonライブラリを使ったコーディング● Pythonの計算を経由して,最終的に数値がハードコードされたyamlを生成○ 出力フォーマットを指定でき,リンカスクリプトのフォーマットも吐ける■ 既存リンカ/自作リンカのどちらでも役立つ● 別にPythonじゃなくても,"スクリプト"レベルのフットワークで書ければ良い
Linker Script Generator#proposal in Python● 現状はほぼプロトタイプであり,机上の空論● 鋭意実装中○ elf-parserとfile-translator, リンカスクリプトの仕様に即した計算機能
成果発表後の目標
これからの目標(一部)● elf-utilitiesはRustで一番使われるELFライブラリを目指したい● elfpeachにも高級な機能を用意したい○ e.g. シンボルテーブルのフィルタリング機能● 最適化コンパイラの理論と実装○ まずはx64のバックエンドだけを変更する● py-linkageはGNU ldのデフォルトスクリプトを置き換えられるぐらいの規模がほしい
最後に● メンターの方々には多くの助言を頂きました○ 特に川合さんにはラボユース活動自体の紹介もしていただきました● ユース生/研究生の皆さんの活動が励みになりました○ xxさんも頑張ってるし,私も頑張ろうここで改めてお礼させていただきます一年間(以上)ありがとうございました!