WebAssembly重新定义网页技术
如果网页应用能再快20倍,世界会有什么不一样?JavaScript原本只是为了补强Netscape浏览器在HTML网页在互动性上的不足而诞生的轻量级脚本语言,JavaScript之父Brendan Eich只花了10天,就设计出这款语言,连命名都只是营销策略,要藉助“Java”语言的名气来宣传,没想到,这个轻量级语言,却成了20年多年来网页应用的主角。
几乎所有网页应用几乎都离不开JavaScript,是少数甚至可说是唯一一个可以横跨各种装置都支持的程式语言,不论是笔电、手机或服务器,甚至是穿戴型装置、车载系统或VR眼镜,只要是浏览器可以执行的地方,就可以执行JavaScript。
执行效能远不如静态程式语言是JavaScript的致命缺点
但Brendan Eich也坦言,JavaScript有一个致命的缺点,他在JavaScript语言问世20周年的回顾演讲上就指出,为了让JavaScript的开发更弹性,也更容易,采取了动态型别的设计,这也让 JavaScript的执行效能,远不如静态语言。许多需要高效能或密集运算的应用,例如3D即时游戏、多媒体影音剪辑等,过去都很难单靠JavaScript来实做。
直到2015年中,一手催生JavaScript语言的Brendan Eich,和Mozilla、Google、微软的工程师们合作发起了W3C WebAssembly社交小组,要来重新发明JavaScript网页应用,提出了WebAssembly概念,顾名思义,就是Web的Assembly形式,要让网页应用也能拥有二进位Bytecode的执行格式,Brendan Eich指出,甚至可以让JavaScript程式的执行速度快20倍,让网页应用也能像桌面原生应用一样的执行速度。
经过5年努力,终于在2017年,WebAssembly获得主流浏览器支持,除了最早支持的Firefox,不论是全球浏览器市占最高的Chrome,微软新一代浏览器Edge或是苹果的Safari,都纷纷支持WebAssembly,甚至近9成行动装置的浏览器环境,都可以执行WebAssembly格式的Bytecode网页档案。
Mozilla新兴科技部门院士David Bryant也认为,过去定义网页技术的三原色:HTML、JavaScript及CSS外,现在也应该将WebAssembly纳入标准工具之一,在这股潮流之下,WebAssembly俨然成为重新定义未来网页技术的要角。
WebAssembly主要提供两大好处。首先,采用WebAssembly的网页应用是二进位格式的档案,比起JavaScript的处理速度可以快上20倍。在行动应用上,原先程式码的解析过程,就要花上不少时间,而透过WebAssembly,使用者也可在浏览器上执行线上串流、影音编译等工作。
WebAssembly可以结合两大领域语言的优势
而且,透过WebAssembly技术,对于C和C++开发者而言,就可以多加使用既有的JavaScript前端套件。反之亦然,使用JavaScript的前端开发者也可以呼叫C、C++的函式库,比方说,当网页执行複杂运算,导致效能下降时,就可以直接使用C或C++语言改写,编译成WebAssembly执行。 Mozilla台湾研发经理陈侃如认为,JavaScript的优点就是,可以快速开发;而C与C++的优点,就是效能表现,“透过WebAssembly,就可以结合这两大领域程式语言的优势。”陈侃如表示。
另外,WebAssembly也很注重安全机制,程式会在浏览器的沙箱环境执行。陈侃如解释,既有C或C++程式码,可能本来就隐含程式臭虫,导致系统当机。不过使用WebAssembly之后,“开发者就可以在网页浏览器中处理这些例外情况”,因此,即使旧有程式码有问题,也不会造成浏览器当机。
强调运算效能的网页应用程式,都是WebAssembly的潜在市场
目前,WebAssembly的使用情境,除了游戏相当具有市场潜力,举凡需要强调运算效能的情境,都可能是WebAssembly的潜在应用情境。例如,像是在浏览器上提供修图服务的业者,利用WebAssembly加速,也可以达到接近本机效能的速度,或者是线上音乐串流、影音直播业者,也能透过WebAssembly解码。
陈侃如也透露,虽然WebAssembly的命名“强调Web应用”,不过它也有考虑在非Web执行环境,未来Mozilla因应未来轻量环境的硬体执行需求,也规画支持树莓派等嵌入式装置,使其也可以执行WebAssembly。
而WebAssembly威力在于,除了可以让既有C、C++语言编译成WebAssembly格式在浏览器中执行,解放了旧有程式码再利用的门槛,开发者不需要重新撰写程式码就能转换成浏览器上的执行格式,让既有庞大的C、C++程式码,也能在网页时代下重新利用,获得新生命。甚至,如David Bryant所说:“虽然听来很不实际,但理论上,即使开发者完全不了解JavaScript也可以进行网页开发。”他举例,网页游戏应用开发团队的分工,能切割得更为精细,原本既有JavaScript开发者仍能沿用其惯用的开发工具,而偏好其他程式语言的使用者,可以专注心力开发游戏引擎、游戏逻辑设计,利用WebAssembly档案,让新程式码可以在既有平台上继续运作。除了开发者,网页应用开发框架业者也能受益于WebAssembly。
David Bryant表示,既有的JavaScript开发框架业者,即使导入了WebAssembly,也能继续使用原本的API,“不只效能提升,还能开始整併其他程式语言。”
而且不只这两种语言,现在也有开源专案和工具,能快速将大型商用软件常用的Java语言,或是微软的.NET语言的程式码,都能转换成WebAssembly格式,然后放上网页执行,而JavaScript语言也有工具,可以直接将程式码编译成WebAssembly格式,如Walt,让现有网页程式也能快速获得高效能。
WebAssembly仍然相当仰赖JavaScript
不过,JavaScript与WebAssembly两者之间,也有着微妙的依存关係,引起许多开发者的讨论。而陈侃如表示,JavaScript与WebAssembly仍是互相合作关係,由于现阶段WebAssembly仍然相当仰赖JavaScript,开发者无法利用C语言去呼叫浏览器API,“现阶段WebAssembly可以达成的目标是,汇出部分函数给JavaScript使用,或是WebAssembly直接使用JavaScript的内建函数”,而未来开发方向,是让WebAssembly能直接使用JavaScript物件,以及浏览器的API。
虽然WebAssembly会持续演进,不过JavaScript仍然有其重要性在,“因为它仍是浏览器原生支持的程式语言”,陈侃如认为,网页开发者可以专注开发JavaScript程式。但如果开发者想要使用WebAssembly,仍然是需要经过编译的阶段,透过更为複杂的步骤,才能串接JavaScript与WebAssembly。
他也强调,目前Mozilla认为,两者会是互补关係。需要效能或者是想要执行老旧程式码的开发者,可以透过WebAssembly解决。而且,现阶段市面上也有许多评价良好的JavaScript框架,“该程式语言的生态系相当完整,不可能一夜之间大家就放弃JavaScript。”
WebAssembly技术5大特性
特性1 二进位网页档案处理速度比JavaScript快20倍
特性2 不仅有C和C++,连Java和.NET都可以支持
特性3 wasm二进位档也能像HTML具有可读性
特性4 不只3D游戏或多媒体,複杂深度学习应用也能用
特性5 四大主流浏览器都支持,9成行动装置都能跑