Index: native_client_sdk/src/doc/overview.rst |
diff --git a/native_client_sdk/src/doc/overview.rst b/native_client_sdk/src/doc/overview.rst |
new file mode 100644 |
index 0000000000000000000000000000000000000000..2f3d87716a8e8fa9228d5c8adcdd54af7f18655d |
--- /dev/null |
+++ b/native_client_sdk/src/doc/overview.rst |
@@ -0,0 +1,385 @@ |
+.. _overview: |
+ |
+################## |
+Technical Overview |
+################## |
+ |
+.. contents:: |
+ :local: |
+ :backlinks: none |
+ :depth: 2 |
+ |
+Introduction |
+============ |
+ |
+**Native Client** is an open-source technology for running native compiled code |
+in the browser, with the goal of maintaining the OS portability and safety |
+that people expect from web apps. Native Client expands web programming |
+beyond JavaScript, enabling developers to enhance their web applications |
+using their preferred language. This document describes a few of the key |
+benefits of Native Client, as well as current limitations, common use cases, |
+and tips for getting started with Native Client. |
+ |
+Google has implemented the open-source |
+`Native Client project <http://www.chromium.org/nativeclient>`_ in the Chrome |
+browser on Windows, Mac, Linux, and Chrome OS. The **Native Client Software |
+Development Kit (SDK)**, itself an open-source project, lets developers create |
+web applications that use Native Client and run in Chrome across OS |
+platforms. In addition to software libraries, the SDK includes a toolchain |
+tailored to generate executable Native Client code, as well as a variety of |
+code examples and documentation. |
+ |
+A web application that uses Native Client generally consists of a combination |
+of JavaScript, HTML, CSS, and a Native Client module that is written in a |
+language supported by a Native Client compiler. The Native Client SDK |
+currently supports C and C++. As compilers for additional languages are |
+developed, the SDK will be updated to support those languages as well. |
+ |
+.. image:: /images/NaclBlock.png |
+ |
+Why use Native Client? |
+====================== |
+ |
+The Native Client open-source technology is designed to run native compiled |
+code securely inside browsers. Native Client puts web applications on the same |
+playing field as local applications, providing the raw speed needed to compete |
+with traditional software like 3D games, video editing, and other applications. |
+Native Client also gives languages like C and C++ (and eventually others as |
+well) the same level of portability and safety that JavaScript provides on the |
+web today. |
+ |
+Here are some of the key features that Native Client offers: |
+ |
+* **Graphics, audio, and much more:** Run native code modules that render 2D |
+ and 3D graphics, play audio, respond to mouse and keyboard events, run on |
+ multiple threads, and access memory directly---all without requiring |
+ the user to install a plug-in. |
+* **Portability:** Write your apps once and you'll be able to run them on |
+ Windows, Linux, Mac, and Chrome OS. |
+* **Security:** Installing a desktop app or a browser plug-in can present |
+ serious security risks and deter potential users. Native Client uses a |
+ double sandbox designed to protect resources on the user's system. This |
+ framework offers the safety of traditional web apps in addition to the |
+ performance benefits of native compiled code, without requiring users to |
+ install a plug-in. |
+* **Easy migration path to the web:** Many developers and companies have |
+ years of work invested in existing desktop applications. Native Client |
+ makes the transition from desktop app to web app significantly easier |
+ because Native Client supports C and C++ (and will continue to add more |
+ languages). |
+* **Performance:** Native Client allows your app to run at a speed comparable |
+ to a desktop app. This capability enables demanding applications such as |
+ console-quality games to run inside the browser. |
+ |
+Common use cases |
+================ |
+ |
+Native Client enables you to extend web apps running in the browser with custom |
+features and proprietary code. Typical use cases for Native Client include the |
+following: |
+ |
+* **Existing software components:** With its native language support |
+ (currently C and C++), Native Client enables you to reuse current software |
+ modules in a web app---you don't need to spend time reinventing and debugging |
+ code that's already proven to work well. |
+* **Legacy desktop applications:** Native Client provides a smooth migration |
+ path from desktop application to web app. You can port and recompile |
+ existing code for the computation engine of your application directly to |
+ Native Client, and need repurpose only the user interface and event |
+ handling portions to the new browser platform. Native Client allows you to |
+ embed existing functionality directly into the browser at the same time |
+ your application takes advantage of things the browser does well: handling |
+ user interaction and processing events, based on the latest developments in |
+ HTML5. |
+* **Enterprise applications that require heavy computation:** Native Client |
+ handles the number crunching required by large-scale enterprise apps. To |
+ ensure protection of user data, Native Client enables you to build complex |
+ cryptographic algorithms directly into the browser so that unencrypted data |
+ never goes out over the network. |
+* **Multimedia apps:** Codecs for processing sounds, images, and movies can |
+ be added to the browser in a Native Client web app. |
+* **Games:** Native Client enables a web app to run close to native speed, |
+ reusing existing multithreaded/multicore C/C++ code bases, combined with |
+ low-level access to low-latency audio and (coming soon) networking APIs and |
+ OpenGL ES with programmable shaders. Programming to Native Client also |
+ enables your binary to run unchanged across many platforms. Native Client |
+ is a natural fit for running a physics engine or artificial intelligence |
+ module that powers a sophisticated web game. |
+ |
+Compiling existing native code for your app helps protect the investment you've |
+made in research and development. In addition to the protection offered by |
+Native Client compile-time restrictions, users benefit from the security |
+offered by its runtime validator. The validator decodes modules and limits the |
+instructions that can run in the browser, and the sandboxed environment proxies |
+system calls Users can run Native Client apps without installing a new |
+application or a browser plug-in, and you can update your app without requiring |
+user intervention. |
+ |
+Current limitations |
+=================== |
+ |
+Native Client currently has the following limitations: |
+ |
+* no support for hardware exceptions |
+* no support for process creation / subprocesses |
+* no support for raw TCP/UDP sockets (analogous versions---websockets for TCP |
+ and peer connect for UDP---are in the works and will be available soon) |
+* no support for query to available memory |
+* inline assembly must be compatible with the Native Client validator (you |
+ can use the ncval utility in the SDK to check) |
+ |
+Some of these limitations are required to execute code safely in a browser. To |
+understand the reasons for these limitations read the `Google Chrome technical |
+booklet <http://www.google.com/googlebooks/chrome/index.html>`_ and the `Native |
+Client technical paper |
+<http://src.chromium.org/viewvc/native_client/data/docs_tarball/nacl/googleclient/native_client/documentation/nacl_paper.pdf>`_ |
+(PDF). |
+ |
+How Native Client works |
+======================= |
+ |
+In order to be safe and portable for the web, the executable native code that |
+is produced must be sandbox-safe. More specifically, it cannot cause any |
+malicious or harmful effects on an end-user's machine. Native Client achieves |
+this security through a number of techniques, including API restrictions and |
+use of a modified compilation process. |
+ |
+Even though it provides software-based fault isolation on the x86 architecture, |
+Native Client still maintains the speed of native code---or thereabout. As of |
+current timings, the Native Client sandbox adds only about 5% overhead, which |
+makes it possible to do serious rendering and serious number-crunching in the |
+browser without a big performance hit. |
+ |
+A compiled Native Client module (.nexe file) is loaded into a web page through |
+an <embed> element. Once uploaded to a server, the .html page and the .nexe |
+file(s) define a web application. |
+ |
+To the Native Client runtime system, a Native Client module is simply a set of |
+machine code, formatted to adhere to a few special rules. No matter whether the |
+code starts out as C or C++ or any other language, the Native Client runtime |
+system performs the steps shown in the following figure: |
+ |
+.. image:: /images/NaClExecution.png |
+ |
+To ensure that system resources are untouched, the Native Client runtime system |
+prevents the following unsafe activities: |
+ |
+* Manipulating devices or files directly (instead, a special file system API |
+ is provided) |
+* Directly accessing the operating system |
+* Using self-modifying code to hide the code's intent (such as attempts to |
+ write to protected memory) |
+ |
+Salt & Pepper |
+------------- |
+ |
+Native Client product names follow a salt & pepper theme. Native Client, |
+abbreviated to **NaCl**, started the salt & pepper naming theme. |
+ |
+The Pepper Plug-in API (PPAPI), called **Pepper** for convenience, is an |
+open-source, cross-platform API for web browser plug-ins. From the point of |
+view of Native Client, Pepper is a set of APIs that allow a C or C++ Native |
+Client module to communicate with the hosting browser and get access to |
+system-level functions in a safe and portable way. One of the security |
+constraints in Native Client is that modules cannot make any OS-level calls. |
+Pepper provides analogous APIs that modules can target instead. You can use the |
+Pepper APIs to: |
+ |
+* `talk to the JavaScript code in your application |
+ <https://developers.google.com/native-client/devguide/coding/message-system>`_ |
+ from the C++ code in your NaCl module |
+* `do FileIO |
+ <https://developers.google.com/native-client/devguide/coding/FileIO>`_ |
+* `play audio |
+ <https://developers.google.com/native-client/devguide/coding/audio>`_ |
+* `render 3D graphics |
+ <https://developers.google.com/native-client/devguide/coding/3D-graphics>`_ |
+ |
+The figure below illustrates how Pepper serves as a bridge between Native |
+Client modules and the browser: |
+ |
+.. image:: /images/pepper.jpg |
+ |
+Pepper includes both a C API and a C++ API. The C++ API is a set of bindings |
+written on top of the C API. You can access reference documentation for both |
+the C API and the C++ API through the left-nav on this site. For additional |
+information about Pepper, see `Pepper Concepts |
+<http://code.google.com/p/ppapi/wiki/Concepts>`_. |
+ |
+Application Structure |
+===================== |
+ |
+A Native Client application is divided into three main parts: |
+ |
+* **HTML/JavaScript application:** Provides the user interface and event |
+ handling mechanisms as well as the main HTML document; can perform |
+ computation as well. |
+* **Pepper API:** Enables the JavaScript code and the Native Client module to |
+ send messages to each other, and provides interfaces that allow Native |
+ Client modules to create and use browser resources. |
+* **Native Client module:** Typically, performs numerical computation and |
+ other compute-intensive tasks. Handles large-scale data manipulation. Also |
+ provides event handling APIs for apps such as games where the user interface |
+ is integrated into the code that is run natively. |
+ |
+The following diagram shows how Pepper provides the bridge between the Native |
+Client module's code and the browser's JavaScript: |
+ |
+.. image:: /images/ProgramStructure.png |
+ :align: center |
+ :alt: Program Structure |
+ |
+Files in a Native Client application |
+------------------------------------ |
+ |
+A Native Client application consists of a set of files: |
+ |
+* The **HTML web page**, **CSS**, and **JavaScript** files. Most Native Client |
+ apps contain at least an HTML document, optional CSS for styling of the web |
+ page, and one or more supporting JavaScript files for user interface |
+ objects, event handling, and simple programming tasks and calculations |
+ suitable for the JavaScript layer. |
+* The **Native Client module**. This module contains the native compiled |
+ code, and uses the Pepper Library (included in the SDK), which provides the |
+ bridge between the Native Client module and JavaScript and browser |
+ resources. Currently, the SDK supports the C and C++ languages for Native |
+ Client modules. When compiled, the extension for this filename is |
+ *.nexe*. |
+* A **manifest** file that specifies modules to load for different |
+ processors. This file includes a set of key-value pairs, where a key is the |
+ end-user's processor (for example, x86-32, x86-64, or ARM) and the |
+ corresponding value is the URL of the module compiled for that processor. |
+ The extension for this filename is *.nmf*. |
+ |
+HTML file |
+^^^^^^^^^ |
+ |
+The HTML file contains the ``<embed>`` tag that loads the Native Client module. |
+For example:: |
+ |
+ <embed name="nacl_module" |
+ id="hello_world" |
+ width=0 height=0 |
+ src="hello_world.nmf" |
+ type="application/x-nacl"> |
+ |
+The mimetype for a Native Client module, specified in the ``type`` attribute, is |
+``application/x-nacl``. |
+ |
+Native Client modules are operating system independent, but they are not (yet) |
+processor independent. Therefore, you must compile separate versions of a Native |
+Client module for x86 32-bit, x86 64-bit, ARM, and other processors. The |
+manifest file, specified in the ``src`` attribute of the ``<embed>`` |
+tag, specifies which version of the Native Client module to load depending on |
+the end-user's processor. |
+ |
+Native Client module |
+^^^^^^^^^^^^^^^^^^^^ |
+ |
+You can write a Native Client module in C or C++, and use existing libraries |
+and modules compatible with that language. After you've implemented your |
+functions in the module, you can use the Pepper API to pass messages to and |
+receive messages from the JavaScript/browser side of the application. |
+ |
+ |
+Creating a Native Client application |
+==================================== |
+ |
+Native Client is extremely flexible, allowing for numerous ways to develop an |
+application. The following is one of the more common approaches: |
+ |
+1. :doc:`Download <sdk/download>` the Native Client SDK. You may also need to |
+ download and install Python, which is required to run a number of tools in |
+ the SDK. |
+2. Write the application: |
+ |
+ a. Create a user interface using HTML, JavaScript, and CSS. |
+ b. If necessary, port existing libraries to compile with your Native Client |
+ module. If you find yourself missing a common library, have a look at |
+ `NaCl ports <http://code.google.com/p/naclports>`_, a repository for open |
+ source libraries. Contributions are welcome. |
+ c. Create the Native Client module and `build |
+ <https://developers.google.com/native-client/devguide/devcycle/building>`_ |
+ it using one of the NaCl toolchains in the SDK. |
+3. `Run |
+ <https://developers.google.com/native-client/devguide/devcycle/running>`_ the |
+ application. |
+4. `Distribute |
+ <https://developers.google.com/native-client/devguide/distributing>`_ the |
+ application. |
+ |
+For detailed, step-by-step instructions on how to create a Native Client |
+application, see the `Getting Started Tutorial |
+<https://developers.google.com/native-client/devguide/tutorial>`_. The tutorial |
+includes a basic set of template files that you can modify for your project. |
+ |
+Using existing code |
+=================== |
+ |
+The Native Client SDK comes with a modified version of the GNU toolchain |
+(including GCC and G++) that produces sandbox-safe native code to be run in the |
+browser. This opens the browser to 3D games, video editing, and other |
+applications that can be moved to the web with relatively little effort. Some |
+work is required, however, to keep code safe for execution on the web. For |
+instance, OS-level calls must be redirected to target the Pepper API, and there |
+are also restrictions on how file IO and threading operations work. |
+ |
+Distributing a Native Client application |
+======================================== |
+ |
+The Chrome browser only runs Native Client applications published through the |
+`Chrome Web Store |
+<https://chrome.google.com/webstore/search/%22native%20client%22%20OR%20nativeclient%20OR%20nacl>`_ |
+(CWS). To distribute an application, you must compile the application for both |
+the 32-bit and 64-bit x86 architectures, and publish the application in the |
+CWS. |
+ |
+Native Client has not been standardized yet, and currently it requires |
+compilation for specific instruction set architectures. Google only allows |
+Native Client applications into the CWS if the applications are available for |
+both 32-bit and 64-bit x86 architectures; developers are also strongly |
+encouraged to provide a build for the ARM architecture. The intent behind the |
+current policy of requiring applications to be compiled for multiple |
+architectures is not to bake one instruction set into the web, and to make sure |
+that future architectures are supported as well. |
+ |
+Note that this is only a temporary requirement: The ultimate plan is to create |
+a new version of Native Client executables that can run on any processor. This |
+new Native Client technology is called Portable Native Client (PNaCl, |
+pronounced "pinnacle"), and it is already under development. Instead of |
+generating x86 code or ARM code, PNaCl transforms high-level code into bitcode |
+using a compiler based on the open source LLVM (low-level virtual machine) |
+project. When the browser downloads the bitcode, PNaCl then translates it to |
+native machine code and validates it in the same way Native Client validates |
+machine code today. |
+ |
+PNaCl could potentially give Native Client the same reach as JavaScript, but |
+there are still hurdles to overcome. Part of the problem is that PNaCl has more |
+overhead. Currently PNaCl can execute much faster than JavaScript, but it does |
+not yet start up as quickly. Before officially launching PNaCl, Google wants to |
+make sure to close that gap. |
+ |
+The Native Client SDK |
+===================== |
+ |
+The Native Client SDK includes the following: |
+ |
+* GNU-based toolchains: gcc, g++, as, ld, gdb, and other tools customized for |
+ Native Client |
+* API libraries (Pepper, POSIX) |
+* Makefiles for building Native Client applications |
+* Examples |
+* Documentation |
+ |
+Versioning |
+========== |
+ |
+Chrome releases on a six week cycle, and developer versions of Chrome are |
+pushed to the public beta channel three weeks before release. As with any |
+software, each release of Chrome includes changes to Native Client and the |
+Pepper interfaces that may require modification to existing applications. |
+However, modules compiled for one version of Pepper/Chrome should generally |
+work with subsequent versions of Pepper/Chrome. The SDK includes multiple |
+`versions <https://developers.google.com/native-client/version>`_ of the Pepper |
+APIs to help developers make adjustments to API changes and take advantage of |
+new features. |