本家の Planet Qt にはたびたび woboq という会社の記事が出てきます。Nokia/Trolltech で Qt の開発に携わっていたメンバーが立ち上げた小さな会社ですが、Qt および C++ などの確かな技術力を元にこれまでにもさまざまな面白い記事を提供しています。古い記事もご紹介したいものはありますが、今回はその中から「Proof Of Concept: Re-implementing Qt moc using libclang」を紹介しようと思います。
moc(Meta-Object Compiler) というと Qt のメタオブジェクトシステムの核となる要素であり、シグナルやスロットの実現に欠かせないコマンドであります。moc は C++ のヘッダーファイルやソースファイルをパースして QObject を継承したクラスの宣言(正確には Q_OBJECT マクロのあるクラス宣言)を見つけ出して、必要なメタオブジェクトやシグナル、メソッドの実装を作成します。
このため、moc は独自実装による C++ のプリプロセッサおよびパーサを合わせたような機能を持っています。が、C++ のすべての仕様の実装までは行っておらず、複雑な文法になる場合や C++11 特有の書式には対応していません。そこでパーサーの実装に libclang を用いて、moc を(moc-ng として)再設計することで C++ の仕様への追従度や、moc 自身のメンテナンス性を向上させようというのがこの Proof Of Concept (概念実証) の目的となります。