Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Rustの手続きマクロで黒魔術入門

 Rustの手続きマクロで黒魔術入門

Rustの手続きマクロについて紹介します。そして、自作関数手続きマクロである direct_c_lang についても紹介します。

lemolatoon

March 11, 2023
Tweet

More Decks by lemolatoon

Other Decks in Programming

Transcript

  1. Rustの手続きマクロで黒魔術入門
    lemolatoon

    View Slide

  2. 自己紹介
     慶應義塾大学 理工学部1年
     セキュリティ・キャンプ2022 Cコンパイラゼミ修了生
     Twitter (@lemolatoon1)
    (このスライドは上記アカウントでツイートしています)
    2

    View Slide

  3. “Rustの手続きマクロ”って?
     Rustを書くときによく見る手続きマクロの例
    1) deriveマクロ
    2) attributeマクロ
    3
     ソースコードを受け取って、ソースコードを返すようなプログラミング言語Rustの特殊な関数
    3) 関数マクロ

    View Slide

  4. 自由度の高い関数手続きマクロ
    4
    * カッコの対応などは入力時点で正しい必要がある
    関数手続きマクロは正しいRustのコードを出力すれば、
    どんな入力*でも受け付ける。

    View Slide

  5. 自作関数手続きマクロ direct_c_lang の紹介
    5
    https://github.com/lemolatoon/direct_c_lang_rs.git
     C言語のコードを受け取り、Rustから呼べるインターフェースを提供する。
    (下記は実際に使っている例 )
    Rust側からマクロ内で定義されたC言語
    で書かれた関数を呼び出している。
    (4~10行)
    C言語のソースコードをマクロに渡し
    ている。
    (12~25行)

    View Slide

  6. 自作関数手続きマクロ direct_c_lang の紹介(マクロの展開)
    6
    ◼マクロの入力を global_asmマクロ+C言語側の関数 の宣言へ変換
    ◼マクロ内部で自作Cコンパイラを使っている
    ◼マクロ展開前 ◼マクロ展開後

    View Slide

  7. 実際の手続きマクロの中身
    7
    * https://github.com/lemolatoon/direct_c_lang_rs.git
     マクロの変換前から、マクロの変換後の処理自体をRustでかける。
    中略(Cの関数をRustの宣言に変換)
    マクロの入力として与えられ
    たC言語のソースコードを
    アセンブリに変換
    マクロの出力(展開先)を関
    数の戻り値として返す

    View Slide

  8. まとめ
    Rustの手続きマクロは自由度が高い上に、マクロ処理自体をRustでかけるため、
    C/C++のような複雑性が生じにくい
    自由度を生かして自分の独自のマクロを作ると楽しい
    「書けばいいことは明確になったけど、これ全部手で書かなきゃいけないのか
    ……」といったときに便利
    8

    View Slide

  9. ありがとうございました
    9

    View Slide