Rustの手続きマクロについて紹介します。そして、自作関数手続きマクロである direct_c_lang についても紹介します。
Rustの手続きマクロで黒魔術入門lemolatoon
View Slide
自己紹介 慶應義塾大学 理工学部1年 セキュリティ・キャンプ2022 Cコンパイラゼミ修了生 Twitter (@lemolatoon1)(このスライドは上記アカウントでツイートしています)2
“Rustの手続きマクロ”って? Rustを書くときによく見る手続きマクロの例1) deriveマクロ2) attributeマクロ3 ソースコードを受け取って、ソースコードを返すようなプログラミング言語Rustの特殊な関数3) 関数マクロ
自由度の高い関数手続きマクロ4* カッコの対応などは入力時点で正しい必要がある関数手続きマクロは正しいRustのコードを出力すれば、どんな入力*でも受け付ける。
自作関数手続きマクロ direct_c_lang の紹介5https://github.com/lemolatoon/direct_c_lang_rs.git C言語のコードを受け取り、Rustから呼べるインターフェースを提供する。(下記は実際に使っている例 )Rust側からマクロ内で定義されたC言語で書かれた関数を呼び出している。(4~10行)C言語のソースコードをマクロに渡している。(12~25行)
自作関数手続きマクロ direct_c_lang の紹介(マクロの展開)6◼マクロの入力を global_asmマクロ+C言語側の関数 の宣言へ変換◼マクロ内部で自作Cコンパイラを使っている◼マクロ展開前 ◼マクロ展開後
実際の手続きマクロの中身7* https://github.com/lemolatoon/direct_c_lang_rs.git マクロの変換前から、マクロの変換後の処理自体をRustでかける。中略(Cの関数をRustの宣言に変換)マクロの入力として与えられたC言語のソースコードをアセンブリに変換マクロの出力(展開先)を関数の戻り値として返す
まとめRustの手続きマクロは自由度が高い上に、マクロ処理自体をRustでかけるため、C/C++のような複雑性が生じにくい自由度を生かして自分の独自のマクロを作ると楽しい「書けばいいことは明確になったけど、これ全部手で書かなきゃいけないのか……」といったときに便利8
ありがとうございました9