$30 off During Our Annual Pro Sale. View Details »

cybozu-labs-youth-10th

Drumato
March 30, 2021

 cybozu-labs-youth-10th

第10期ラボユース成果発表会での発表資料.
https://labs.cybozu.co.jp/en/

Drumato

March 30, 2021
Tweet

More Decks by Drumato

Other Decks in Programming

Transcript

  1. x64/aarch64コンパイラを含む
    ミニツールチェーン+αの開発
    第10期ラボユース成果発表会
    言語処理系ゼミ 菅原大和/Drumato

    View Slide

  2. 一年間まとめ
    ● x86_64/AArch64コードの生成ができるコンパイラを設計/実装した
    ○ 生成コードの効率は悪いが,Typed ASTという中間表現を用いてシンプル
    ● x86_64用のELFを生成するミニツールチェーンを実装した
    ○ 上記コンパイラ+アセンブラ/リンカが協調動作する
    ● 高い抽象度を持たせたRust用ELFライブラリを開発した
    ● 上記ライブラリでTUI版readelfを実装した
    ● 既存のリンカスクリプトの欠点を考察し,一つのアイデアを提案した
    ○ 後ほど解説

    View Slide

  3. 目次
    ● デモ
    ● 一年間で達成できた目標/できなかった目標
    ● Linker Script Generatorについて
    ● これからの目標

    View Slide

  4. DEMO1: ツールチェーンの動作
    (6/9時点の画像)

    View Slide

  5. View Slide

  6. DEMO2:TUI版readelfでの解析

    View Slide

  7. View Slide

  8. 一年間で達成できた目標#実装物
    ● 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(ただしプロトタイプ)
    ○ これについては後述

    View Slide

  9. 一年間で達成できなかった目標
    ● コンパイラのアーキテクチャは結局初歩的なものだった
    ○ スタックマシン実装であり,生成コードの効率は非常に悪い
    ○ SecHack365参加時はなんちゃってレジスタマシン実装だったが,よっぽど速い
    ○ 最適化パスは実装できなかった
    ● 作りたかった言語機能のいくつかを保留にした
    ○ Arena Allocatorのような標準ライブラリ
    ○ RustのEnumやZigのtagged unionのような機能
    ○ Goのような言語組み込みのテストフレームワーク

    View Slide

  10. 活動2ヶ月後に
    とりあえず
    "最小の自作ツールチェーン"は
    達成した

    View Slide

  11. まだまだ開発することは沢山ある
    (動的リンカ/言語拡張/LTO/etc)

    View Slide

  12. ところで,他になにか
    "新しいこと"はできないか?

    View Slide

  13. アイデア:
    Linker Script Generatorについて

    View Slide

  14. Linker Script Generator#background
    ● 既存のリンカはconfiguration interfaceにリンカスクリプトを用意
    ● リンカスクリプトは重要かつ便利だが,学習コストが高い
    ○ 特に日本語のドキュメントは少なく,理解しづらい
    ● section size/location pointerの計算など,ある程度表現力を持つ
    ○ yamlなどの(学習コストが低くて)読みやすい形式では代替できない
    ○ "スクリプト"の機能がなければならない

    View Slide

  15. Pythonライブラリを動かして
    configを"生成"できないか?

    View Slide

  16. Linker Script Generator#proposal in Python
    ● 新たに文法を覚える必要はない
    ○ 普通のPythonライブラリを使ったコーディング
    ● Pythonの計算を経由して,最終的に数値がハードコードされたyamlを生成
    ○ 出力フォーマットを指定でき,リンカスクリプトのフォーマットも吐ける
    ■ 既存リンカ/自作リンカのどちらでも役立つ
    ● 別にPythonじゃなくても,"スクリプト"レベルのフットワークで書ければ良い

    View Slide

  17. Linker Script Generator#proposal in Python
    ● 現状はほぼプロトタイプであり,机上の空論
    ● 鋭意実装中
    ○ elf-parserとfile-translator, リンカスクリプトの仕様に即した計算機能

    View Slide

  18. View Slide

  19. 成果発表後の目標

    View Slide

  20. これからの目標(一部)
    ● elf-utilitiesはRustで一番使われるELFライブラリを目指したい
    ● elfpeachにも高級な機能を用意したい
    ○ e.g. シンボルテーブルのフィルタリング機能
    ● 最適化コンパイラの理論と実装
    ○ まずはx64のバックエンドだけを変更する
    ● py-linkageはGNU ldのデフォルトスクリプトを置き換えられるぐらいの規模
    がほしい

    View Slide

  21. 最後に
    ● メンターの方々には多くの助言を頂きました
    ○ 特に川合さんにはラボユース活動自体の紹介もしていただきました
    ● ユース生/研究生の皆さんの活動が励みになりました
    ○ xxさんも頑張ってるし,私も頑張ろう
    ここで改めてお礼させていただきます
    一年間(以上)ありがとうございました!

    View Slide