CPU負荷の高いWebアプリケーションのパフォーマンスを向上させるため、Googleはブラウザでネイティブコードの実行を可能にする技術、Native Clientを開発している。NetscapeのNPAPIやMicrosoftのActiveXプラグイン技術とは異なり、下層にあるOSへのアクセスを禁止するため、Native Clientは二重化されたサンドボックス内でコードを実行する。
Webアプリケーションのパフォーマンスを向上させる手段のひとつは、ブラウザでネイティブアプリケーションが実行できるようにすることだ。このアプローチでは、JavaScriptコードを実行する代わりにネイティブコードを実行する。ネイティブコードは通常、JavaScriptよりも高速だ。だが、ここで問題になるのは、ネイティブコードは深刻なセキュリティ問題を引き起こす可能性があることだ。例えば、意図せぬデータへのアクセスや、好ましくないネットワーク接続などのおそれがある。こうした問題は、NPAPIやActiveXに対する大きな不満のひとつでもあった。Native Clientでは、下層のOSへのアクセスを禁止する特別なサンドボックス内でネイティブアプリケーションを実行することによって、この問題を解決しようとしている。ネイティブアプリケーションができることは、CPUを使ってNative Client環境とやり取りすることだけになる。
ネイティブアプリケーションは二重化されたサンドボックス内で実行される。外側のサンドボックスは通常のブラウザで使われているサンドボックスと同じようなものだ。内側のサンドボックスはSoftware-Based Fault Isolation理論に基づき、x86メモリセグメンテーションを利用して、ネイティブコードを確保されたメモリセグメント境界内に強制的にとどめる。
ホワイトペーパー Portable Native Client Executables (PDF) によると、Native Clientは以下を目標としている。
1. ISA(Instruction Set Architecture: 命令セットアーキテクチャ)ニュートラルなコンパイル済みNaCl(Native Client)モジュールのフォーマットを提供し、ソースを再コンパイルすることなく、幅広いターゲットプラットフォームをサポートすること。
2. NaClの開発者がポータブルな実行可能モジュールを簡単に構築、テスト、デプロイできるようにすること。
3. まずは、x86-32、x86-64、ARMの命令セットをサポートすること。将来的には、他の主要な汎用CPUを簡単にサポートできるようにすること。
4. Native Clientのセキュリティおよびパフォーマンス特性を維持すること。
開発者が楽になるよう、Native Clientモジュールは任意の言語で書かれたものを、LLVM (Low Level Virtual Machine) ビットコードにコンパイルしたものになる予定だ。LLVMはISAニュートラルを提供するコンパイラインフラストラクチャであり、元のコードを各種ターゲットプラットフォームに移植する必要はない。ビットコードはかなり最適化され、ファイルに保存される。もし、WebページにタイプがNative Clientの<object>タグが含まれていれば、ブラウザはそれに対応する環境を作成し、LLVMファイルをダウンロードする。すると、ビットコードがネイティブコードに変換され、不正な処理を実行しようとしていないか解析される。そして、CPU負荷の高いであろう処理が実行される。開発者は一度コードを書くだけで、複数のアーキテクチャにデプロイできるようになる。そして、中間のLLVM層のおかげで、コードが書かれた時点に存在しなかった新しいアーキテクチャ上でもモジュールを動かすことができ、アプリケーションの利用者を増やすことができる。
GoogleはWindows、Max OS X、Linux(x86-32、x86-64、ARM)に向けたNative Clientパッケージを作成し、関心のあるアーキテクチャへ取り組めるようソースをオープンにしている。ベンチマーク (PDF) によると、x86とARMの両プラットフォームにおいて、Native Clientアプリケーションは何も変更していないアプリケーションの97%のスピードで実行できている。現在のところ、Native ClientはFirefox、Safari、Opera、Google Chromeで動かせる。Native Clientで動くサンプルアプリケーションには、古典的ゲームのQuake、対話フラクタルビューアのXaoS、スクリプトエンジンのLuaなどがある。