PCP: C++ Preprocessor α版を作成中
高木です。こんばんは。
お正月、というより大晦日の夜からずっとPHPと格闘を続けてきました。
何をやっていたかというと、以前から何度か取り上げてきたPCP: C++ Preprocessorの開発を行っていたのです。
まもなくα版として公開できるかと思います。
これまでも何度か試作を重ね、その間、私自身のPHPのスキルも上がってきましたし、CやC++もどんどんバージョンアップして事態が複雑化していきました。
これまでに作った試作の延長では複雑になりすぎる嫌いがあったので、思い切って最初から書き直しました。
基本的なコードはほぼ書き終わり、細かな機能実装とドキュメントとテストを現在行っています。
まだα版なので完璧といえる状態にはまだまだですので、公開後はいろいろな方からご意見を頂ければ幸いです。
そのためにもドキュメントを充実させなければなりませんね。
さて、PCP: C++ Preprocessorというのは一体何なのかについて、あらためて説明しておかないといけませんね。
PCP: C++ Preprocessorという名称は、PHP: HTML Preprocessorをもじったもので、当然通称は「PCP」ということになります。
その名の通り、C++の前処理を行うツールです。
C++だけでなくCの前処理も行うことができます。
CにもC++にも前処理の機能がありますが、単なるテキストの置換しか行うことができません。
しかし、PCPではPHPを使ってCやC++の前処理を行います。
前処理にPHPを使うことで、複雑なデータ構造を静的に構築したり、バイナリファイルを読み込んで配列の初期化子を生成したりといった、テキストの置換だけでは逆立ちしてもできないことを実現することができます。
とくに、組込み機器におけるマイコンのプログラムなどでは、少ないRAMを消費し、時間をかけて動的にデータ構造を作るのが厳しいことが多々あります。
PCPを使えば、静的にデータ構造を構築し、ROMに配置することも簡単にできます。
PHPはもともとHTMLの前処理を行うための言語ですので、CやC++のソースコードを前処理することも簡単に実現できます。
しかし、それだけだと何のひねりもなくて面白くありませんね。
PCPでは、CやC++の前処理を行うためにPHPを機能拡張し、ライブラリを強化したツールだということができます。
PHPで単に前処理を行うだけでは、前処理の前後で行番号がずれてしまいます。
その結果、コンパイルエラーが生じたときに問題のある個所にたどり着くのに手間がかかってしまいます。
PCPでは、独自の工夫によってこの問題を解決しています。
CやC++にはリフレクションの機能が備わっていません。
PCPを使えば、PHPの配列として構造体や列挙体などを定義し、変換関数を通して実際の構造体などの定義コードを出力させることができます。
このとき用いたPHPの配列を流用することで、(静的ではありますが)リフレクションと同じようなことが実現可能になります。
C#などの.NET言語からネイティブコードを呼び出すためのDllImportの定義を自動生成することも、プロセス間や他言語間でデータを交換するためのマーシャラー/アンマーシャラーを自動生成することもできることでしょう。
ソースコードの文字エンコーディングの扱いも、PCPではかなり柔軟になっています。
PHPでは、別のソースファイルの取り込みには、include、include_once、require、require_onceのいずれかを使用します。
しかし、PCPでは専用のimport関数を用いることで、ソースコードの取り込み時にエンコーディングを自動判別し、内部的にいったんUTF-8にそろえるようにしています。
そして、出力する際のエンコーディングを指定することができるほか、基本ソース文字集合以外を国際文字名に変換して出力することも可能です。
ほかにも様々な機能をPCPには盛り込んでいます。
今のところMITライセンスで公開することを考えていますので、是非お試しいただければと思います。
公開は今月9日を予定しています。