转自: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 Code
》。

参考:

http://www.lingcc.com/2010/06/02/10955/

http://nativeclient.googlecode.com/svn/data/site/pnacl.pdf

本文作者: Sigma    在新浪微博关注Sigma 

本文链接: http://www.sigma.me/2011/08/14/google-native-client-implementation.html 

本博客采用知识共享署名—非商业性-禁止演绎使用3.0协议进行许可,转载请保留作者和原文链接。

漫谈 Google 的 Native Client(NaCl) 技术(二)---- 技术篇(兼谈 LLVM)的更多相关文章

  1. 漫谈 Google 的 Native Client 技术(一)---- 历史动力篇(Web 本地计算发展史)

    转自:http://hzx5.blog.163.com/blog/static/40744388201172522313463/ 漫谈 Google 的 Native Client 技术(一)---- ...

  2. Google Chrome Native Messaging开发实录(二)Chrome Extension扩展

    接上一篇<Google Chrome Native Messaging开发实录(一)背景介绍>的项目背景,话不多说,有关Chrome Extension介绍和文档就不展开了,直接上代码. ...

  3. Google Chrome Native Messaging开发实录(一)背景介绍

    最近接手了一个针对Google Chrome的需求,最终是使用Native Messaging来实现的.通过这个连载,将把本次开发从方案选定到编码的全部过程进行完整的回顾,并记录开发过程中踩过的各种坑 ...

  4. 利用Native Client OLEDB 11 高效率地对SQL SERVER 进行查询和插入操作

    前言: 鄙司原始用的都是ADO来访问数据库,而我现在着手的项目是从我的GPS历史数据库中,取出历时数据的一个接口,一个DLL.用ADO写完之后,测试下来,平均4000条的数据,需要 180 毫秒左右. ...

  5. navicat 连接sqlserver提示要安装 sql server native client

    navicat 连接sqlserver提示要安装 sql server native client 解决方法:其实navicat自带sqlncli_x64.msi,就在安装目录下,安装后问题解决!

  6. Downloading the Google Cloud Storage Client Library

    Google Cloud Storage client是一个客户端库,与任何一个生产环境使用的App Engine版本都相互独立.如果你想使用App Engine Development server ...

  7. 解决:安装SQL Server 2008 Native Client遇到错误(在Navicat premium新建sqlserver连接时 需要):An error occurred during ...HRESULT: 0x80070422(注意尾部的错误号)

    解决:安装SQL Server 2008 Native Client遇到错误(在Navicat premium新建sqlserver连接时 需要):An error occurred during . ...

  8. 已经安装了客户端,但是cmd输入sqlcmd报错:Sqlcmd:Error:Connection failure.SQL Native Client is not installed correctly

    以前安装了sqlserver2008,没有卸载掉,后面又安装了sqlserver2014,所以系统环境变量中既有2008的环境变量的配置,又有2014的环境变量的配置,所以在终端输入sqlcmd时报错 ...

  9. sql server 安装出现需要sqlncli.msi文件,错误为 microsoft sql server 2012 native client

    在安装sql server 2017 时出现 弹框标题为  microsoft sql server 2012 native client  内容为需要sqlncli.msi文件 去本地目录找本身的那 ...

随机推荐

  1. Spring Boot-properties使用(二)

    自定义属性 @value注入 在application.properties新增配置 student.name=小明student.age=12student.info=${student.name} ...

  2. 洛谷 P2813 母舰

    题目描述 在小A的星际大战游戏中,一艘强力的母舰往往决定了一场战争的胜负.一艘母舰的攻击力是普通的MA(Mobile Armor)无法比较的. 对于一艘母舰而言,它是由若干个攻击系统和若干个防御系统组 ...

  3. Timus - 1213 - Cockroaches!

    先上题目: 1213. Cockroaches! Time limit: 1.0 secondMemory limit: 64 MB It's well-known that the most ten ...

  4. eclipse实现批量修改文件的编码方式

    http://blog.csdn.net/haorengoodman/article/details/38493007 在eclipse+MyEclipse环境下,打开一个jsp文件,经常发现汉字无法 ...

  5. ul,li不能左右居中的问题

    近期帮朋友做一个他们公司的商品站点,用到了曾经学到的html+css技术,当然做站点少不了Javascript和jquery这些..... 这个功能主要实现了导航条里面的条目是居中的.所以声明了ul, ...

  6. Tarjan算法各种&RMQ& POJ 3694

    关于tarjan 的思想可以在网上搜到,具体我也不太清楚,应该说自己理解也不深,下面是做题经验得到的一些模板. 其中有很多转载,包括BYVoid等,感谢让我转...望各路大神愿谅 有向图求连通分量的一 ...

  7. Java路径获取

    package unit02; /** * * @time 2014年9月18日 下午10:29:48 * @porject ThinkingInJava * @author Kiwi */ publ ...

  8. phonegap(cordova) 自己定义插件代码篇(四)----读取本地图片

    有时候确实知道本地图片地址,要获取到base64  /** * 获取本地图片,包括路径和压缩后的 base64 */ (function (cordova) { var define = cordov ...

  9. 《深入浅出 Java Concurrency》——原子操作

    part1 从AtomicInteger開始 从相对简单的Atomic入手(java.util.concurrent是基于Queue的并发包.而Queue.非常多情况下使用到了Atomic操作.因此首 ...

  10. Service启动模式

    Service简单介绍        Service表示服务.是Android系统的核心组件之中的一个. Service的本质是一个继承了android.app.Service的java类:     ...