漫谈 Google 的 Native Client(NaCl) 技术(二)---- 技术篇(兼谈 LLVM)
转自:http://hzx5.blog.163.com/blog/static/40744388201172531637729/
漫谈 Google 的 Native Client(NaCl) 技术(二)---- 技术篇(兼谈 LLVM)
上一篇文章介绍 Google 的 Native Client 技术的渊源及动力,解释了为什么 Google 要做这样一个技术。在这篇文章中,将介绍 Native Client 的一些技术概要。
Native Client简介
Native Client 是 Google 在浏览器领域推出的一个开源技术,它允许在浏览器内编译 Web 应用程序,并执行原生的编译好的代码。Native Client 有以下几个优势(参考 Google 官方英文介绍):
- 为 Web 提供更多的图形,音频以及其他功能:可以直接在 web 上执行原生的 2D,3D 图形渲染程序(对 Web 游戏很有用),播放音视频,响应鼠标键盘事件,多线程执行代码等等,而这一切,不需要浏览器安装任何插件。
- 良好的可移植性:一个 Web 程序,只需要开发一份代码,即可以在所有平台(包括 Windows,linux,Mac 等)运行。
- 高安全性:安装不被信任的桌面程序一级浏览器插件,可能带来很高的安全风险(如程序携带木马,病毒)。而 Native client 使用了双层沙盒(sandbox)设计来保护用户的本地资源。Native Client 的架构可以保证 web 应用的安全性,并且取得和原声代码相同或相近的性能。
- 方便从桌面迁移:很多开发厂商之前花了大力气开发桌面程序,随着云计算的到来,越来越多的程序会被移植到互联网上,由于 NaCl 支持直接执行 C/C++/Java 等代码,Native Client 技术可以简化移植过程,减少移植成本。
- 高性能:Native Client 可以让 web 应用已接近桌面程序的性能运行,这就为在浏览器内运行性能苛刻的程序提供了基础,如大型 3D 游戏。
Native Client 技术概要
有人说,Native Client 技术是抄袭 ActiveX 的,个人不以为然,ActiveX 主要是基于 COM 的,是操作系统提供一套可重用的接口给 web 应用,而 NaCl 则是独立于操作系统的。说实话,感觉这技术更像是抄袭 Adobe 的 Alchemy 技术,Achemy 技术主要目的是解决 Flash 的低性能,这和 Native Client 是接近的,并且,这两种技术都采用了 LLVM 技术,具体可以看这篇文章 http://yjrl.iteye.com/blog/320665。
LLVM 是 Low Level Virtual Machine 的简称,这个库提供了与编译器相关的支持,能够进行程序语言的编译期优化、链接优化、在线编译优化、代码生成。简而言之,可以作为多种语言编译器的后端来使用。而基于 LLVM ,开源社区开发出了 Clang,一个 C++ 编写、基于 LLVM、发布于 LLVM BSD 许可证下的 C/C++/Objective C/Objective C++ 编译器,其目标(之一)就是超越 GCC。
Google 的 Native Client 的关键技术就是 PNaCl(Portable Native Client Executables), 而 PNaCl 实现的一个关键就是 LLVM。下面是整个 PNaCl 结构示意图:
在 PNaCl 中,开发者通过一些前端编译器将 C/C++/Fortan 源代码用对应的编译器前端编译成 LLVM 的中间字节码,并且进行优化以及链接(这一整套流程可以在 Google 提供的SDK 中完成)。之后,服务器将链接好的字节码进行分发,在客户端,通过 LLVM 的后端将字节码翻译成本地的二进制对象文件,并且和本地的相关库链接,最终执行完成(这些功能应该是集成在浏览器中的)。
另外,为了保证安全性,NaCl 采用了沙盒技术,具体可以看这篇论文:《Native
Client: A Sandbox for Portable, Untrusted x86 Native Co
参考:
http://www.lingcc.com/2010/06/02/10955/
http://nativeclient.googlecode.com/svn/da
本文作者: Sigma 在新浪微博关注Sigma
本文链接: http://www.sigma.me/2011/08/14/google-native-client-implementation.html
本博客采用知识共享署名—非商业性-禁止演绎使用3.0协议进行许可,转载请保留作者和原文链接。