GPU workaround to simulate Out of Memory errors with large textures
[chromium-blink-merge.git] / native_client_sdk / src / doc / faq.rst
blob5108f5e6c6554ad726cf41ee838b407df3d0de8c
1 ##########################
2 Frequently Asked Questions
3 ##########################
5 .. contents::
6   :local:
7   :backlinks: none
8   :depth: 2
10 This document answers some frequently asked questions about Native
11 Client (NaCl) and Portable Native Client (PNaCl, pronounced
12 "pinnacle"). For a high-level overview of Native Client, see the
13 :doc:`Technical Overview <overview>`.
15 If you have questions that aren't covered in this FAQ:
17 * Scan through the :doc:`Release Notes <sdk/release-notes>`.
18 * Search through or ask on the :doc:`Native Client Forums <help>`.
21 What is Native Client Good For?
22 ===============================
24 Why did Google build Native Client?
25 -----------------------------------
27 * **Performance:** Native Client modules run nearly as fast as native
28   compiled code.
29 * **Security:** Native Client lets users run native compiled code in the
30   browser with the same level of security and privacy as traditional web
31   applications.
32 * **Convenience:**
34   * Developers can leverage existing code, written in C/C++ or other
35     languages, in their applications without forcing users to install a
36     plugin.
37   * This code can interact with the embedding web page as part of an
38     HTML and JavaScript web application, or it can be a self-contained
39     and immersive experience.
41 * **Portability:** Native Client and Portable Native Client applications
42   can execute on:
44   * The Windows, Mac, Linux or ChromeOS operating systems.
45   * Processors with the x86-32, x86-64, or ARM instruction set
46     architectures. Native Client also has experimental support for MIPS.
48 Portable Native client further enhances the above:
50 * **Performance:** Each PNaCl release brings with it more performance
51   enhancements. Already-released applications get faster over time,
52   conserving user's battery.
53 * **Security:** Users are kept secure with an ever-improving sandbox
54   model which adapts to novel attacks, without affecting
55   already-released applications.
56 * **Convenience:** Developers only need to ship a single ``.pexe`` file,
57   not one ``.nexe`` file per supported architecture.
58 * **Portability:** Developers and users don't need to worry about
59   already-released applications not working on new hardware: PNaCl
60   already supports all architectures NaCl does, and as PNaCl evolves it
61   gains support for new processors and fully uses their capabilities.
63 .. TODO Expand on the PNaCl performance section in another document, and
64 .. link to it here. How does one profile PNaCl code? What are common
65 .. causes of slowness? How can code be made faster? What's the best way
66 .. to use Pepper's asynchronous APIs? What do I need to know about
67 .. threads and inter-thread communications? Can I use SIMD or other
68 .. processor-specific instructions? What about the GPU?
70 For more details, refer to the :doc:`history behind and comparison of
71 NaCl and PNaCl <nacl-and-pnacl>`.
73 When should I use Portable Native Client instead of Native Client?
74 ------------------------------------------------------------------
76 See :doc:`NaCl and PNaCl <nacl-and-pnacl>`. In short: PNaCl works on the Open
77 Web platform delivered by Chrome whereas NaCl only works on the Chrome Web
78 Store.
80 When should I use Portable Native Client / Native Client?
81 ---------------------------------------------------------
83 The following are some typical use cases. For details, see the
84 :doc:`Technical Overview <overview>`.
86 * Porting existing applications or software components, written in C/C++ or
87   virtual machines written in C/C++, for use in a web application.
88 * Using compute-intensive applications, including threads and SIMD, such as:
90   * Scientific computing.
91   * Handling multimedia for a web application.
92   * Various aspects of web-based games, including physics engines and AI.
94 * Running untrusted code on a server or within an application (such as a plugin
95   system for a game).
97 Portable Native Client and Native Client are versatile technologies which are
98 used in many other contexts outside of Chrome.
100 How fast does code run in Portable Native Client?
101 -------------------------------------------------
103 Fast! The SPEC2k benchmarks (C, C++ and floating-point benchmarks) give
104 the following overhead for optimized PNaCl compared to regular optimized
105 LLVM:
107 +--------+-----+
108 | x86-32 | 15% |
109 +--------+-----+
110 | x86-64 | 25% |
111 +--------+-----+
112 |  ARM   | 10% |
113 +--------+-----+
115 Note that benchmark performance is sometimes bimodal, so different use
116 cases are likely to achieve better or worse performance than the above
117 averages. For example floating-point heavy code usually exhibits much
118 lower overheads whereas very branch-heavy code often performs worse.
120 Note that PNaCl supports performance features that are often used in
121 native code such as :ref:`threading <language_support_threading>` and
122 :ref:`Portable SIMD Vectors <portable_simd_vectors>`.
124 For details, see:
126 * `PNaCl SIMD: Speed on the Web`_.
127 * `Adapting Software Fault Isolation to Contemporary CPU Architectures`_ (PDF).
128 * `Native Client: A Sandbox for Portable, Untrusted x86 Code`_ (PDF).
130 If your code isn't performing as close to native speed as you'd expect,
131 :doc:`let us know <help>`!
133 .. TODO Link to the non-existent performance page! (see above todo).
135 Why use Portable Native Client instead of *<technology X>*?
136 -----------------------------------------------------------
138 Many other technologies can be compared to Portable Native Client:
139 Flash, Java, Silverlight, ActiveX, .NET, asm.js, etc...
141 Different technologies have different strengths and weaknesses. In
142 appropriate contexts, Portable Native Client can be faster, more secure,
143 and/or more compatible across operating systems and architectures than
144 other technologies.
146 Portable Native Client complement other technologies by giving web
147 developers a new capability: the ability to run fast, secure native code
148 from a web browser in an architecture-independent way.
150 If I want direct access to the OS, should I use Native Client?
151 --------------------------------------------------------------
153 No---Native Client does not provide direct access to the OS or devices,
154 or otherwise bypass the JavaScript security model. For more information,
155 see later sections of this FAQ.
158 Development Environments and Tools
159 ==================================
161 What development environment and development operating system do you recommend?
162 -------------------------------------------------------------------------------
164 You can develop on Windows, Mac, or Linux, and the resulting Native Client or
165 Portable Native Client application will run inside the Google Chrome browser on
166 all those platforms as well as ChromeOS. You can also develop on ChromeOS with
167 Crouton_ or our `experimental development environment which runs within NaCl`_,
168 and we're working on self-hosting a full development environment on Portable
169 Native Client.
171 Any editor+shell combination should work as well as IDEs like Eclipse,
172 Visual Studio with the :doc:`Native Client Add-In
173 <devguide/devcycle/vs-addin>` on Windows, or Xcode on Mac OSX.
175 I'm not familiar with native development tools, can I still use the Native Client SDK?
176 --------------------------------------------------------------------------------------
178 You may find our :doc:`Tutorial <devguide/tutorial/index>` and :doc:`Building
179 instructions <devguide/devcycle/building>` useful, and you can look at
180 the code and Makefiles for the SDK examples to understand how the
181 examples are built and run.
183 You'll need to learn how to use some tools (like GCC, LLVM, make, Eclipse,
184 Visual Studio, or Xcode) before you can get very far with the SDK. Try seaching
185 for an `introduction to GCC`_.
188 Openness, and Supported Architectures and Languages
189 ===================================================
191 Is Native Client open? Is it a standard?
192 ----------------------------------------
194 Native Client is completely open: the executable format is open and the
195 `source code is open <https://code.google.com/p/nativeclient/>`_. Right
196 now the Native Client project is in its early stages, so it's premature
197 to consider Native Client for standardization.
199 We consistenly try to document our design and implementation and hope to
200 standardize Portable Native Client when it gains more traction. A good
201 example is our :doc:`PNaCl bitcode reference manual
202 <reference/pnacl-bitcode-abi>`.
204 How can I contribute to Native Client?
205 --------------------------------------
207 Read about :doc:`contributor ideas <reference/ideas>`.
209 What are the supported instruction set architectures?
210 -----------------------------------------------------
212 Portable Native Client uses an architecture-independent format (the
213 ``.pexe``) which can currently be translated to execute on processors
214 with the x86-32, x86-64, and ARM instruction set architectures, as well
215 as experimental support for MIPS. As new architectures come along and
216 become popular we expect Portable Native Client to support them without
217 developers having to recompile their code.
219 Native Client can currently execute on the same architectures as
220 Portable Native Client but is only supported on the Chrome Web
221 Store. Native Client's ``.nexe`` files are architecture-dependent and
222 cannot adapt to new architectures without recompilation, we therefore
223 deem them better suited to a web store than to the open web.
225 With Portable Native Client we deliver a system that has comparable
226 portability to JavaScript and can adapt to new instruction set
227 architectures without requiring recompilation. The web is better when
228 it's platform-independent, and we'd like it to stay that way.
230 .. _other_languages:
232 Do I have to use C or C++? I'd really like to use another language.
233 -------------------------------------------------------------------
235 Right now only C and C++ are supported directly by the toolchain in the SDK. C#
236 and other languages in the .NET family are supported via the `Mono port`_ for
237 Native Client. Moreover, there are several ongoing projects to support
238 additional language runtimes (e.g. `naclports supports Lua, Python and Ruby`_)
239 as well as to compile more languages to LLVM's intermediate representation
240 (e.g. support Halide_, Haskell with GHC_ or support Fortran with flang_), or
241 transpile languages to C/C++ (source-to-source compilation). Even JavaScript is
242 supported by compiling V8_ to target PNaCl.
244 The PNaCl toolchain is built on LLVM and can therefore generate code from
245 languages such as Rust_, Go_, or Objective-C, but there may still be a few rough
246 edges.
248 If you're interested in getting other languages working, please contact the
249 Native Client team by way of the native-client-discuss_ mailing list, and read
250 through :doc:`contributor ideas <reference/ideas>`.
252 Do you only support Chrome? What about other browsers?
253 ------------------------------------------------------
255 We aim to support multiple browsers. However, a number of features that
256 we consider requirements for a production-quality system that keeps the
257 user safe are difficult to implement without help from the
258 browser. Specific examples are an out-of-process plugin architecture and
259 appropriate interfaces for integrated 3D graphics. We have worked
260 closely with Chromium developers to deliver these features and we are
261 eager to collaborate with developers from other browsers.
263 What's the difference between NPAPI and Pepper?
264 -----------------------------------------------
266 :doc:`Pepper <pepper_stable/index>` (also known as PPAPI) is a new API that
267 lets Native Client modules communicate with the browser. Pepper supports
268 various features that don't have robust support in NPAPI, such as event
269 handling, out-of-process plugins, and asynchronous interfaces. Native
270 Client has transitioned from using NPAPI to using Pepper.
272 Is NPAPI part of the Native Client SDK?
273 ---------------------------------------
275 NPAPI is not supported by the Native Client SDK, and is `deprecated in Chrome`_.
277 Does Native Client support SIMD vector instructions?
278 ----------------------------------------------------
280 Portable Native Client supports portable SIMD vectors, as detailed in
281 :ref:`Portable SIMD Vectors <portable_simd_vectors>`.
283 Native Client supports SSE, AVX1, FMA3 and AVX2 (except for `VGATHER`) on x86
284 and NEON on ARM.
286 Can I use Native Client for 3D graphics?
287 ----------------------------------------
289 Yes. Native Client supports `OpenGL ES 2.0`_.
291 To alert the user regarding their hardware platform's 3D feature set
292 before loading a large NaCl application, see :doc:`Vetting the driver in
293 Javascript <devguide/coding/3D-graphics>`.
295 Some GL extensions are exposed to Native Client applications, see the `GLES2
296 file`_.  This file is part of the GL wrapper supplied by the library
297 ``ppapi_gles2`` which you'll want to include in your project.  In most cases
298 extensions map to extensions available on other platforms, or differ very
299 slightly (if they differ, the extension is usually CHROMIUM or ANGLE instead of
300 EXT).
302 .. TODO Improve documentation for GL extensions.
304 Does Native Client support concurrency/parallelism?
305 ---------------------------------------------------
307 Native Client and Portable Native Client both support pthreads,
308 C11/C++11 threads, and low-level synchronization primitives (mutex,
309 barriers, atomic read/modify/write, compare-and-exchange, etc...), thus
310 allowing your Native Client application to utilize several CPU cores.
311 Note that this allows you to modify datastructures concurrently without
312 needing to copy them, which is often a limitation of shared-nothing
313 systems. For more information see :ref:`memory model and atomics
314 <memory_model_and_atomics>` and :ref:`threading
315 <language_support_threading>`.
317 Native Client doesn't support HTML5 Web Workers directly but can
318 interact with JavaScript code which does.
321 Coming Soon
322 ===========
324 Do Native Client modules have access to external devices?
325 ---------------------------------------------------------
327 At this time Native Client modules do not have access to serial ports,
328 camera devices, or microphones: Native Client can only use native
329 resources that today's browsers can access. However, we intend to
330 recommend such features to the standards bodies and piggyback on their
331 efforts to make these resources available inside the browser.
333 You can generally think of Pepper as the C/C++ bindings to the
334 capabilities of HTML5. The goal is for Pepper and JavaScript to evolve
335 together and stay on par with each other with respect to features and
336 capabilities.
339 Security and Privacy
340 ====================
342 What happens to my data when I use Native Client?
343 -------------------------------------------------
345 Users can opt-in to sending usage statistics and crash information in
346 Chrome, which includes usage statistics and crash information about
347 Native Client. Crashes in your code won't otherwise send your
348 information to Google: Google counts the number of such crashes, but
349 does so anonymously without sending your application's data or its debug
350 information.
352 For additional information about privacy and Chrome, see the `Google Chrome
353 privacy policy`_ and the `Google Chrome Terms of Service`_.
355 How does Native Client prevent sandboxed code from doing Bad Things?
356 --------------------------------------------------------------------
358 Native Client's sandbox works by validating the untrusted code (the
359 compiled Native Client module) before running it. The validator checks
360 the following:
362 * **Data integrity:** No loads or stores are permitted outside of the
363   data sandbox. In particular this means that once loaded into memory,
364   the binary is not writable. This is enforced by operating system
365   protection mechanisms. While new instructions can be inserted at
366   runtime to support things like JIT compilers, such instructions will
367   be subject to runtime verification according to the following
368   constraints before they are executed.
369 * **No unsafe instructions:** The validator ensures that the Native
370   Client application does not contain any unsafe instructions. Examples
371   of unsafe instructions are ``syscall``, ``int``, and ``lds``.
372 * **Control flow integrity:** The validator ensures that all direct and
373   indirect branches target a safe instruction.
375 The beauty of the Native Client sandbox is in reducing "safe" code to a
376 few simple rules that can be verified by a small trusted validator: the
377 compiler isn't trusted. The same applies to Portable Native Client where
378 even the ``.pexe`` to ``.nexe`` translator, a simplified compiler
379 backend, isn't trusted: it is validated before executing, and so is its
380 output.
382 In addition to static analysis of untrusted code, the Native Client runtime also
383 includes an outer sandbox that mediates system calls. For more details about
384 both sandboxes, see `Native Client: A Sandbox for Portable, Untrusted x86 Code`_
385 (PDF).
387 How does Google know that the safety measures in Native Client are sufficient?
388 ------------------------------------------------------------------------------
390 Google has taken several steps to ensure that Native Client's security works,
391 including:
393 * Open source, peer-reviewed papers describing the design.
394 * A :doc:`security contest <community/security-contest/index>`.
395 * Multiple internal and external security reviews.
396 * The ongoing vigilance of our engineering and developer community.
398 Google is committed to making Native Client safer than JavaScript and other
399 popular browser technologies. If you have suggestions for security improvements,
400 let the team know, by way of the native-client-discuss_ mailing list.
402 Development
403 ===========
405 How do I debug?
406 ---------------
408 Instructions on :ref:`debugging the SDK examples
409 <debugging_the_sdk_examples>` using GDB are available. You can also
410 debug Native Client modules with some :doc:`alternative approaches
411 <devguide/devcycle/debugging>`.
413 How do I build x86-32, x86-64 or ARM ``.nexes``?
414 ------------------------------------------------
416 By default, the applications in the ``/examples`` folder create
417 architecture-independent ``.pexe`` for Portable Native Client. To
418 generate a ``.nexe`` targetting one specific architecture using the
419 Native Client or Portable Native Client toolchains, see the
420 :doc:`Building instructions <devguide/devcycle/building>`.
422 How can my web application determine which ``.nexe`` to load?
423 -------------------------------------------------------------
425 Your application does not need to make the decision of loading an
426 x86-32, x86-64 or ARM ``.nexe`` explicitly---the Native Client runtime
427 examines a manifest file (``.nmf``) to pick the right ``.nexe`` file for
428 a given user. You can generate a manifest file using a Python script
429 that's included in the SDK (see the ``Makefile`` in any of the SDK
430 examples for an illustration of how to do so). Your HTML file specifies
431 the manifest filename in the ``src`` attribute of the ``<embed>``
432 tag. You can see the way the pieces fit together by examining the
433 examples included in the SDK.
435 Is it possible to build a Native Client module with just plain C (not C++)?
436 ---------------------------------------------------------------------------
438 Yes. See the ``"Hello, World!"`` in C example in the SDK under
439 ``examples/tutorial/using_ppapi_simple/``, or the Game of Life example
440 under ``examples/demo/life/life.c``.
442 What UNIX system calls can I make through Native Client?
443 --------------------------------------------------------
445 Native Client doesn't directly expose any system calls from the host OS
446 because of the inherent security risks and because the resulting
447 application would not be portable across operating systems. Instead,
448 Native Client provides portable cross-OS abstractions wrapping or
449 proxying OS functionality or emulating UNIX system calls. For example,
450 Native Client provides an ``mmap()`` system call that behaves much like
451 the standard UNIX ``mmap()`` system call.
453 Is my favorite third-party library available for Native Client?
454 ---------------------------------------------------------------
456 Google has ported several third-party libraries to Native Client; such libraries
457 are available in the naclports_ project. We encourage you to contribute
458 libraries to naclports, and/or to host your own ported libraries, and to let the
459 team know about it on native-client-discuss_ when you do. You can also read
460 through :doc:`contributor ideas <reference/ideas>` to find ideas of new projects
461 to port.
463 Do all the files in an application need to be served from the same domain?
464 --------------------------------------------------------------------------
466 The ``.nmf``, and ``.nexe`` or ``.pexe`` files must either be served from the
467 same origin as the embedding page or an origin that has been configured
468 correctly using CORS_.
470 For applications installed from the Chrome Web Store the Web Store manifest
471 must include the correct, verified domain of the embedding page.
473 Portability
474 ===========
476 Do I have to do anything special to make my application run on different operating systems?
477 -------------------------------------------------------------------------------------------
479 No. Native Client and Portable Native Client applications run without
480 modification on all supported operating systems.
482 However, to run on different instruction set architectures (such as
483 x86-32, x86-64 or ARM), you currently have to either:
485 * Use Portable Native Client.
486 * Build and supply a separate ``.nexe`` file for each architecture, and
487   make them available on the Chrome Web Store. See :doc:`target
488   architectures <devguide/devcycle/building>` for details about which
489   ``.nexe`` files will run on which architectures.
491 How easy is it to port my existing native code to Native Client?
492 ----------------------------------------------------------------
494 In most cases you won't have to rewrite much, if any, code. The Native
495 Client-specific tools, such as ``pnacl-clang++`` or ``x86_64-nacl-g++``,
496 take care of most of the necessary changes. You may need to make some
497 changes to your operating system calls and interactions with external
498 devices to work with the web. Porting existing Linux libraries is
499 generally straightforward, with large libraries often requiring no
500 source change.
502 The following kinds of code may be more challenging to port:
504 * Code that does direct `TCP <pepper_stable/cpp/classpp_1_1_t_c_p_socket>`_ or
505   `UDP <pepper_stable/cpp/classpp_1_1_u_d_p_socket>`_ networking. For security
506   reasons these APIs are only available to `Chrome apps </apps>`_ after asking
507   for the appropriate permissions, not on the open web. Native Client is
508   otherwise restricted to the networking APIs available in the browser. You may
509   want to use to `nacl_io library <nacl_io>`_ to use POSIX-like sockets.
510 * Code that creates processes, including UNIX ``fork``, won't function
511   as-is. However, threads are supported. You can nonetheless create new
512   ``<embed>`` tags in your HTML page to launch new PNaCl processes. You can even
513   use new ``.pexe`` files that your existing ``.pexe`` saved in a local
514   filesystem. This is somewhat akin to ``execve``, but the process management
515   has to go through ``postMessage`` to JavaScript in order to create the new
516   ``<embed>``.
517 * Code that needs to do local file I/O. Native Client is restricted to accessing
518   URLs and to local storage in the browser (the Pepper :doc:`File IO API
519   <devguide/coding/file-io>` has access to the same per-application storage that
520   JavaScript has via Local Storage). HTML5 File System can be used, among
521   others. For POSIX compatabiliy the Native Client SDK includes a library called
522   nacl_io which allows the application to interact with all these types of files
523   via standard POSIX I/O functions (e.g. ``open`` / ``fopen`` / ``read`` /
524   ``write`` / ...). See :doc:`Using NaCl I/O <devguide/coding/nacl_io>` for more
525   details.
527 .. _faq_troubleshooting:
529 Troubleshooting
530 ===============
532 My ``.pexe`` isn't loading, help!
533 ---------------------------------
535 * You must use Google Chrome version 31 or greater for Portable Native
536   Client. Find your version of chrome by opening ``about:chrome``, and `update
537   Chrome <http://www.google.com/chrome/>`_ if you are on an older version. If
538   you're already using a recent version, open ``about:components`` and "Check
539   for update" for PNaCl. Note that on ChromeOS PNaCl is always up to date,
540   whereas on other operating systems it updates shortly after Chrome updates.
541 * A PNaCl ``.pexe`` must be compiled with pepper_31 SDK or higher. :ref:`Update
542   your bundles <updating-bundles>` and make sure you're using a version of
543   Chrome that matches the SDK version. 
544 * Your application can verify that Portable Native Client is supported
545   in JavaScript with ``navigator.mimeTypes['application/x-pnacl'] !==
546   undefined``. This is preferred over checking the Chrome version.
548 My ``.nexe`` files never finish loading. What gives?
549 ----------------------------------------------------
551 Here are ways to resolve some common problems that can prevent loading:
553 * You must use Google Chrome version 14 or greater for Native Client.
554 * If you haven't already done so, enable the Native Client flag in
555   Google Chrome. Type ``about:flags`` in the Chrome address bar, scroll
556   down to "Native Client", click the "Enable" link, scroll down to the
557   bottom of the page, and click the "Relaunch Now" button (all browser
558   windows will restart).
559 * Verify that the Native Client plugin is enabled in Google Chrome. Type
560   ``about:plugins`` in the Chrome address bar, scroll down to "Native
561   Client", and click the "Enable" link. (You do not need to relaunch
562   Chrome after you enable the Native Client plugin).
563 * Make sure that the ``.nexe`` files are being served from a web
564   server. Native Client uses the same-origin security policy, which
565   means that modules will not load in pages opened with the ``file://``
566   protocol. In particular, you can't run the examples in the SDK by
567   simply dragging the HTML files from the desktop into the browser. See
568   :doc:`Running Native Client Applications <devguide/devcycle/running>`
569   for instructions on how to run the httpd.py mini-server included in
570   the SDK.
571 * The ``.nexe`` files must have been compiled using SDK version 0.5 or
572   greater.
573 * You must load the correct ``.nexe`` file for your machine's specific
574   instruction set architecture (x86-32, x86-64 or ARM). You can ensure
575   you're loading the correct ``.nexe`` file by building a separate
576   ``.nexe`` for each architecture, and using a ``.nmf`` manifest file to
577   let the browser select the correct ``.nexe`` file. Note: the need to
578   select a processor-specific ``.nexe`` goes away with Portable Native
579   Client.
580 * If things still aren't working, :doc:`ask for help <help>`!
583 .. _`PNaCl SIMD: Speed on the Web`: https://www.youtube.com/watch?v=675znN6tntw&list=PLOU2XLYxmsIIwGK7v7jg3gQvIAWJzdat_
584 .. _Adapting Software Fault Isolation to Contemporary CPU Architectures: https://nativeclient.googlecode.com/svn/data/site/NaCl_SFI.pdf
585 .. _`Native Client: A Sandbox for Portable, Untrusted x86 Code`: http://research.google.com/pubs/pub34913.html
586 .. _Crouton: https://github.com/dnschneid/crouton
587 .. _experimental development environment which runs within NaCl: https://www.youtube.com/watch?v=OzNuzBDEWzk&list=PLOU2XLYxmsIIwGK7v7jg3gQvIAWJzdat_
588 .. _introduction to GCC: https://www.google.com/search?q=gcc+introduction
589 .. _Mono port: https://github.com/elijahtaylor/mono
590 .. _naclports supports Lua, Python and Ruby: https://code.google.com/p/naclports/source/browse#svn%2Ftrunk%2Fsrc%2Fexamples%2Ftools
591 .. _Halide: http://halide-lang.org/
592 .. _GHC: http://www.haskell.org/ghc/docs/latest/html/users_guide/code-generators.html
593 .. _flang: https://flang-gsoc.blogspot.ie/2013/09/end-of-gsoc-report.html
594 .. _V8: https://code.google.com/p/v8/
595 .. _Rust: http://www.rust-lang.org/
596 .. _Go: https://golang.org
597 .. _native-client-discuss: https://groups.google.com/group/native-client-discuss
598 .. _deprecated in Chrome: http://blog.chromium.org/2013/09/saying-goodbye-to-our-old-friend-npapi.html
599 .. _OpenGL ES 2.0: https://www.khronos.org/opengles/
600 .. _GLES2 file: https://code.google.com/p/chromium/codesearch#chromium/src/ppapi/lib/gl/gles2/gles2.c
601 .. _Google Chrome privacy policy: https://www.google.com/chrome/intl/en/privacy.html
602 .. _Google Chrome Terms of Service: https://www.google.com/chrome/intl/en/eula_text.html
603 .. _naclports: https://code.google.com/p/naclports
604 .. _CORS: http://en.wikipedia.org/wiki/Cross-origin_resource_sharing