我们的技术圈 ,关注商业科技,国内创新技术交流与转化的平台
×

  会员登录

现在注册

第三方登录
                         
悦智网 > 悦科技 >
给网络提速
2018-03-08 13:17
原创  Ieee Spectrum

给网络提速a.jpg

如果能分享一个计算机辅助设计(CAD)模型,还能让一位同事对它进行远程操作,你会怎么做?“点击这个链接查看我的设计,请随意增删或修改。”你也许会这么说。你不用远程指导同事安装特殊软件,也不用担心对方的操作系统能否运行。想象一下,你所有的程序和数据都存储在云端,甚至像多媒体编辑这样的计算密集型应用程序在浏览器中也可以像安装在本地那样自如运行。

万维网问世早期,很多心怀热忱的聪明人就希望它能成为一种可运行所有程序的工具。这一梦想之所以如此诱人,是因为网络不同于其他软件平台。它由开放标准定义,任何人都可以在互联网上进行创建。它不属于任何公司,所以开发者只需对用户负责。它主要围绕着开源技术构建,因此有民主化的潜力。

在过去30年间,整整一代的开发者们都在努力使这个愿景变成现实。我们为互联网增加了新的功能,比如音频和视频流、2D和3D图形、排版、点对点通信、数据存储、离线浏览以及多点触控、定位和摄像头输入。但我们依然在不懈努力,这样才能提升性能,尤其是让网络应用程序能像非网络应用程序那样快速运行。

7年前,我在摩斯拉(Mozilla)工作的团队选择专攻存在时间最久、也是最难攻克的难题之一:JavaScript编程语言的性能问题。JavaScript是现代网页的三大支柱之一,它使用超文本标记语言(HTML)来描述它们的布局,用级联样式表(CSS)来指定它们的组件样式,并用JavaScript代码来提供各种丰富的交互体验。

我们用两种方法攻克这一难题。首先我和同事们要能够在浏览器中运行巨大而复杂的程序,就像直接安装在电脑上一样。然后我们跟其他浏览器公司合作,创建了一个名为WebAssembly的互联网新标准,设计出如今已正式成为网络一部分的安全、高效的代码。

在我们着手研究之前,互联网开发人员有两个选择。他们可以使用现有的互联网技术(HTML、CSS和JavaScript)来创建在现有网络浏览器上运行的应用程序;他们也可以创建一个浏览器插件,但用户必须下载并安装这个插件。这两种方法都不太理想。

第一种方法较为便捷、简单,对用户来说也比较安全。但计算量较大的应用程序会由此造成糟糕的用户体验:画面卡顿,音质下降,应用程序要用数秒或更长时间来响应用户输入。插件的方法虽能让浏览器顺利且快速地运行程序(甚至是对性能要求很高的电脑视频游戏),但用户必须下载和安装软件,这很有可能将恶意代码注入到用户的系统中。此外,浏览器插件只能在其为之开发的特定浏览器上运行。所以如果你用的是另一种浏览器,那就没辙了。

WebAssembly现在提供了一种全新的选择。它利用了互联网技术的已有优势——JavaScript,也就是能在浏览器中运行JavaScript代码并建立浏览器安全属性的引擎,并进行各种优化,使代码的读取和执行更加迅速。

这种方法让WebAssembly更易获得浏览器公司的支持,因为这对它们来说也意味着更少的工作量和较小的风险。如今,摩斯拉火狐、谷歌Chrome、苹果Safari和微软Edge浏览器的最新版本都支持WebAssembly。因此,互联网有望从此变得更加强大。下面来讲这种改变是如何发生的。

给网络提速b.jpg

同许多技术创新的故事一样,这次创新也是从电子游戏开始的。团队负责人马丁•贝斯特(Martin Best)为摩斯拉做出的最好设想是:如果我们能让游戏在网络中顺畅运行,那么其他的计算密集型应用程序也会很快紧随其后。

游戏程序开发伊始,摩斯拉的很多工程师自然而然地将工作重点放在了JavaScript的性能上面。这是一个紧张而兴奋的时刻,大家用上了最前沿的学术研究成果和一系列行业优化技术。有了这些,我们的团队就能加速运行JavaScript,提供接近本地化的软件体验,这是一条黄金准则。

问题是这些性能改善的表现并不稳定。有时代码运行速度真的很快,有时却不然。JavaScript的设计让人很难确定速度会在何时何地降低,更加不可能预测了。

我在摩斯拉的同事阿隆•扎凯(Alon Zakai)产生了一个古怪的想法,可以解决这样的问题:把一个他用C++语言编写的游戏,转换为JavaScript代码,从而让游戏在网上运行。当时是2010年,在那时,把C++转换成JavaScript是不可想象的。

用C++编写的游戏可以是有着数百万行代码的大型程序,这在当时对JavaScript来说实在太复杂了。更糟糕的是,这种游戏会给底层平台施压,因为它们有数个不同部分——音频、视频、物理组件、人工智能——需要协调运行。对于任何人来说,如何能将这一切计算密集型功能从快速强大如C++的编程语言跳转到JavaScript(最初用于查看轻型超文本文档的Web语言)上,都是一个不解之谜。

