Google’s Portable Native Client Builds Architecture Independent Executable for Portability, and Better Performance
Native Client (NaCl) allows to build native C and C++, and runs it in the browser for maximum performance. Applications such as photo editing, audio mixing, 3D gaming and CAD modeling are already using it. The problem is that you have to build the code for different architecture such as ARM, MIPS or x86. To provide a portable binary, Google announced the Portable Native Client (PNaCl, pronounced pinnacle), which “lets developers compile their code once to run on any hardware platform and embed their PNaCl application in any website”.
Instead of compiling C and C++ code directly to machine code, PNaCl generates a portable bitcode executable (pexe), which can be hosted on a web server. Chrome then loads this executable, and converts it into an architecture-specific machine executable (native executable – nexe) optimized for the device where the code runs.
Google hosts a page comparing NaCl and PNaCl, to explain the differences, and help make the right choice. PNaCl is now the preferred toolchain, but it comes with limitations which means you may have to use NaCl instead:
- PNaCl does not support architecture-specific instructions such as assembly. Future editions of PNaCl will attempt to mitigate this problem by introducing portable intrinsics for vector operations.
- Only static linking with the >newlib C standard library is supported, not dynamic linking nor glibc. This will be fixed in future releases.
- C++ exception handling are currently not supported
- Vector types and SIMD are currently not supported
- Some GNU extensions are unsupported such as taking the address of a label for computed gotos, or nested functions.
If your application is in the open web, NaCl is not an option, and you’ll have to use PNaCl instead.
You can find more information, and getting started with the native client SDK, on NaCl and PNaCl developers’ page.