PHPでC++の前処理を行う。
みなさん、こんにちは。高木です。
こちらのブログに投稿するのは4月以来になるので、ずいぶんご無沙汰していました。
先月から今月にかけて、クローバーフィールドには新しい顔ぶれも増えて、事務所も移転して、結構盛り上がっています。
このブログについても、今後は技術者以外の面々が盛り上げてくれることでしょう。
そうした状況の中、私自身はこのブログでどんな立ち位置を取るのがよいのかちょっと考えてみました。
そこで思いついたのは、ちょっと変わった「ネタ」を提供してはどうだろうかということです。
技術的な内容もそうでない内容についてもです。
とくに技術情報については、正統派の記事は別の方にまかせるとして、私はとにかく「ネタ」として興味を持ってもらえる内容を書いていけたらと思います。
かなり前振りが長くなってしまいましたが、そういうことで今回話題に取り上げるのは「PHPでC++の前処理を行う」という内容です。
実はこのネタについては、別のブログで以前似たようなことを書いたことがあります。
それ以降も細々とではありますが、このネタを温めてきました。当然、いろいろ実験を行ったり、アイデアを出したりもしてきたわけです。
今回は、そのほんの一部を紹介することにします。
PHPというとウェブ用の言語だと普通は考えるわけですが、コマンドラインでも使えるということは以前の記事でも書きました。
今回紹介するC++の前処理でも、PHPはコマンドラインで使用します。
C++をPHPで前処理する具体例として、C++で記述したDLLをC#から呼び出すためのDllImportを自動生成する例を挙げることにしましょう。
C++/CLIを使うようなケースを別にすれば、C++で書いたネイティブのDLLをC#から呼び出すのはちょっと面倒な手続きが必要です。
1 2 | extern "C" __declspec(dllexport) int sample(int arg) { return arg; } |
上のようにC++で書いた関数を用いて sample.dll というDLLを作ったとします。
これをC#から呼び出すには、C#のクラスの中で、
1 2 | [DllImport("sample.dll", CallingConvention = CallingConvention.Cdecl)] public extern static int sample(int); |
のようにDllImportを記述しなければなりません。
C++側で関数のシグニチャを変更すると、それに伴ってC#側も変更しなければならないわけですが、これが結構面倒で、ミスの原因にもなります。
また、C#ではなくVisual Basicを使う場合には別の文法にしたがって同様に記述をしなければなりません。
こんなとき、PHPで前処理するようにすれば簡単に解決できるようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <?php function dll_export($name, $args, $rettype) { $first = true; $params = ""; foreach ($args as $param => $type) { if ($first) $first = false; else $params .= ", "; $params .= "$type $param"; } echo "extern \"C\" __declspec(dllexport) $rettype $name($params)"; $csharp = "[DllImport(\"$name.dll\", CallingConvention = CallingConvention.Cdecl)]\n" . "public extern static $rettype $name($params);\n"; file_put_contents("$name.cs", $csharp); } |
1 2 3 4 5 | // C++での記述内容 <?php dll_export('sample', ['arg' => 'int'], 'int') ?> { return arg; } |
実際には、C#のコードは上記だけでは不十分で、クラスの定義部分などを書いてあげる必要がありますが、何をやろうとしているかは理解していただけるのではないでしょうか。
この方法の優れているところは、PHPのdll_export関数さえ変更すれば、関数の定義自体にはまったく手を加えることなく、Visual Basicや他の.NET言語用の宣言も出力できてしまう点です。
今回はほんのさわりでしたが、PHPで前処理することにすごさをある程度お分かりいただけたでしょうか?
今後もときどきはこの話題を取り上げていきたいと考えていますので、どうぞご期待ください。
# 誰も期待していないかも…