当时,甚至连扎凯自己都认为这是个奇怪的想法。但他不想用JavaScript逐行重写他的游戏,他好奇的是:这到底能做成吗?于是他开始着手改编一个可以将C++代码自动转换成JavaScript代码的开源工具。他把这个项目叫做Emscripten,这个词结合了JavaScript中的“script”和电视节目《辛普森一家》中的“embiggen”(意指增强、变大,片中人物斯普林菲尔德的座右铭是:高贵的心灵使矮小的人变得伟大)。

扎凯花了两年时间研究Emscripten,起初把它仅作为一个附带项目,然后把它作为摩斯拉游戏程序的一部分。团队负责人贝斯特发现其他大型游戏公司也遇到了跟扎凯一样的烦恼:他们想让大型游戏继续在网上运行,但不想花钱花时间用JavaScript进行重写。

因此扎凯继续开发Emscripten直至完成。当他第一次展示C++游戏如何在浏览器中运行时,房间里的所有人都震惊了。它出现在屏幕上,所有的元素都包含在内:图形、音频、不断变化的三维视角、多个角色的交互以及各种武器的选择。即使有人之前存有疑虑,也被他的演示打消了,几秒钟之内,其他组员就上网点击进入了游戏,并在惊喜中开始相互射击。

更令人惊讶的是,这个JavaScript代码的运行速度比手写JavaScript快得多。你一定以为,自动从一种语言翻译到另一种语言的代码会混乱不堪、运行缓慢,比不上经验丰富的程序员编写的代码,因为程序员可以对代码进行分析和优化。但是事实情况并非如此。

到底是怎么回事?要想理解答案,你需要知道编写C++代码需要程序员创建具有明确特征的对象。相较之下,JavaScript兼容性更强,而且非常灵活。事实证明,在翻译的过程中,Emscripten保留了C++的严格性,允许生成的JavaScript更有效地运行。这是一个里程碑式的成果。

给网络提速c.jpg

当Emscripten已基本上可投入工作后,贝斯特想看看它能为商业软件做些什么。它能否将复杂的大型游戏进行转换,让它在互联网上运行?颇受欢迎的游戏引擎Unity的开发人员们,邀请我们一起加入一次实验性冲刺,看看我们能做到什么程度。

让大家吃惊的是,我们的联合团队在一周内就让Unity的游戏引擎上线了。但演示时加载时长达到半分钟之久,并且运行得非常不顺畅。我们很快找到了问题所在:浏览器引擎遇到了问题,因为它在运行时需要解析、分析和优化由Emscripten生成的JavaScript代码。

从这里开始我加入进来。我主要研究火狐浏览器中的JavaScript引擎性能。在研究这个问题的时候,我发现可以在Emscripten和运行Emscripten所生成代码的引擎之间,制定各类协议:如果你只向引擎提供特定的输入模式,那么引擎就能够可靠并相当快速地运行。

我将这一发现与贝斯特进行了分享,并建议扎凯修改Emscripten让其只生成能快速运行的模式,同时,我在火狐浏览器中优化JavaScript引擎,提高代码的运行快速。贝斯特几乎和我一样激动,“就这么做!”他和布兰登•艾克(Brendan Eich)这样对我说。布兰登•艾克是JavaScript的创始人,后来成为摩斯拉的首席技术官,伴随着他们的鼓励,我踏上了这一段新的征程。

在摩斯拉研究主管戴夫•赫尔曼(Dave Herman)的帮助下,我和扎凯一起工作,将所允许的JavaScript模式具体化,使Emscripten和浏览器之间的协议完全清晰化。我们把JavaScript的子集命名为asm.js,它本身就成为了一种独特的语言(“asm”是Assembly的缩写,是一种非常接近CPU机器语言的代码类型,而“.js”则是JavaScript缩写)。

新的asm.js运行速度更快,因为JavaScript是一种动态类型的语言。这意味着在程序运行之前,由变量表示的数据不一定是已知的,这使计算机难以提前优化将要执行的代码。

为了让JavaScript更快,我们需要为这种语言创建一个静态类型的系统,这意味着代码必须提前声明它所执行操作的数据类型。这个变量是一个数字、一串字符还是一个更为复杂的对象?静态系统要求程序员进行一些前期工作来解决这一问题。

经过几个月的编程之后,我在火狐浏览器中对asm.js进行了优化,我们已准备好对它进行测试。这次是在另一个同样强大的游戏平台——Epic的Unreal引擎上。在火狐浏览器中运行数百万行的整个代码库只花了几天的时间——涉及的工作包括音频和图像处理等,这些都是在与计算机本地操作系统完全不同的浏览器中完成的。

我们的成绩比预想的要好。动画从一开始就很流畅。我们观看的时候,周围都是欢呼和庆祝的声音,就好像拼了几年的拼图终于完成了最后一块。

