转自: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. 使用MySQL Migration Toolkit快速导入Oracle数据

    近来笔者有项目需要将原有的Oracle数据库中的数据导入到MySQL中,经过试用发现MySQL GUI Tools中的MySQL Migration Toolkit可以非常方便快捷的将Oracle数据 ...

  2. LightOJ - 1232 - Coin Change (II)

    先上题目: 1232 - Coin Change (II)   PDF (English) Statistics Forum Time Limit: 1 second(s) Memory Limit: ...

  3. [bzoj3209]花神的数论题_数位dp

    花神的数论题 bzoj-3209 题目大意:sum(i)表示i的二进制表示中1的个数,求$\prod\limits_{i=1}^n sum(i)$ 注释:$1\le n\le 10^{15}$. 想法 ...

  4. Spring MVC-表单(Form)标签-文本框(Text Box)示例(转载实践)

    以下内容翻译自:https://www.tutorialspoint.com/springmvc/springmvc_textbox.htm 说明:示例基于Spring MVC 4.1.6. 以下示例 ...

  5. Linux正則表達式-定位元字符

    有两个元字符用于指定字符串出如今行首或行末.脱字符(^)是指示開始的单字符正則表達式.美元符号($)是指示行结尾的单字符的正則表達式.这些通常称为"定位符",由于它们将匹配限定在特 ...

  6. PHP独立操作符

    & 与 ^ 位逻辑异或 $ # ! 逻辑或 ~  按位取反

  7. sql系列(基础篇)-前言 课前补充知识

    前言 课前补充知识 Number(p,s) Number(p,s):数字类型,p 表示数字的有效长度(从数字的左边第 1 位不为 0 的開始算起,直到最右边的长度.取值范围 0~38 位),s 表示数 ...

  8. HDU Distinct Values

    /* 一开始想到的是 对于每个区间操作 先按左端点排序(包含的区间 留这打的区间) 我们维护pos表示 a数组找到了哪 对于当前这个区间 只需要找 pos--r这个区间 用set维护能用的数 没放到a ...

  9. sublime界面主题

    一直以来都是使用的SUBLIME,真的很强大. 最近刚转到linux来学习C,把它重新配置了一遍,默认的字体颜色的搭配已经很不错了.不过界面的样子还是不太习惯.重新安装了下soda这个主题包,惭愧!即 ...

  10. springboot @WebFilter过滤器的使用

    过滤器的用法就不多说了 新建Filter的继承类:MemberFilter(放置包需要注意) @WebFilter(urlPatterns = "/*") @Order(1) pu ...