自分が試す環境は、以下の通りです。

準備

では、さっそく準備をしましょう。

http://nativeclient.googlecode.com/svn/trunk/nacl/googleclient/native_client/documentation/getting_started.html を参考にやってみます。

環境一式をダウンロード まずは、以下から nacl_mac_0.1_9308700.tgz をダウンロードしてくきます。

http://code.google.com/p/nativeclient/downloads/list $ wget http://nativeclient.googlecode.com/files/nacl_mac_0.1_9308700.tgz --2008-12-09 15:10:07-- http://nativeclient.googlecode.com/files/nacl_mac_0.1_9308700.tgz nativeclient.googlecode.com をDNSに問いあわせています... 74.125.47.82 nativeclient.googlecode.com|74.125.47.82|:80 に接続しています... 接続しました。 HTTP による接続要求を送信しました、応答を待っています... 200 OK 長さ: 83237741 (79M) [application/x-gzip] `nacl_mac_0.1_9308700.tgz' に保存中 100%[==================================================================================================================>] 83,237,741 2.61M/s 時間 36s 2008-12-09 15:10:44 (2.21 MB/s) - `nacl_mac_0.1_9308700.tgz' へ保存完了 [83237741/83237741]

解凍 tgz だったので、 tar で解凍します。 $ tar xvfz nacl_mac_0.1_9308700.tgz

中を見てみる tar すると nacl というディレクトリにいろいろと解凍されました。

解凍されたディレクトリを tree してみました。 ng$ cd .. $ tree -dL 3 nacl nacl `-- googleclient |-- native_client | |-- common | |-- documentation | |-- gtest | |-- include | |-- intermodule_comm | |-- ncv | |-- nonnacl_util | |-- npapi_plugin | |-- scons-out | |-- service_runtime | |-- site_scons | |-- site_scons_general | |-- tests | |-- third_party | |-- tools | `-- tools_bin `-- third_party |-- binutils |-- gcc |-- gnu_binutils |-- gtest |-- libxt |-- newlib |-- npapi |-- scons `-- sdl 28 directories third_party/sdl というディレクトリがありますね！ワクワクします。

サンプルを実行してみる サンプルは、 nacl/googleclient/native_client/tests/ の中に入っているみたいです。 tree -dL 1 nacl/googleclient/native_client/tests/ nacl/googleclient/native_client/tests/ |-- Frameworks |-- app_lib |-- cloudfs |-- createthreads |-- earth |-- eviltests |-- fib |-- file |-- hello_world |-- imc_shm_mmap |-- life |-- mandel |-- mandel_nav |-- mm_init |-- mmap |-- noop |-- npapi_bridge |-- npapi_hw |-- npapi_pi |-- nrd_xfer |-- null |-- plug_univ |-- quake |-- srpc |-- srpc_hw |-- syscalls |-- tone |-- voronoi `-- xaos 29 directories なんか、いろいろあります。

では、 life というサンプルを実行してみましょう！ $ cd nacl/googleclient/native_client/tests/ $ python run.py

おおお。なんか、ライフゲームが立ち上がりました！

ディレクトリの中身を見てみましょう。 $ ls -la total 64 drwxr-xr-x 2 amachang staff 272 12 8 12:45 . drwxr-xr-x 31 amachang staff 1054 12 8 12:45 .. -r--r--r-- 1 amachang staff 1882 12 8 12:45 Makefile -r--r--r-- 1 amachang staff 166 12 8 12:45 README.txt -r--r--r-- 1 amachang staff 1874 12 8 12:45 SConscript.nacl -r-xr-xr-x 1 amachang staff 9795 12 8 12:45 life.cc -r--r--r-- 2 amachang staff 1134 12 8 12:45 life.html -r-xr-xr-x 1 amachang staff 1786 12 8 12:45 run.py ビルド用の Makefile と SConscript と、ソースコード life.cc と、 html に貼付けるための life.html、単品実行用の run.py って感じですね。 ちょっと脱線：ソースコードを覗き見してみる ソースコードをちらっと見てみましょう。

include を見ると、以下のように nacl/nacl_* というファイルを include しています。

standalone で実行する時は、違うヘッダを読み込むようですね。 #if !defined(STANDALONE) #include <nacl/nacl_av.h> #include <nacl/nacl_srpc.h> #else #include "native_client/common/standalone.h" #endif 描画は、以下のように nacl_video_update に uint32_t のバッファを渡してやるようです。 struct Surface { int width, height, pitch; uint32_t *pixels; Surface( int w, int h) { width = w; height = h; pitch = w; pixels = new uint32_t [width * height]; } ~Surface() { delete [] pixels; } }; ： ： void Life::Draw() { int r; r = nacl_video_update(surf_->pixels); if (- 1 == r) { printf( "nacl_video_update() returned %d

" , errno); } } 詳しいことはこの時点ではよく分かりません。

でも、このアプリケーションは 341 行という短いコードで動いているようです。 ちょっと脱線： run.py は何をやっているの？ 追いかけてみたら、 run.py は以下のコマンドを実行しているみたいです。 $ nacl/googleclient/native_client/scons-out/dbg-mac/staging/sel_ldr -d -f nacl/googleclient/native_client/scons-out/nacl/staging/life.nexe sel_ldr というプログラムは、スタンドアローン版の flash player のようなもので nexe というが swf のようなものなのでしょう。 -f オプションはファイル指定

-d オプションはデバッグ という意味だそうです。 life.nexe というのはどういうファイルなのか？ ちょっと気になるので、 file してみました $ file scons-out/nacl/staging/life.nexe scons-out/nacl/staging/life.nexe: ELF 32-bit LSB executable, Intel 80386, version 1, statically linked, not stripped どうやら、 *.nexe は ELF 32-bit LSB バイナリ（リナックスの実行ファイルの形式）だということが分かりました。