Epic的首席执行官蒂姆•斯维尼(Tim Sweeney)评论说,他知道在浏览器上运行这样的游戏是可能的,但他没想到会这么快。几周之后,我们在2013年的游戏开发者大会上展示了一些使用Unreal引擎的游戏,这是第一个在没有插件帮助的情况下能在浏览器中运行大型游戏的引擎。

但是我们不希望asm.js或其使用的优化只限于火狐浏览器用户。所以我们发布了asm.js的完整规范,并积极鼓励其他浏览器提供商增加我们正在使用的相同优化。从2013年到2015年,四大主要浏览器引擎都通过运行asm.js提高了性能,微软 Edge浏览器更是加入了部分火狐浏览器的开源asm.js优化代码。

不久后,由Emscripten转译成asm.js的游戏开始在网上出现了。比如在脸谱网上广受欢迎的游戏《帕帕弹珠传奇》《足球经理》《云端入侵者》和《糖果传奇》等,用的都是asm.js。而且正如预期的那样,一旦这些游戏的出现证明了其可行性,其他的各种应用就会接踵而至。

例如,脸谱网如今在上传用户图片之前,用asm.js在浏览器中对其进行压缩以节省带宽。Adobe公司把它用C++编写的核心图像编辑库转换为asm.js,以适应网络版Lightroom的需要。维基百科使用asm.js来播放用户浏览器不支持的视频格式。其他网络应用还包括计算机视觉、三维制图、用户界面设计、语言检测、音频混合、数字信号处理、医学成像、物理仿真、加密、压缩和计算机代数。

这些进展相当完美,但有一点最终变得更加清晰:要想更进一步,我们必须创建一种新的网络标准,具备比asm.js代码更加高效的加载速度。尤其是,新标准将以更加紧凑的表示法替代已知的变量和指令名,这种表示法就是二进制数。新标准还可以帮助我们解决用户在asm.js里发现的一些小问题——他们需要64位整数算术等功能,且需要能够将应用程序分解成可以单独下载和优化的更小的块。由此,WebAssembly的想法诞生了。

在摩斯拉游戏项目刚开始的时候,针对这种标准出现过很多不同提案,但没有一个是完全正确的。你可能会想,即便再提出新提案也是无济于事。但随着asm.js的广泛使用,我们得到了一个独一无二的机会,抓住契机把它引入到了WebAssembly中。如果一些浏览器需要等一段时间来支持WebAssembly(“wasm”)代码,那么开发人员只需利用Emscripten,就能很容易地生成wasm和asm.js两种代码。这样他们既可以一直使用处处皆可运行的asm.js,也可以把wasm代码发送给只能运行它的相应浏览器。

下一步是让其他浏览器提供商信服,WebAssembly是个好主意。在某些情况下这出奇地简单,因为这些公司的工程师们已有类似的想法。而在其他情况下,则需饮酒长谈、四处寻访团队、说服管理人员,或者是在游戏开发者大会期间,舒服地坐在旧金山芳草地艺术中心的花园里进行推广。到了2015年,终于相关人士都加入了进来,准备正式着手创建这个新的互联网标准。

这个过程始于万维网联盟(W3C)社区小组的成立,这个组织由来自四大浏览器公司和其他有兴趣的工程师们组成。我们一致认为,想要一下子解决所有问题是不明智的,因为仅制定规范就需要5年甚至更长的时间。因此,从一开始,我们的小组制定的目标就是定义和装载被新兴企业的专家们称为“最小化可行产品”(MVP)。此后我们可以再根据反馈对其反复改进。

于是我们走到了今天。浏览器公司已经同意了WebAssembly的初始MVP版本,并且已经发布了兼容性实施版本。Emscripten 可以把用C++编写的代码直接转换成WebAssembly。不久后也将能够运行其他语言,包括Rust、Lua、Python、Java和C#。使用WebAssembly,几百万行的代码库目前可在几秒钟内加载完毕,并且运行速度可达本地程序速度的80%。随着运行代码的浏览器引擎变得更好,预计加载时间和运行速度都会进一步优化。

WebAssembly社区小组有个宏伟的计划。我们正在努力增加可以利用多核CPU的并行处理能力的功能。并且我们希望能为多种编程语言提供一流的工具和优秀的性能,从而使开发人员在为本地平台编写代码时能拥有同样的自由。

回想起以本地程序的速度在网络中运行各种应用程序的最初梦想,我和我的同事们可以预见到,还有很多工作要做。但是借助WebAssembly,我们很高兴已向这个目标迈进了一大步。■

作者:Luke Wagner

摄影:Gabriela Hasbun

0
分享
   相关成果报告
2018-07-23
2018-02-12
2017-10-27
    友情链接申请链接    
科技纵览官网      阿里云      悦智官网      百度      360      腾讯      网易      凤凰网      新浪网      搜狐网      IEEE     
京ICP备15039501号-1

京公网安备 11010102002341号

本站由 提供计算与安全服务
关于
关于我们
商务合作
联系我们
订阅
RSS订阅
邮箱订阅
线下活动订阅

Copyright © 悦智网