PNaClのサンプルを動かしてみたい
PNaClのチュートリアルのコード(のコメント)を読んだメモ。
PNaClとはなにか
NaCl(Google Native Client)というものがある。 これは、Web上の任意のコードを安全に実行するためのサンドボックス技術らしい。 サンドボックスとブラウザはPepperAPIというAPIを使って通信する。
ブラウザ使うからプラットフォームに依存しないという利点があるらしい。
PNaClは、CPUに依存しない(Portableな)NaClらしい。
PNaClの使い方
要件
動かすのには、Python(2.6か2.7)とMakeが必要らしい。 対応しているOSはWin/Mac/Linux
SDK
開発するのにNaCl SDKという物がいる。
ココ にダウンロードからインストールまでの仕方が書いてある。
まぁ、naclsdk updateするだけだけども。
どう使うのか
PNaClを使うには、中間コードの.pexeと、マニフェストファイルである.nmfが必要。 embedタグのsrcに*.nmfのURLを指定し、typeにapplication/x-pnaclを指定する。
.nmfのファイルは見たところJSONである。 このファイルは、.pexeの場所やオプションのコマンドとかを指定するらしい。
モジュール
PNaCl用のバイナリが読み込まれると、まずpp::CreateModuleが呼ばれる。 この関数は、ロード時に一度呼ばれるだけ。 このときにpp::Moduleクラスのオブジェクトへのポインタを返す。 とりあえず、コイツの事をモジュールと呼んでおこう。
実際には、モジュールはpp::Moduleを継承したクラスを実装することになる。
インスタンス
PNaClのマニフェストを埋め込むembedタグに行き当たる度に モジュールのCreateInstanceが呼ばれる。
CreateInstanceはPP_Instanceを引数にとってpp::Instanceへのポインタを返す。 このpp::Instanceを継承したクラスに、Javascriptと通信する部分を実装していく。 とりあえず、コイツをインスタンスと呼ぼう。
ブラウザとサンドボックス間の通信
インスタンスにはHandleMessageというメソッドを実装する。 このメソッドはブラウザでjavascriptのpostMessageが呼ばれたときに呼び出される。 javascriptから送信されたメッセージを受け取って処理するメソッドである。 このメソッドの引数がpp::Varオブジェクトへの参照なのだが、詳しくはドキュメントを見ろと書いてある。
ちなみにC++側からjavascript側にメッセージを送るのは、PostMessageというメソッドを使うらしい。
ブラウザとサンドボックスの間の通信では送受信が非同期であることに注意が居るらしい。 コメントには、内部の状態を変化させるような場合に注意が必要という旨のことが書いてあった。
おわり
とりあえず読めたのはココまで。少しずつこつこつやってこう。