技术概述
对于 ChromeOS 以外的平台,已宣布弃用此处描述的技术。请访问我们的迁移指南了解详细信息。
Native Client (NaCl) 是一种用于在浏览器中运行本机编译代码的开源技术,其目标是保持用户对 Web 应用程序的期望的可移植性和安全性。Native Client 将 Web 编程扩展到 JavaScript 之外,使您能够使用首选语言增强 Web 应用程序。本文档介绍了 Native Client 的一些主要优势和常见用例。
Google 已经在 Windows、Mac、Linux 和 Chrome OS 的 Chrome 浏览器中实施了开源Native Client 项目。本机客户端软件开发工具包 (SDK)本身是一个开源项目,可让您创建使用 NaCl 并在 Chrome 中跨多个平台运行的 Web 应用程序。
Native Client Web 应用程序由 JavaScript、HTML、CSS 和以 SDK 支持的语言编写的 NaCl 模块组成。NaCl SDK 目前支持 C 和 C++;随着其他语言的编译器的开发,SDK 将更新。
带有和不带有 Native Client 的 Web 应用程序
Native Client 有两种风格:传统 (NaCl) 和便携式 (PNaCl)。传统,必须通过 Chrome 网上应用店分发,可让您针对特定的硬件平台。便携式可以在开放的网络上运行。可以从任何 Web 服务器加载的位代码文件被下载到客户端机器,并在执行之前转换为特定于硬件的代码。有关详细信息,请参阅NaCl 和 PNaCl。
为什么要使用本地客户端?
本机客户端开源技术旨在以接近本机的速度在浏览器内安全地运行编译代码。Native Client 为 Web 应用程序提供了桌面软件的一些优势。具体来说,它提供了充分利用客户端计算资源的方法,例如:
- 3D游戏
- 多媒体编辑
- CAD建模
- 客户端数据分析
- 交互式模拟。
Native Client 为 C 和 C++(以及其他面向它的语言)提供了与 JavaScript 相同级别的可移植性和安全性。
本地客户端的好处
本机客户端的好处包括:
- 图形、音频等:运行本机代码模块来渲染 2D 和 3D 图形、播放音频、响应鼠标和键盘事件、在多线程上运行以及直接访问内存——所有这些都不需要用户安装插件.
- 可移植性:一次编写您的应用程序并在多个操作系统(Windows、Linux、Mac 和 Chrome OS)和 CPU 架构(x86 和 ARM)上运行它们。
- 轻松迁移到网络:利用现有桌面应用程序中多年的工作。Native Client 使从桌面到 Web 应用程序的转换变得更加容易,因为它支持 C 和 C++。
- 安全性:通过 Native Client 的双沙箱模型保护用户系统免受恶意或有缺陷的应用程序的影响。此模型提供传统 Web 应用程序的安全性,而不会牺牲性能,也无需用户安装插件。
- 性能:以原生桌面应用程序 5% 到 15% 的速度运行。Native Client 还允许应用程序通过线程 API 来利用所有可用的 CPU 内核。这使得要求苛刻的应用程序(例如控制台质量的游戏)能够在浏览器中运行。
常见用例
Native Client 的典型用例包括:
- 现有软件组件: Native Client 让您可以在 Web 应用程序中重新利用现有的 C 和 C++ 软件。您不需要重写和调试已经运行的代码。它还可以让您的应用程序利用浏览器擅长的事情,例如处理用户交互和处理事件。您还可以利用 HTML5 的最新发展。
- 传统桌面应用程序: Native Client 提供了从桌面应用程序到 Web 的平滑迁移路径。您可以将应用程序计算引擎的现有代码直接移植和重新编译到 Native Client,并且只需要为浏览器重建用户界面和事件处理部分。
- 企业应用中的繁重计算: Native Client 可以处理大型企业应用所需的数字运算。为确保保护用户数据,Native Client 允许您直接在浏览器中运行复杂的加密算法,以便未加密的数据永远不会通过网络流出。
- 多媒体应用程序:用于处理声音、图像和电影的编解码器可以添加到浏览器的 Native Client 模块中。
- 游戏: Native Client 让 Web 应用程序以接近本机的速度运行,重用现有的多线程/多核 C/C++ 代码库,并使用可编程着色器访问低延迟音频、网络 API 和 OpenGL ES。Native Client 非常适合运行支持复杂网络游戏的物理引擎或人工智能模块。Native Client 还使应用程序能够在许多平台上以不变的方式运行。
- 任何需要加速的应用程序: Native Client 无缝融入 Web 应用程序。您可以决定在多大程度上使用它。Native Client 的使用涵盖了从完整应用程序到加速 Web 应用程序重要部分的小型优化例程的整个范围。
本机客户端的工作原理
Native Client 是一组相关软件组件的总称,用于开发 C/C++ 应用程序并在 Web 上安全地运行它们。在较高级别上,Native Client 包括:
- 工具链:将 C/C++ 代码转换为可移植 Native Client 模块或 Native Client 模块的开发工具(编译器、链接器等)的集合。
- 运行时组件:嵌入在浏览器或其他主机平台中的组件,允许安全高效地执行 Native Client 模块。
下图显示了这些组件如何交互:
本机客户端工具链及其输出
工具链
Native Client 工具链由编译器、链接器、汇编器和其他用于将 C/C++ 源代码转换为可由浏览器加载的模块的工具组成。
Native Client SDK 提供了两个工具链:
- 图表的左侧显示了便携式本地客户端(PNaCl,发音为“pinnacle”)。基于 LLVM 的工具链生成单个可移植 ( pexe ) 模块。在运行时,内置于浏览器中的提前 (AOT) 转换器将 pexe 转换为相关客户端架构的本机代码。
- 图表右侧显示(非便携式) Native Client。基于 GCC 的工具链生成多个依赖于体系结构 ( nexe ) 的模块,这些模块被打包到一个应用程序中。在运行时,浏览器会根据客户端机器的架构确定加载哪个 nexe。
建议将 PNaCl 工具链用于大多数应用程序。NaCl-GCC 工具链应仅用于不会在开放网络上分发的应用程序。
安全
由于 Native Client 允许在客户端机器上执行本机代码,因此必须实施特殊的安全措施:
- NaCl 沙箱确保代码仅通过安全的、列入白名单的 API 访问系统资源,并在其限制范围内运行,而不会试图干扰在浏览器内或浏览器外运行的其他代码。
- NaCl 验证器在运行之前静态分析代码,以确保它只使用允许和安全的代码和数据模式。
这些安全措施是对 Chrome 浏览器中现有沙箱的补充。Native Client 模块始终在具有受限权限的进程中执行。此过程与外部世界之间的唯一交互是通过定义的浏览器界面。因为NaCl沙箱和Chrome沙箱的结合,我们说Native Client采用了双沙箱设计。
可移植性
便携式本地客户端(PNaCl,发音为“pinnacle”)采用最先进的编译器技术将 C/C++ 源代码编译为便携式位代码可执行文件 ( pexe )。PNaCl 位码是一种独立于操作系统和体系结构的格式,可以在网络上自由分发并嵌入到网络应用程序中。
PNaCl 翻译器是嵌入在 Chrome 浏览器中的一个组件;它的任务是运行 pexe 模块。在内部,翻译器将 pexe 编译为 nexe(如上所述),然后如上所述在 Native Client 沙箱中执行 nexe。翻译器使用智能缓存来避免重新编译之前在客户端浏览器上编译过的 pexe。
Native Client 还支持直接在浏览器中执行 nexe 模块。但是,由于 nexe 包含特定于体系结构的机器代码,因此不允许在开放网络上分发它们。它们只能用作从 Chrome 网上应用店安装的应用程序和扩展程序的一部分。
有关 NaCl 和 PNaCl 之间区别的更多详细信息,请参阅NaCl 和 PNaCl。
Web 应用程序的结构
Native Client 应用程序由一组文件组成:
HTML 和 CSS: HTML 文件通过 embed 标签告诉浏览器在哪里可以找到清单(nmf 文件)。
<embed name="mygame" src="mygame.nmf" type="application/x-pnacl" />
- 清单:清单标识要加载的模块并指定选项。例如,“mygame.nmf”可能如下所示:
{... ... "url": "mygame.pexe", }
- pexe(便携式 NaCl 文件):已编译的 Native Client 模块。它使用Pepper API,它为 JavaScript 和其他浏览器资源提供了桥梁。
Web 应用程序的结构
有关更多详细信息,请参阅应用程序结构。
Pepper 插件 API
Pepper 插件 API (PPAPI),为方便起见称为Pepper,是一种用于 Web 浏览器插件的开源、跨平台 C/C++ API。Pepper 允许 C/C++ 模块与托管浏览器通信并以安全和可移植的方式访问系统级功能。Native Client 的安全限制之一是模块不能进行操作系统级调用。Pepper 提供了模块可以使用的类似 API。
您可以使用 Pepper API 来访问浏览器的全部功能,包括:
- 从 NaCl 模块中的 C++ 代码与应用程序中的 JavaScript 代码对话。
- 做文件 I/O。
- 播放音频。
- 渲染 3D 图形。
Pepper 包括C API和C++ API。C++ API 是在 C API 之上编写的一组绑定。有关 Pepper 的其他信息,请参阅Pepper 概念。
从哪儿开始
该快速启动文件提供链接下载和文件,以帮助您开始开发和发布本机客户端应用程序。