はじめに
少しNative Client SDKのTechnical Overviewを読み、端折り気味に訳してみた。相当いい加減なので原本も合わせて読んでください。
2012/03/03:元ドキュメントのURLが変更されたので修正。
2012/01/15:内容を一部修正。この翻訳もどきは最初のドキュメントをベースにしているので現在のChromeの公式ドキュメントとは内容が少し異なっているので注意すること。
Native Clientとは
Native Clientとは、ブラウザでネイティブ・コード(CPUが直接理解するコード、つまり機械語)を動かす仕組みである。Webアプリケーションに期待される安全性とOS非依存を目指している。Native Clientはどんなブラウザでも実装可能であり、特定のCPUに依存しない。
GoogleはChromeブラウザにWindows・Mac・Linux用のNative Clientを実装している。Native Clientをつくるためには 「Native Client SDK」を使用する。Native Client SDKは
- ソフトウェアライブラリ
- コードサンプル
- ドキュメント
- Native Clientコードの実行形式を生成するために手直しされたツールの集合体
を含む。
Native Clientを使うウェブアプリは、JavaScript・HTML・CSS・Native Clientコンパイラでサポートされた言語で書かれたNative Clientモジュールの組合せからなる。SDKは現在C/C++をサポートしている。
なぜNative Clientを使うのか?
Navtive Clientはプロプライエタリコード(バイナリのみで提供されるコードの意味)やカスタム機能でブラウザを拡張することを可能にするものである。典型的なケースとしては
- すでに存在しているソフトウェアコンポーネントの移植
- レガシーデスクトップアプリの移植
- 膨大な計算能力を必要とするエンタープライズアプリケーションの作成
- マルチメディアアプリケーションの作成
- ゲーム:Native Clientはすでに存在しているC/C++のマルチスレッド・マルチコアのコード・ベース、低レイテンシ・オーディオや近く公開予定のネットワークAPI、プログラマブル・シェーダー付きのOpenGL ESにより実行速度をネイティブ・スピードに近づけることが可能である。
ウェブ・プログラミングはクライアントとサーバー間でデータが流れるのでその両端で暗号化・復号化を行う必要があるという問題に直面している。データ処理は固有のフォーマットでサーバ-クライアントそれぞれエンコード・デコードするために高い処理能力が要求されるだろう。Native Clientはアプリケーションがブラウザ上で行うことでの利点(最新のHTML5実装ににおけるイベント処理やユーザとの対話処理)を得ると同時にブラウザに直接このような機能を組み込むことが可能となる。
すでに存在しているアプリケーションのネイティブコードがコンパイルすることは研究・開発に費やした投資の保護に役立つだろう。Native Clientはコン??パイル時の制限によって提供される保護に加え利用者が実行時のバリデータによって提供されるセキュリティの恩恵を受ける。バリデータはモジュールをデコードし、ブラウザ上で動作する命令を制限し、サンドボックス化された環境がシステムコールを代理する。利用者はインストールすることなしにNatvie Clientアプリケーションを実行することができ、削除やデスクトップからの追加なしにアプリケーションを更新することができる。
Natvie Clientモジュールの実行
Native ClientモジュールはNative Clientランタイムシステム上での特別な規則に従うように構成された機械語のセットである。どのような言語で作られたかに関係なくNative Clientランタイムシステムは次の図に示す手順でNative Clientモジュールを実行する。
https://developers.google.com/native-client/pepper16/images/NaClExecution.png
システムリソースに直接アクセスできないことを保証するために、Native Clientランタイム・システムは次の危険な活動を防止する。
- デバイスやファイルを直接操作する(代わりに特別なファイルシステムAPIが提供されている)。
- OSへの直接アクセス
- 意図を隠すための自己書き換えコードの使用(保護メモリへの書き込みを試みるなど)
Native Client SDKの中身
Native Client SDKは次のものを含む
- GNUベースのツール集合体:GCC,GNU as,GNU ld,gdb
- APIライブラリ(Pepper,POSIX)
- サンプル(テンプレートやプロジェクトファイルをセットアップするスクリプトを含む)
- ドキュメント
Salt & Pepper
Native Clientの製品名は「ソルト・アンド・ペッパー」テーマに従う。
Native Clientが「NaCl」(塩)と短縮されてから、 「ソルト・アンドペッパー」命名テーマを始めた。Native Clientはブラウザ上で構築される。利用者はNative Clientを実行するために何もインストールする必要はない。ChromeブラウザでNative Clientを実行可能にするためには、アドレスバーでabout:flagと入力する。そしてNative Clientを"有効にする"をクリックする。
「Pepper Plugin API」、略して「Pepper」はオープンソースでクロスプラットフォームなWebブラウザプラグイン用のAPIである。Native Client側から見ると、PepperはCまたはC++のNativeClientモジュールがホストブラウザと通信し安全かつ移植性の高い方法でシステムレベル(OSレベル)のアクセスを可能にするAPIセットである。Native Clientのセキュリティ制約の一つにモジュールがOSレベルの呼び出しを行うことができないということがある。ペッパーはモジュールに代わりシステムレベル(OSレベル)の呼び出しを代行する。開発者は次のPepper APIを使用することができる。
- Naclモジュール中のCもしくはC++コードとJavaScriptとの対話
- ファイル入出力の実行
- オーディオの再生
- 3Dグラフィックスの描画
下の図は、ペッパーがネイティブクライアントモジュールとブラウザ間のブリッジとしてどのように機能するかを示している。
PepperはC APIとC++ APIが含まれている。C++ APIはC APIの上に書かれたバインディングのセットである。C APIとC++ APIの両方のリファレンスドキュメントにアクセスできる。Pepperの詳細についてはPepperの概念を参照すること。
プログラムの構造
Navtive Clientアプリケーションは3つの主要な機能に分けることができる。
- HTML/JavaScriptアプリケーション:メインHTMLドキュメントと同様にユーザインタフェース・イベント処理メカニズムを提供する。計算を実行することももちろん可能である。
- ブリッジ:処理のためのJavaScriptとNavtive Clientモジュール間の値を交換する。JavaScript関数の引数を取り出し、Native Clientモジュールによって処理されるメソッドの引数に変換する。またNative Clientモジュールがブラウザ・リソースの作成・使用を許可するインターフェースも含んでいる。
- Native Client モジュール:通常「数値計算」・「計算集中型処理」・「大規模データ操作」などを処理する。またゲームのようにネイティブ実行されるコードに統合されているユーザーインターフェイスのイベントを処理するAPIも提供する。
次の図ははPepperブリッジ機能がNative ClientモジュールコードとブラウザのJavaScript間でのデータの交換をどのように行うのか表したものである。
https://developers.google.com/native-client/pepper16/images/ProgramStructure.png
Native Client Webアプリケーションのファイル構成
Native Client Webアプリケーションは次のファイル構成からなる。
- HTMLファイル・CSS・JavaScriptファイル
- Native Client モジュール(.nexe)
- マニフェストファイル(.nmf):異なるプロセッサのためにモジュールのロード方法を記述したファイル。これはキーと値のペアからなり、キーは利用者のプロセッサであり(x86-32, x86-64)、値は対象となるプロセッサ用のモジュールURLである。
HTMLファイル
HTMLファイルはネイティブクライアントへの<embed>タグを含む。
<embed name="nacl_module"
id="hello_world"
width=0 height=0
src="hello_world.nmf"
type="application/x-nacl" />
Native ClientのMIMEタイプはapplication/x-naclである。
Native ClientモジュールはOSに依存しない。しかしプロセッサには依存する。そのためプロセッサごとにモジュールをコンパイル必要がある。利用者のプロセッサによりどのモジュールをロードするのかを<embed>タグのsrc属性に記述したマニフェストファイルに記述する。
Native Client モジュール
開発者はその言語と互換性のあるライブラリとモジュールを使用し選択した言語でNative Clientモジュールを書くことができる。モジュール内の関数を実装後、アプリケーションのJavaScript/ブラウザ側にこれらの関数へのインターフェイスを渡すために、ペッパーライブラリによって提供されるブリッジメカニズムを使用するアプリケーション/JavaScript間でPepperAPIを使用してメッセージの送受信を行う。
Native Client Webアプリケーションの作り方
Native Clientはとてもフレキシブルなので、いろいろな方法でアプリケーションを開発することができる。以下は代表的な方法の1つである。
- Native Client SDKとNative Client ブラウザをダウンロードする。
- アプリケーションを記述する。
- UIはHTML,JavaScript,CSSで作成する。
- 必要なら、Native Clientのために既存ライブラリを移植する。もし共通ライブラリが見つからない場合は、オープンソースライブラリのレポジトリであるNacl Portsを見ること。
- Native Client モジュールを作成する
- アプリケーションをテストする。
- アプリケーションを配布する。
既存のコードの利用
Native Client SDKにはブラウザで実行されるサンドボックスセーフなネイティブコードを生成するGNUツールチェーン(GCCおよびG++を含む)の修正版が付属している。これは3Dゲーム・ビデオ編集等のアプリケーションを比較的少ない労力でウェブに移植するために公開している。多少の変更作業がウェブ上でコードを安全に実行するために必要とされる。例えばOSレベルの呼び出しはPepperAPIに変更する必要がある。ファイルI/Oとスレッド操作等にも制約がある。
Native Clientアプリケーションの配布
ChromeブラウザはChrome Web Store(CWS)で公開されたNative Clientアプリケーションのみ動作させる事ができる。アプリケーションを配布するには32bitおよび64bitのx86アーキテクチャ用にコンパイルする必要がある。
Native Clientはまだ標準化されていず、現在は特定の命令セット用にコンパイルする必要がある。Googleはx86版の32bitおよび64bit両方で動作する場合のみCWSでの配置を許可する。
この64bit/32bit両方のアーキテクチャでコンパイルしたアプリケーションを必要とするポリシーとしているのはWeb上の命令セットが一つに固まりかつ将来のアーキテクチャが現在と同様にサポートされるか確認できないためである。
ただ上記は一時的な要件であることに注意すること。最終的にはどのプロセッサでも動作するNative Clientモジュール(PNacl)を作成することを計画している。この新しいNative Client技術は携帯用のPNaClが開発のベースとなっている。いまは直接x86もしくはARMコードを生成しているけれども、代わりにLLVM(低レベル仮想マシン)用のバイナリを生成し、Chromeブラウザ側にネイティブコードコンパイラを用意し実行時にネイティブコードに変換する。
PNaClはNative ClientにJavaScriptと同じ能力を与えることができるが、克服するためのハードルが残っている。それはPNaClがオーバーヘッドを抱えていて起動が遅いことである。実行時はJavaScriptよりもはるかに速いが、起動までのスピードが遅い。PNaclを正式にリリースするまでにGoogleはそのオーバヘッドの問題を解決したいと考えている。
現在の制約
結構制約がきついですね。。
- IDEのサポートはなし
- ハードウェア例外処理はサポートされていない
- プロセス・サブプロセスのサポートはない
- TCP / UDPソケットのサポートはない
- 同期I/Oのサポートはない
- 高性能タイマーのサポートはない
- 使用可能メモリの要求機能はない
- インラインアセンブラはバリデータの要求を満たす必要がある
- Pepper APIはメインスレッドからのみ呼び出し可能
関連記事:
RSS Feeds