libclang を用いた moc の再実装

本家の 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 (概念実証) の目的となります。

“libclang を用いた moc の再実装” の続きを読む

Qt を Web ブラウザで動かす

Google の Native Client 上で Qt を動かす試みは比較的前から有る話題でしたのでご存じの方もいらっしゃると思いますが、最近、それとは別のアプローチで Qt を Web ブラウザで動かしている例がありました。

詳しいことは以下の記事とそこからリンクされているそれ以前の記事を参照してください。

それは Emscripten というプロジェクトを用いて実現されています。Emscripten は LLVM をベースにして、C/C++(や LLVM のフロントエンドがサポートする言語) を JavaScript へコンパイル(コンバート?)することが出来ます。上記の記事では Emscripten を使って、Qt を JavaScript にコンパイルしてブラウザ上で動かしています。画像を見ると Firefox や Chromium で動いているところが確認できます。実際に動かしてみたい方は記事中にデモへのリンクがあるのでそちらをたどってみてください。QtCore と QtGui とアプリをまとめて JavaScript にするため、ファイルサイズは数MB以上と大きくなり、実際に動き出すまでの時間はかかりますが、ランタイムやプラグインのインストール無しに Qt アプリが動いている様子はなかなか面白いものです。さすがに、レスポンスが良いとは言えませんが。

動かしている Qt のバージョンについての詳しい記述はありませんが、QWS で動かしていることから Qt4 系だということは分かります。やり方によっては QtWebKit や QtScript 上で Qt を動かすような事も出来るかもしれません。