Rustのマクロの中にC言語を書ける「cinrs」を作った
Rustのマクロ内にCのコードをそのまま書いて呼べるライブラリ。Cコンパイラに頼らず、マクロがCをパースしてRustコードに変換する。
#なぜ今日これを選んだか
Rust+ハードウェアを目指すと、センサーのドライバやベンダーのサンプルなど「Cで書かれた資産」と必ず出会います。ふつうはbindgenとビルドスクリプトとCコンパイラで繋ぎますが、この記事はマクロだけでCをRustに取り込むという別の道を示していて、FFIとマクロの両方を一度に学べる教材になっていたからです。
#要点
cinrsを使うと、Rustのマクロの中にCの関数を直接書いて、unsafeブロックから呼び出せる- マクロがCのコードをパースし、純粋なRustのコードとして生成する。Cコンパイラやビルドスクリプトは要らない
setjmp、可変長配列のスタック確保、インラインアセンブリなどは未対応。それでもベンチマークはgcc/clangと遜色ない
#自分にとっての示唆
組み込みの世界ではCのコードがまだ主流で、Rustで書くと決めても「Cをどう扱うか」は避けて通れません。この記事は、Cを外部のライブラリとして呼ぶ(FFI)だけでなく、手続きマクロでコードそのものを変換するという選択肢があることを教えてくれます。とはいえ私はまだマクロを書いたことがないので、今すぐ真似するのは早い段階です。まずは明日からのRust30分の枠で、The Bookの「unsafe Rust」と「マクロ」の章を1節ずつ読み、extern "C" で簡単なC関数を1つ呼ぶところまでをやってみます。センサーを読む日に向けて、Cとの境界を怖がらなくなることが今の目標です。