认识Native Client
Native Client (Nacl) 是Google提出的一种让浏览器直接运行机器码的技术,让Web应用可以从客户机上获得更多的性能,同时又不会引起安全问题。这个技术类似于微软的ActiveX。程序员可以使用C++或者其他语言编写web应用程序,再通过Nacl发布。程序中可以调用一些系统服务中安全的API,如声卡或者图形显示等。Nacl能使用的本地系统调用都是已经规定好的,所以安全性有保证。这篇文章介绍如何使用Native Client。
图中,灰色部分是不安全的模块。其中IMC,即Inter-Module Communications,模块间通信. SRPC,即Simple RPC, 简单的远程过程调用机制。 NPAPI,即Netscape Plugin Application Programming Interface,Netscape插件应用编程接口。
因为安全问题,所以Nacl的运行时环境必须禁止很多有安全隐患的系统调用,因此NaCl更加适用于纯计算,或者计算密集的应用,对于需要创建进程,访问文件系统的,通通都要毙掉。不过像cache一样,可信的存储应该可以进行。Nacl会首先做静态分析,在机器码中,找出不安全的系统调用和不安全的指令,这些都能通过反汇编搞定。但还得有运行时环境来保证模块间的通信,让Nacl模块可以和其他Nacl模块和浏览器交互。还有一个问题,硬件例外的处理。比如算数值时溢出了,段错误了,或者被外部中断,因为Nacl的运行时环境将Nacl模块的运行完全屏蔽,所以没辙,遇到终端会直接终止。
PNaCl-兼容可移植性和性能
有了C++之类的语言保证,NaCl的应用的运行效率就有了保证。但还需要开发者预先跟据指令集的不同,编译得到不同的机器码,再根据访问者的CPU分发相应的机器码。问题可想而知:兼容性,可移植性不好。于是Google 想到了热火朝天的LLVM(关于LLVM:《前瞻-全时优化和LLVM-1》《前瞻-全时优化和LLVM-2》《前瞻-LLVM大事记(2004-2010)》).PNaCl就诞生了。
使用LLVM,将C/C++代码转换成LLVM中间表示。然后再将中间表示分发给访问者。避免了针对ISA的编译,又能提升性能。LLVM静态编译和动态执行的透明性又使得PNacl的代码更容易调试。LLVM的前端有可以增加诸如Fortran和Objectiv C之类的语言。有个问题,就是PNaCL得以单文件形式分发,不过幸好LLVM工具链提供了在做过程间优化时生成一个bitcode文件的功能。
上图是PNacl的执行模型,Bitcode下载到客户机后,通过llc或者ld转换执行,在Nacl的运行时环境中执行。
PNaCl的未来
Google现在基于LLVM的有两个,unladen-swallow和Nacl。JavaScript会被Nacl替代吗?以后Google会用PNacl的后端来替代JavaScript的解释器V8吗?Python如果能用LLVM做后端,C/C++也能扩展到LLVM,那以后会是怎样?
或许有点多虑,就好像每一种语言刚刚出现的时候,都有人认为它会替代所有现有语言。但发展到今天,还没有哪种语言能一统江湖,安全、性能和可移植性本身就是矛盾的,不能兼顾,只有根据应用的取舍。
PNacl的问题
本来的用意是加快执行速度,现在先做一遍翻译,变成bitcode,再做一遍翻译,编程机器码。性能还有保证吗?这个项目2010年二月才开始。还有很长的路要走。
参考:
- http://code.google.com/p/unladen-swallow/
- http://en.wikipedia.org/wiki/JavaScript
- http://nativeclient.googlecode.com/svn/data/docs_tarball/nacl/googleclient/native_client/documentation/getting_started.html
- http://nativeclient.googlecode.com/svn/data/docs_tarball/nacl/googleclient/native_client/documentation/nacl_paper.pdf
- http://nativeclient.googlecode.com/svn/data/docs_tarball/nacl/googleclient/native_client/README.html
- http://nativeclient.googlecode.com/svn/data/site/pnacl.pdf
- http://googlecode.blogspot.com/2008/12/native-client-technology-for-running.html




以前看过 Adobe 的猛将兄演示用 llvm 把 Quake 的 C/C++ 源代码现场编译成 swf 格式并开玩。
我就是从那时候听说 llvm 的。
@ayaya, LLVM的中间表示很牛。不知道swf内部是如何执行的。
我怎能看来看去 PnaCI 有点JAVA applet 的意思. 只不过JAVA applet只能用JAVA来写.
java->.class 文件 —-网络传输—- JVM 执行
@yajin, 这么看是差不多。不过Google用PNacl还是想提速度,提高网络应用的速度。Java Applet应该是以跨平台网络发布为目的的吧:)
Pingback: 龙芯N32系统上的Squirrelfish性能 | 编译点滴
Pingback: emscripten « 阿喵就像家
NaCl, 超级Cool的东东。
可我无法下载来。
你使用什么方式下载的?试过直接执行这条命令吗?svn checkout http://src.chromium.org/native_client/trunk/src/native_client
Pingback: 漫谈Google的Native Client技术(一)–历史动力篇(Web本地计算发展史) | Flash开发者大会