漫谈 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 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)的更多相关文章
- 漫谈 Google 的 Native Client 技术(一)---- 历史动力篇(Web 本地计算发展史)
转自:http://hzx5.blog.163.com/blog/static/40744388201172522313463/ 漫谈 Google 的 Native Client 技术(一)---- ...
- Google Chrome Native Messaging开发实录(二)Chrome Extension扩展
接上一篇<Google Chrome Native Messaging开发实录(一)背景介绍>的项目背景,话不多说,有关Chrome Extension介绍和文档就不展开了,直接上代码. ...
- Google Chrome Native Messaging开发实录(一)背景介绍
最近接手了一个针对Google Chrome的需求,最终是使用Native Messaging来实现的.通过这个连载,将把本次开发从方案选定到编码的全部过程进行完整的回顾,并记录开发过程中踩过的各种坑 ...
- 利用Native Client OLEDB 11 高效率地对SQL SERVER 进行查询和插入操作
前言: 鄙司原始用的都是ADO来访问数据库,而我现在着手的项目是从我的GPS历史数据库中,取出历时数据的一个接口,一个DLL.用ADO写完之后,测试下来,平均4000条的数据,需要 180 毫秒左右. ...
- navicat 连接sqlserver提示要安装 sql server native client
navicat 连接sqlserver提示要安装 sql server native client 解决方法:其实navicat自带sqlncli_x64.msi,就在安装目录下,安装后问题解决!
- Downloading the Google Cloud Storage Client Library
Google Cloud Storage client是一个客户端库,与任何一个生产环境使用的App Engine版本都相互独立.如果你想使用App Engine Development server ...
- 解决:安装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 . ...
- 已经安装了客户端,但是cmd输入sqlcmd报错:Sqlcmd:Error:Connection failure.SQL Native Client is not installed correctly
以前安装了sqlserver2008,没有卸载掉,后面又安装了sqlserver2014,所以系统环境变量中既有2008的环境变量的配置,又有2014的环境变量的配置,所以在终端输入sqlcmd时报错 ...
- sql server 安装出现需要sqlncli.msi文件,错误为 microsoft sql server 2012 native client
在安装sql server 2017 时出现 弹框标题为 microsoft sql server 2012 native client 内容为需要sqlncli.msi文件 去本地目录找本身的那 ...
随机推荐
- codeforces Round #258(div2) C解题报告
C. Predict Outcome of the Game time limit per test 2 seconds memory limit per test 256 megabytes inp ...
- 开源 免费 java CMS - FreeCMS2.0 会员password设置
项目地址:http://www.freeteam.cn/ password设置 从右側管理菜单点击password设置进入. 输入正确的当前password和新password后点击改动就可以.
- Mysql 索引需要了解的几个注意
索引是做什么的? 索引用于快速找出在某个列中有一特定值的行.不使用索引,MySQL必须从第1条记录开始然后读完整个表直到找出相关的行.表越大,花费的时间越多.如果表中查询的列有一个索引,MySQL能快 ...
- oc12--对象作为参数
// main.m // 对象作为方法的参数传递 #import <Foundation/Foundation.h> /* 士兵 事物名称: 士兵(Soldier) 属性:姓名(name) ...
- vim插件系列
http://foocoder.com/blog/mei-ri-vimcha-jian-ping-hua-gun-dong-accelerated-smooth-scroll-dot-vim.html ...
- DNS隧道工具使用 不过其网络传输速度限制较大
DNS隧道工具使用 http://www.freebuf.com/sectool/112076.html http://netsec.ccert.edu.cn/zhengming/2011/11/01 ...
- WEEX学习网站
https://github.com/alibaba/weex https://alibaba.github.io/weex/ 官网 http://weex.help/topic/57792 ...
- React-Native Android开发沉思录
在runServer.js中有声明如何启动http服务: 查看端口占用情况 而且在系统管理器中,根本找不到PID为7956的应用,那能更改端口吗?在server.js中有声明: module.expo ...
- linux系统下块设备驱动程序
顾名思义,块设备驱动程序就是支持以块的方式进行读写的设备.块设备和字符设备最大的区别在于读写数据的基本单元不同.块设备读写数据的基本单元为块,例 如磁盘通常为一个sector,而字符设备的基本单元为字 ...
- 利用python开发的flappy bird 游戏
python 中 pygame模块能让我们很方便的编写游戏,16年我用python 仿制了flappy bird 游戏,下面是游戏的完整代码以及素材,分享给大家. 第一个python文件,flappy ...