Google Native Client(NaCl、
塩化ナトリウムを意識してNaClと略される)は、Webブラウザ上でネイティブコードを安全に、かつ効率的に実行することを目的としたサンドボックス環境を中心としたフレームワークです。当初はネイティブコード版のみでしたが、後にプロセッサアーキテクチャに依存しないPortable Native Client (PNaCl) も開発されました。
概要
NaClとPNaClは共にx86と
ARMアーキテクチャに対応しており、Webアプリケーションをネイティブアプリケーションに近い速度で実行することを目標としています。これにより、Webブラウザ上で高度なグラフィックスや計算処理を必要とするアプリケーションを快適に利用できるようになりました。
初期の
Google Chromeでは、Chromeウェブストアから配布されるアプリケーションでのみデフォルトで有効でしたが、設定を変更することで他のWebページでも利用可能でした。
Google Chrome 29でPNaClが導入され、Chrome 31からはデフォルトで有効化され、
Adobe FlashのようにChromeウェブストア以外のWebページにも埋め込めるようになりました。
NaClはCPUに依存するため、それぞれのホストの命令セット向けにコンパイルされたバイナリしか利用できません。これに対し、PNaClはLLVMの
中間言語を採用することでCPU非依存を実現し、一度コンパイルすれば異なる環境でも動作可能になりました。また、PNaCl向けのアプリケーションを
JavaScriptとして動作させるためのpepper.jsも開発されました。
標準CライブラリとしてNewlibを使用していますが、NaClではGNU Cライブラリ(glibc)も利用可能です(PNaClはglibc未対応)。
POSIXスレッドは利用可能ですが、プロセスはサポートされていません。
Google Chrome 14からNaClは安定したABI(Application Binary Interface)を提供し、上位互換性を保証しています。PNaClも同様に、
Google Chrome 31以降で上位互換性が保証されています。
NaClとPNaClは
Googleによってオープンソースプロジェクトとして開発され、BSDスタイルの
ライセンスで提供されていました。
サンドボックス
NaClは、ソフトウェアによるフォールト分離を利用し、ARMとx86-64環境でサンドボックス化を実現しています。x86-32環境では、一部の用途を除き、x86のセグメンテーション機能は使用せず、メモリ空間を規制しています。システムコールなどの危険な命令の実行を防ぐためにコード検証機が用いられます。また、安全な命令に隠された危険な命令へのジャンプを防ぐため、間接ジャンプは32バイトブロックの先頭にのみ許可され、ジャンプ先が不定なジャンプは禁止されています。これらの制約のため、C言語で書かれたプログラムをNaCl上で動作させるには、カスタマイズされたGNU toolchainで再コンパイルする必要があります。
Pepper API
Pepper API(PPAPIとも呼ばれる)は、NaClアプリケーションを作成するためのクロスプラットフォームAPIです。NetscapeのNPAPIをベースにしており、Webブラウザの機能に安全にアクセスできます。NaClが食塩を意味するNaClであることから、胡椒(Pepper)という名前が付けられました。
PPAPI環境下では以下の機能が利用可能です。
JavaScriptインターフェース
リモートファイルローダ
ローカルファイルIO
2Dグラフィックス
3Dグラフィックス (OpenGL ES 2.0)
オーディオ再生
WebSocket
各種入力(マウス、キーボード、ゲームパッドなど)
ゲーム向け支援機能(マウスカーソルロック、フルスクリーンなど)
Mozilla の反応
JavaScriptの生みの親であり、MozillaのCTOであるブレンダン・アイク氏は、ECMAScript 6で十分であるとしてNaClの必要性を否定しました。
また、Mozillaのバイスプレジデントであるジェイ・サリバン氏は、NaClを「Webページ内の小さなブラックボックス」と批判し、HTMLに注力すべきだと述べています。
WebAssemblyの普及に伴い、GoogleはNative Clientの開発を終了し、2019年にChromeから削除され、2023年には完全に削除されました。
関連項目
WebAssembly - Native Clientの技術をベースに開発されたWebブラウザ上で動作する低水準の
中間言語
参照
公式ウェブサイト
GDC2012のスライド資料 (PDF)