Google Native Client(ネイティブクライアント、食塩を意識してNaClと略される)は、ネイティブコードを安全に、しかし効率的に実行することを目標とした、サンドボックスを中心としたフレームワークである。当初はその名の通りネイティブコード版のみであったが、その後の情勢などにより、現在はプロセッサアーキテクチャ非依存の Portable Native Client (PNaCl) もあり、それについても述べる。
WebAssemblyの普及に伴いそちらにリソースを集中するため開発を終了し、2019年にChromeから削除されることを発表WebAssembly Migration Guide (P)NaCl Deprecation Announcements。2023年に削除された。
概要 NaCl、PNaClともx86とARMに対応したものが公開されている。ウェブブラウザ上のウェブアプリケーションをネイティブアプリケーションに近い速度Native Client: A Technology for Running Native Code on the Webで実行することなどを主な目標とした、安全にネイティブコードを実行できるシステムである。PC版およびChrome OS版Google Chrome 14からはChromeウェブストアで配布されているアプリケーションを実行する場合に限りデフォルトで有効になっており、それ以外の場合はchrome://flags/で有効にする必要があるHow to Test-Run Web Applications。Google Chrome 29からPNaClが導入され、Google Chrome 31(デスクトップ版のみ)からは、PNaCl がデフォルトで有効になっており、NaClとは異なりAdobe FlashのようにChromeウェブストア以外の一般のウェブページ内に埋め込みでも使用できるChrome 31 Beta: Android Application Shortcuts, requestAutocomplete(), and PNaCl。
NaClのARMへの実装は、2010年3月にリリースされた。x86-64もサポートされている。しかし、NaClはCPU依存であり、それぞれホストの命令セットへコンパイルされたバイナリしか使用できない。Portable Native Client (PNaCl) では、LLVM中間表現を採用することでこの問題を解決しており、CPU非依存でアプリケーションを動作させられるPNaCl: Portable Native Client Executables。PNaCl向けに書かれたアプリケーションをEmscriptenを使い、汎用のJavaScriptとして動作させるための、もGoogleは開発している。
標準CライブラリとしてNewlibを使用しているが、NaClはポートされたGNU Cライブラリ(glibc)も使用可能であるNativeClient: Plash Wiki。今のところ、PNaClはglibcは未対応。標準CライブラリではPOSIXスレッドも使用可能であるが、プロセスはサポートしていない。
Google Chrome 14 (release 0.5) から、Native Clientは安定版のABIを持っていて、将来のバージョンでの上位互換性を保証しているOfficial NaCl Release Notes。同様に、PNaClの方はGoogle Chrome 31以降、上位互換性を保証しているStability of the PNaCl bitcode ABI。
NaCl、PNaClはGoogleによってオープンソースプロジェクト(BSDスタイルのライセンス)として開発が進められていたGoogle Native Client on Google Code。
サンドボックス NaClはARMとx86-64でのサンドボックス化のため、ソフトウェアによるフォールト分離を利用している。x86-32での実装は、サンドボックスのメモリ空間を規制するなど一部用途以外ではx86のセグメンテーション機能を用いない。システムコールの呼び出しなどの危険な命令の実行を防ぐためには、コード検証機を利用する。また、安全な命令の中に隠された危険な命令へジャンプすることを防ぐため、Native Clientでのインダイレクトジャンプは32バイトブロックの先頭へのみ許されるほか、ジャンプ先ブロックが不定なジャンプは許可されない。これらの制約のため、C言語で書かれたプログラムは Native Client 上で動作するためにはカスタマイズされたGNU toolchain、特にgccとbinutilsで再コンパイルすることが必要になる。
Pepper API Pepper APIはNative Clientアプリケーションを作成するために使えるクロスプラットフォームAPIで、PPAPI (Pepper Plug-in API) とも呼ばれる。ネットスケープのNPAPIがベースとなっており、ブラウザを超えた機能に安全にアクセスすることができるNative Client Technical Overview。
名前の由来は、Native Clientの略がNaClで、塩化ナトリウム(食塩)の化学記号であることから、調味料・香料としてセットにされる塩コショウの胡椒 (Pepper) から来ている。
以下はPPAPI環境下で使用できる機能。 JavaScriptインターフェース リモートファイルローダ ローカルファイルIO 2Dグラフィックス 3Dグラフィックス (OpenGL ES 2.0) オーディオ再生 WebSocket 各種入力(マウス、キーボード、ゲームパッド等) ゲーム向け支援機能(マウスカーソルロック、フルスクリーン等) etc ...
Mozilla の反応 JavaScript の生みの親であり、Mozilla CTO の ブレンダン・アイク は、ECMAScript 6 で十分であると述べ、NativeClient の必要性を退けているJavaScript founder dismisses Google Native Client, pushes ECMAScript 6。 Mozilla のバイスプレジデントである Jay Sullivan は NativeClient を指して「これらのネイティブアプリはウェブページのブラックボックスでしかなく、(中略)我々はHTMLを信じており、我々が集中したいと考えるものだ」("These native apps are just little black boxes in a webpage. [...] We really believe in HTML, and this is where we want to focus.")と述べたMozilla: Our browser will not run native code。 関連項目 WebAssembly - これをベースに初期の実装を行ったウェブブラウザ上で実行する低水準の中間言語
参照
外部リンク
GDC2012のスライド資料 (PDF)