WebAssembly系列2-为什么我们需要WebAssembly—采访Brendan Eich
為什么80%的碼農(nóng)都做不了架構(gòu)師?>>> ??
? ? ?在2015.06.17, JavaScript之父Brendan Eich宣布了一個(gè)新項(xiàng)目:將新的底層功能(low level primitives)帶入web中[1],?這將使在瀏覽器或其他JavaScript環(huán)境中采用類(lèi)似于C & C++等語(yǔ)言編寫(xiě)的項(xiàng)目的編譯更加容易。如果是第一次聽(tīng)到這個(gè)想法,可參見(jiàn)閱讀"What is WebAssembly”的基本描述[3]。
? ? WebAssembly團(tuán)隊(duì)包括來(lái)自Google, Microsoft, Mozilla, Apple, 以及W3C WebAssembly Community Group(社區(qū)團(tuán)體)的成員。
? ? 這份聲明使web開(kāi)發(fā)界猜測(cè)WebAssembly可能會(huì)如何影響到JavaScript的未來(lái), Eric Elliott(下面簡(jiǎn)稱(chēng)EE)采訪了Brendan Eich(下面簡(jiǎn)稱(chēng)BE).
? EE: 最近,你在博客中宣布將開(kāi)始WebAssembly新項(xiàng)目,基本上就是一個(gè)web匯編語(yǔ)言,一個(gè)底層編譯目標(biāo)。 能否講下它是做什么的,背后的動(dòng)機(jī)是什么。
? BE: 這在某種程度上是從ASM.js就開(kāi)始的一個(gè)持續(xù)過(guò)程。ASM.js是JavaScript的一個(gè)子集,沒(méi)有對(duì)象, 沒(méi)有垃圾回收, 沒(méi)有JIT編譯器中斷(just in time compiler pauses)。它的目標(biāo)是C/C++—JavaScript的一個(gè)靜態(tài)類(lèi)型子集。這已經(jīng)由Mozilla以及大型游戲廠商, Epic Games公司的Unreal引擎以及Unity公司的Unity引擎和IDE演示過(guò)了。?
? ? 這樣,大量的游戲就可以用自己的引擎來(lái)發(fā)布,市場(chǎng)上有Unreal引擎3和Unreal引擎4, 而基于Unity 5建立的游戲是用另外一種指令集作為JavaScript的目標(biāo)。
? ? 這些游戲過(guò)去可能瞄向PS4、XBox和PC。現(xiàn)在他們也可以利用WebGL、ASM.js、web音頻與其他重要的APIs、平板游戲APIs、全屏APIs等瞄向web。
? ? 當(dāng)我在Mozilla公司的時(shí)候,ASM.js就取得了非凡的成功,現(xiàn)在已經(jīng)轉(zhuǎn)向了微軟。我記得幾年前與Anders Hejlsberg和Steve Lucco談?wù)撨^(guò),Anders是做C#和.NET,Steve帶領(lǐng)Chakra團(tuán)隊(duì)。他們都非常感興趣,Edge開(kāi)始支持ASM.js,通過(guò)在線優(yōu)化達(dá)到好的性能,就像Mozilla對(duì)模塊優(yōu)化所做的那樣。
? ? 其實(shí),我認(rèn)為這是對(duì)Native Client的最后一擊,或者說(shuō),是對(duì)真正可移植的原生Client(Portable Native Client:PNaCl)的最后一擊。PNaCl是Google唯一可以將瀏覽器中的C & C++編譯為安全原生Client的版本,但從來(lái)沒(méi)有在Chrome中完全發(fā)揮出作用。對(duì)一些Google屬性來(lái)說(shuō)它放在白名單中,我認(rèn)為Google+有一個(gè)圖形編輯器。
? ? 隨著時(shí)間發(fā)展,完全原生client不會(huì)擴(kuò)展到其他瀏覽器上,如果打算做的話將有很長(zhǎng)的道路要走。盡管ASM.js起初沒(méi)有線程,沒(méi)有鎖,沒(méi)有原生代碼中需要的大量功能:沒(méi)有SIMD (single instruction, multiple data: 單指令多數(shù)據(jù)),沒(méi)有現(xiàn)代CPUs中包含的向量單元(vector unit)的短向量?jī)?nèi)聯(lián)函數(shù)(short vector intrinsics for vector units)。
? ? 的確,JavaScript之前沒(méi)有這些功能,但現(xiàn)在情況正在變化。SIMD已經(jīng)在Firefox支持,V8將支持,Intel已經(jīng)在他們的V8版本中有一個(gè)實(shí)現(xiàn),Crosswalk支持,而且Microsoft宣布將在Chakra中支持SIMD。
? ? (譯者注:Chakra JavaScript引擎支持微軟Edge瀏覽器以及Windows 10中使用HTML/CSS/JS編寫(xiě)的應(yīng)用。)
? ? 假設(shè)web停滯,雖然這個(gè)假定不好,我認(rèn)為之前的PNaCl和Dart等項(xiàng)目是個(gè)錯(cuò)誤。它們都假定JavaScript能力不夠,不能改善,因此他們必須要做一些事情,因此有了第二套系統(tǒng),或第三套系統(tǒng)增加到了瀏覽器中,然而沒(méi)有完全融入到Chrome中。
? ? 這里我并非沾沾自喜,實(shí)際情況是我們需要漸進(jìn)式發(fā)展。所有的瀏覽器必須小步前進(jìn)。這真的是Firefox與Chrome在瀏覽器競(jìng)爭(zhēng)中的一個(gè)功能-Firefox領(lǐng)先。當(dāng)然情況也會(huì)發(fā)生變化,2000年之前IE達(dá)到95%的市場(chǎng)份額,Microsoft沒(méi)有再投資web,而是投向了.NET和Windows Presentation Foundation(譯者注:Windows Presentation Foundation (WPF) 的首要目標(biāo)在于協(xié)助開(kāi)發(fā)人員建立吸引人又有效率的用戶界面)。
? ? 無(wú)論如何不能總是看歷史,ASM.js的持續(xù)發(fā)展是wasm,這非常重要,理由是一旦ASM.js跨入其他瀏覽器,情況就越來(lái)越清晰,它會(huì)跨入所有的瀏覽器。
? ? 然而,JavaScript,甚至JavaScript的子集ASM.js都沒(méi)有SIMD、線程、共享內(nèi)存和其他基礎(chǔ)功能(primitives)。對(duì)于ASM.js仍然需要解析JavaScript,但它只是一個(gè)子集。你可以對(duì)該子集運(yùn)行一個(gè)專(zhuān)門(mén)的解析器,這又是一項(xiàng)維護(hù)瑣事,因?yàn)楝F(xiàn)在有了兩個(gè)解析器,一個(gè)解析器用于完整的JavaScript語(yǔ)言,另一個(gè)解析器用于JS子集ASM.js。
? ? 這樣將面臨代價(jià)很高的解析問(wèn)題,但可以用一個(gè)更加高效的,壓縮的抽象語(yǔ)法樹(shù)(abstract syntax tree:AST),這就是WebAssembly的目的。
? ? 當(dāng)人們被問(wèn)到web上的字節(jié)碼(bytecode),就認(rèn)為是Java字節(jié)碼。我認(rèn)為微軟和其他地方的研究人員已經(jīng)表明那不是他們想要的,在許多地方都很令人難受,AST編碼就好的多。
? ? 首先,WebAssembly開(kāi)始就像ASM.js一樣,但是用一個(gè)壓縮的語(yǔ)法,一個(gè)二進(jìn)制語(yǔ)法。但是一旦所有的瀏覽器支持了wasm和ASM.js,然后在一些瀏覽器版本更新后,就可以開(kāi)始增加更多的無(wú)需添加到JavaScript的語(yǔ)義(semantics)到wasm中。
? ? 實(shí)際上可以在JavaScript和wasm都添加,因?yàn)槭峭粋€(gè)引擎(1vm),但有一些不想放入JavaScript的功能就可以放入wasm,這樣可以利用C++或Haskell等語(yǔ)言的優(yōu)點(diǎn)。有大量的語(yǔ)言都可以編譯為wasm。
? EE: 可以舉一些例子嗎?
? BE: 好,這都在GitHub中有寫(xiě)到, 就是將共享內(nèi)存數(shù)組buffers要讓多線程游戲交叉編譯,這是對(duì)JavaScript施加的一個(gè)壓力,因?yàn)檫@花費(fèi)了最多的時(shí)間,我們不想要JavaScript中的競(jìng)爭(zhēng)條件?—?它總是在一個(gè)BUG很多的脆弱進(jìn)程中。這是一個(gè)我們想要放到WebAssembly中的一個(gè)例子,如果我們可以選擇的話。
? ? 沿著這個(gè)思路,還有很多類(lèi)似的功能,例如零花費(fèi)異常(zero cost exception)在JavaScript中可能沒(méi)有意義,這些功能需要一些編譯器和runtime聰明一些,但他們對(duì)于C++和Swift是有意義的。
? ? 另一個(gè)例子是call/cc (call-with-current-continuation)。Call/cc是非常強(qiáng)大的一個(gè)工具,它對(duì)JavaScript引擎的實(shí)現(xiàn)和安全風(fēng)險(xiǎn)都提出了挑戰(zhàn)。
? ? 還有一些非本地函數(shù)的gotos,可以調(diào)用一個(gè)continuation進(jìn)入到另外一個(gè)棧。所以這些是不同于ES6 generators中本地、受限的continuations。它們是更深的continuation。所以call/cc可以放入wasm,放入同時(shí)能夠處理wasm與JavaScript的引擎。這是可以想象到的。它不必進(jìn)入JavaScript語(yǔ)言但可以成為WebAssembly語(yǔ)法,同時(shí)不影響之前的JavaScript語(yǔ)言。
? EE: 說(shuō)到這里,那wasm是否存在安全風(fēng)險(xiǎn)需要仔細(xì)考慮呢?
? BE: 因?yàn)樗_(kāi)始與ASM.js共存,因此不會(huì)增加任何新的安全風(fēng)險(xiǎn),但可能在1-2年后開(kāi)始新的分支,那時(shí)就需要查看所有擴(kuò)展的安全屬性。這是一項(xiàng)新的挑戰(zhàn),這也是Google做native client成員思考最多的,他們?cè)谶@個(gè)領(lǐng)域的知識(shí)將非常有幫助。
? ? ?我們正在努力消除PNaCl和Emscripten在使用C++和LLVM編譯器中那些不確定的行為。從硬件向上查到C++規(guī)范,存在大量不確定行為,這不利于安全。
? ? JavaScript已經(jīng)遠(yuǎn)遠(yuǎn)超過(guò)規(guī)范中那些內(nèi)容,將努力比其他語(yǔ)言更安全。對(duì)于WebAssembly,需要做的比JavaScript還要多。
? EE: 在register中有一條有意思的頭條新聞:你是否正試圖殺死JavaScript? 事實(shí)的真相是什么呢?
? BE: [笑] 不, 我是實(shí)用主義者。我不是有經(jīng)驗(yàn)的C/C++ hacker,這是一個(gè)大系統(tǒng),大家都在努力, 但也面臨著web上的兼容性約束。
? ? 你不能違反web,不能了卻往事從頭開(kāi)始。任何想要嘗試這樣做的人都將失敗。
? ? 甚至當(dāng)你看移動(dòng)設(shè)備上的原生應(yīng)用時(shí),用戶界面與圖片都有相當(dāng)成熟的原生語(yǔ)言和工具包,但還是有大量的web,存在大量的hybrid apps。
? ? Facebook仍然在使用web views。所有的大型應(yīng)用,Amazon, Pinterest等等都在使用web views。有大量的web應(yīng)用是很愚蠢地使用native表示層而不是HTML編寫(xiě),這純粹是重復(fù)發(fā)明輪子。所以web仍然是非常非常重要的,它也是盈利最多的平臺(tái)。
? ? 智能手機(jī)已經(jīng)到處都是。在幾年之內(nèi),地球上幾乎每個(gè)成年人都將人手一部智能手機(jī),這是非常巨大的一個(gè)量級(jí),但這并不真正意味著智能手機(jī)就是一臺(tái)PC, 它更多的仍然是一個(gè)消費(fèi)級(jí)設(shè)備。不像你現(xiàn)在正在坐著,輸入信息,從事研究,更深入地購(gòu)物。
? ? 所以殺死JavaScript是不可行的,我正在做的是對(duì)真正的ASM.js的工程問(wèn)題做出響應(yīng)。從Epic公司的Unity引擎加載一個(gè)大的游戲會(huì)花20-30秒,這太長(zhǎng)了。利用壓縮的抽象語(yǔ)法樹(shù)編碼將快20倍,僅需要幾秒鐘。所以對(duì)wasm是有真正的需求,這是個(gè)有效需求。
? ? Wasm幫助JS贏得勝利,它不僅僅是原生代碼編譯的勝利。最終所有的瀏覽器和webviews都將支持wasm語(yǔ)法來(lái)服務(wù)于編譯目標(biāo)主人,并釋放JavaScript以便它可以服務(wù)于JavaScript主人。
? ? JavaScript曾經(jīng)有過(guò)分房子階段,但長(zhǎng)期來(lái)說(shuō)是不可行的。就像我說(shuō)的,即使共享數(shù)組buffer延伸,那也只是對(duì)JavaScript做的一點(diǎn)點(diǎn)延伸,如果可以讓wasm做C++想要做的一些外部工作,而不需要想各種辦法將這些不安全的事情放入JavaScript,將可以極大緩解JavaScript的壓力。
? ? ? 所以,提升解析性能而不是服務(wù)于兩個(gè)masters,才是做wasm的真正原因。我們并非是殺死JavaScript,我認(rèn)為不可能殺死JavaScript。
? ? ? ? ? ? ? ?“天沒(méi)有塌下來(lái).”
? ? ? EE: 這對(duì)于擔(dān)心JavaScript被殺死的許多人是個(gè)好消息。實(shí)際上,這是我在互聯(lián)網(wǎng)上看到的對(duì)wasm聲明最多的反應(yīng),人們害怕天正在塌下來(lái)。我想我們可以說(shuō)天沒(méi)有塌下來(lái), JavaScript仍然會(huì)堅(jiān)守一段時(shí)間。
? ? ? BE: 我認(rèn)為即使JavaScript有特權(quán)地位,wasm真正能夠開(kāi)始作為類(lèi)似于C++等靜態(tài)語(yǔ)言的目標(biāo),我們?cè)谖磥?lái)將垃圾回收、JIT編譯等擴(kuò)展功能放入wasm中還需要一段時(shí)間,動(dòng)態(tài)語(yǔ)言執(zhí)行良好所需要的一些特性也還需要一段時(shí)間。
? ? 與此同時(shí),Google里的成員正在做Dart編譯器,他們就是在堅(jiān)守JavaScript,因?yàn)楫?dāng)你不是在checked模式下編譯時(shí),Dart代碼就是真正的動(dòng)態(tài)代碼-它需要JavaScript的JITs (Just In Time即時(shí)編譯),它需要多種形式的內(nèi)聯(lián)緩存以及其他優(yōu)化。?
? ? 理論上, 我們會(huì)將Dart中的大整數(shù)/大數(shù)放入JavaScript,這是在未來(lái)的ECMAScript的日程中。我認(rèn)為JavaScript將長(zhǎng)期存在。真的很難說(shuō)在哪一個(gè)點(diǎn)上我們會(huì)在瀏覽器中放棄內(nèi)嵌的JavaScript,而只使用內(nèi)嵌高級(jí)語(yǔ)言。?
? ? ? EE: 回到上世紀(jì)90年代,我自己寫(xiě)了大量的C/C++代碼。我是在demoscene環(huán)境中長(zhǎng)大的,我不知道你是否熟悉,但我們基本上是在構(gòu)建藝術(shù)型應(yīng)用,類(lèi)似于依靠實(shí)際代碼運(yùn)行而不是事先錄制好視頻的電影。我們不再使用匯編語(yǔ)言來(lái)做視頻處理,或處理大量數(shù)據(jù)等工作。你是將wasm視為人們構(gòu)建這些應(yīng)用的有效工具嗎?
? ? (譯者注:Demoscene 是一種計(jì)算機(jī)亞文化,高手們通過(guò)編程展現(xiàn)出炫麗的實(shí)時(shí)動(dòng)畫(huà)音樂(lè)場(chǎng)景。主要技術(shù)是實(shí)時(shí)計(jì)算機(jī)圖形學(xué)。)
? ? ?BE: 是的。應(yīng)當(dāng)指出JavaScript將有SIMD。回到10年前Mozilla公司的Vladimir Vuki?evi? 最早開(kāi)始做的WebGL,然后進(jìn)入到Khronos Group行業(yè)協(xié)會(huì),WebGL作為基礎(chǔ)的一部分可以支持大型游戲公司Epic, Unity等等的業(yè)務(wù),這真的是太棒了。
? ? ?但那只是基于OpenGL ES, OpenGL的移動(dòng)profile。在WebGL 2中那只是從OpenGL ES2提升到3,所以你看看桌面GPUs, 它們可以做更多的事情。Wasm將會(huì)用OpenGL 4,最新的,最棒的桌面,有很炫的額外陰影,瞄向所有令人瘋狂的Nvidia GPUs。
? ? 這些GPUs未來(lái)可能會(huì)慢慢進(jìn)入移動(dòng)設(shè)備,但這會(huì)花很長(zhǎng)時(shí)間。不論WebGL發(fā)生什么,接下來(lái)幾年我們對(duì)于wasm有一個(gè)選擇, 就是要能夠更快的編程,包括那些高級(jí)GPUs.
? ? EE: 誰(shuí)在做這件事? 我知道你已經(jīng)在你的博客中提到有來(lái)自Microsoft和Google的員工在工作,都有誰(shuí)在做,我們能夠看到的支持來(lái)自哪里?
? ? BE: 對(duì)我來(lái)說(shuō)這很難,因?yàn)槲沂前l(fā)布了聲明,但我不屬于其他公司,你可能已經(jīng)注意到,公司不能將其名稱(chēng)租借出去,但這通常是由于協(xié)議延遲。這沒(méi)什么困難,主角就是從事WebKit, JavaScriptCore的人們, Filip Pizlo這個(gè)名字在GitHub庫(kù)中非常活躍(WebAssembly GitHub賬號(hào))。
? ? Filip為Apple工作。其他公司還有Microsoft, Mozilla, 和Google。
? ? Mozilla利用ASM.js走在前列,Google的成員們利用PNaCl,都在解決大量的相同問(wèn)題和不確定行為,思考ASM.js當(dāng)前還不支持的更高級(jí)特性,例如在做共享數(shù)組buffer之前需要實(shí)現(xiàn)動(dòng)態(tài)鏈接和線程。
? ? 我認(rèn)為在某個(gè)時(shí)間點(diǎn)上可以解決這些問(wèn)題。我認(rèn)為在Hacker News上許多人認(rèn)為我是個(gè)超級(jí)極客(big jerk), 因?yàn)椴恢趺椿厥?#xff0c;從我在Mozilla的骷髏王冠開(kāi)始, 我就極力從思想上控制業(yè)界的每個(gè)人阻止PNaCl進(jìn)入其他瀏覽器,或者說(shuō)如果我只是將它放在Mozilla (以非常大的代價(jià)) 那么其他人就會(huì)跟隨,因?yàn)槿绻鸐ozilla和Google做某件事,那么其他人也必須做這件事。 不是這樣的,可看看WebM。
? ? (譯者注:WebM項(xiàng)目是一個(gè)使用BSD許可證的開(kāi)源項(xiàng)目。它采用了On2 Technologies開(kāi)發(fā)的VP8及其后續(xù)版本VP9視頻編解碼器和Xiph.Org基金會(huì)開(kāi)發(fā)的Vorbis音頻編解碼器,使用的封裝格式則以Matroska格式為基礎(chǔ)。WebM項(xiàng)目是在2010年的Google I/O會(huì)議上發(fā)布的,之后宣布將會(huì)支持WebM的廠商有Mozilla、Opera和Google等。但WebM與H.264之間存在激烈的競(jìng)爭(zhēng)。)
? ? ? 所以我認(rèn)為那些不面對(duì)現(xiàn)實(shí)的人們有許多抱怨。事實(shí)是PNaCl不會(huì)跨瀏覽器,但許多工作是基于LLVM的。在我們做ASM.js之前PNaCl就已經(jīng)開(kāi)始了,所以這是相當(dāng)完美的聯(lián)姻。最初還認(rèn)為是多災(zāi)多難,但實(shí)際上它已經(jīng)讓之前從事ASM.js和PNaCl的人們轉(zhuǎn)向從事WebAssembly工作。
? ? ?EE: 假定大家都支持這件事, 那么什么時(shí)候我們可以看到瀏覽器內(nèi)嵌支持wasm呢?
? ? ?BE: 我不清楚。他們必須建立一個(gè)原型或者可以繼續(xù)發(fā)展的某項(xiàng)工作,因?yàn)槲覀儚腏avaScript和HTML學(xué)習(xí)到的一件事就是,不要做大量的硬版本(hard version)。你可以通過(guò)對(duì)象檢測(cè),特性檢測(cè)等工作來(lái)檢驗(yàn)自己的想法,或使用一些自動(dòng)化配置測(cè)試工具,編寫(xiě)防御性的代碼使得退回去更優(yōu)雅一些。
? ? 所以在幾年之后,當(dāng)wasm 2018內(nèi)部包含了call/cc, 可能一些其他語(yǔ)言就運(yùn)氣不佳,但如果它也有諸如零花費(fèi)異常等高級(jí)特性,那你就可能想要在瀏覽器中利用不帶零花費(fèi)異常功能的wasm 2017運(yùn)行,盡管可能你會(huì)遭受到異常調(diào)用的嚴(yán)重影響。但這也許可以。
? ? 從JavaScript編程來(lái)講有一些非常重要,在8年前使用ES4時(shí)我們已經(jīng)將mimetype versioning戲稱(chēng)為1JS. 在RFC 4329中,Bjoern Hoehrmann將JavaScript寫(xiě)為`<script type=”application/ecmascript”>` 。他說(shuō)有一個(gè)version參數(shù),但沒(méi)有說(shuō)version有哪些值, (但不能忽略這個(gè)參數(shù)),于是人們總是得到錯(cuò)誤的versions,錯(cuò)誤的mimetypes或沒(méi)有任何mimetype的script標(biāo)簽。
? ? version locking的整個(gè)思路是失敗的, 而且我認(rèn)為在其他runtime系統(tǒng)中使用它通常就是個(gè)問(wèn)題。在接下來(lái)幾個(gè)月里,我期望他們可以對(duì)抽象語(yǔ)法樹(shù)編碼性能感到滿意,權(quán)衡編碼與解碼效率,這里解碼是最重要的。他們對(duì)如何擴(kuò)展語(yǔ)法會(huì)有好的想法。
? ? ?接下來(lái),他們可以開(kāi)始每天晚上運(yùn)行。我期望某個(gè)時(shí)間點(diǎn) —?我想是到明年 — 但這完全是個(gè)猜測(cè),我沒(méi)有可透視未來(lái)的魔幻水晶球。但我們將會(huì)開(kāi)始看到,支持wasm的瀏覽器至少每天晚上都會(huì)運(yùn)行,也可能會(huì)在這個(gè)秋季實(shí)現(xiàn)。
? ? 社團(tuán)人們將很快開(kāi)始考慮語(yǔ)法的標(biāo)準(zhǔn)化。有一件事使得這件很緊迫的工作顯得不那么緊迫,那就是已經(jīng)有一個(gè)polyfill?—?實(shí)際上就是一個(gè)庫(kù)—?一個(gè)JavaScript版本的解碼器,這個(gè)解碼器可以將二進(jìn)制代碼變回到ASM.js, 可作為抽象語(yǔ)法樹(shù)的原型。
? ? 即使現(xiàn)在JavaScript已經(jīng)有軟件實(shí)現(xiàn)的wasm,但不必提交成為正式的語(yǔ)法。在現(xiàn)代HTML5時(shí)代,web標(biāo)準(zhǔn)的關(guān)鍵是不斷迭代,不要去做一些宏大的10年的規(guī)范,希望事情馬上就塵埃落定,就像ES4曾經(jīng)做過(guò)大的重構(gòu), ES6也是有大量變化,唯一拯救它的就是在真正的引擎中做增量式原型。
? ? HTML5就是一個(gè)龐大、多年的version,最終打了一個(gè)巨大的版本戳5,但實(shí)際上在任何人聲稱(chēng)已經(jīng)完成之前又過(guò)去了很多年。
? ? ?EE: 你剛才提到了一個(gè)原型, 那現(xiàn)在是否可以下載,試用?
? ? ?BE: 可以的。如果通過(guò)GitHub賬號(hào)登錄,訪問(wèn)WebAssembly,可以在polyfill-prototype-1下看到一個(gè)解碼器。我還沒(méi)有時(shí)間,但如果你看看Emscripten,Emscripten將通過(guò)一個(gè)可選的模式來(lái)使用這個(gè)polyfill,即JavaScript解碼器的庫(kù)。我想現(xiàn)在可以試驗(yàn)下。
?
? ? ?EE: 所有這些都會(huì)融入到wasm,那么會(huì)像在你的談話"Taking the High Road and the Low Road"中所說(shuō)的那樣,JavaScript中還會(huì)增加一些底層特性嗎??
? ? ?BE: 是的,就像我說(shuō)的那樣,wasm會(huì)沿著支持道路走下去,不再需要polyfill,那么就會(huì)比ASM.js有更多的表達(dá)力,它會(huì)有更強(qiáng)大的語(yǔ)義,但這還需要一段時(shí)間。
? ? 同時(shí)許多人還會(huì)深入學(xué)習(xí)JavaScript,因?yàn)槿藗冃枰?#xff0c;即使它不能被編譯,人們希望可以手工編碼。同時(shí),SIMD,以及l(fā)ibm中的一些功能,例如`Math`對(duì)象、內(nèi)聯(lián)函數(shù)都被提升到高層語(yǔ)言中。如果你曾經(jīng)編寫(xiě)過(guò)C或C++代碼,你會(huì)看到有許多功能已經(jīng)增加到ES6中,還有更多的功能已經(jīng)在排在日程上。?
? ? 我認(rèn)為我們將仍然是既要走底層道路,同時(shí)也要走高層道路,但我認(rèn)為這可能是按5年時(shí)間來(lái)算,現(xiàn)在還不需要太擔(dān)心,如果有一些底層功能只用于編譯器,并且可以確信JavaScript手工編程人員不需要,那么就不會(huì)增加該功能到JavaScript中,即不需要服務(wù)于兩個(gè)主人。?
? ? ?EE: 你認(rèn)為這會(huì)導(dǎo)致大量語(yǔ)言被碎片化,或者說(shuō)差異化(diversity),區(qū)別是什么? 這是件好事還是壞事? 許多人好像很困惑。?
? ? ?BE: 我認(rèn)為JavaScript已經(jīng)成為瀏覽器中唯一的動(dòng)態(tài)語(yǔ)言,但wasm可以支持許多編譯語(yǔ)言,也就是靜態(tài)語(yǔ)言—尤其是使用LLVM的語(yǔ)言。微軟有自己的編譯器,所以他們會(huì)通過(guò)另一個(gè)編譯器框架支持wasm,但這非常棒。越多越好。?
? ? ?當(dāng)然,GCC或類(lèi)似的編譯器都可以生成wasm,但我認(rèn)為動(dòng)態(tài)語(yǔ)言,例如Dart, Ruby, Python, 甚至JavaScript?—?都會(huì)需要我前面提到的一些擴(kuò)展, 例如垃圾回收鉤子、JIT支持等等,否則它們將沒(méi)有競(jìng)爭(zhēng)力。?
? ? ?有好的先例,JVM經(jīng)過(guò)多年的成長(zhǎng),感謝John Rose加入了類(lèi)似于`invokedynamic` 以及其他鉤子用于JIT編譯優(yōu)化,,例如多種形式的內(nèi)聯(lián)緩存, 所以JVM實(shí)際上是一個(gè)可信賴的動(dòng)態(tài)語(yǔ)言平臺(tái)。?
? ? ?所有這些運(yùn)行時(shí)(runtime)都已經(jīng)變成了通曉多種語(yǔ)言的虛擬機(jī)—JavaScript VMs. Java還沒(méi)有死,就是因?yàn)镴VM現(xiàn)在支持Clojure, Scala以及其他語(yǔ)言。我們幾乎是在編程語(yǔ)言的第二個(gè)黃金年代,你知道,現(xiàn)在有Rust, Haskell, Idris, 以及其他語(yǔ)言。?
?? ? 我想說(shuō)的是越多越好. 那不會(huì)成為巴別塔(the tower of Babel),因?yàn)槲艺J(rèn)為不論是現(xiàn)在和未來(lái),JavaScript都將成為瀏覽器的通用語(yǔ)言(the lingua franca of the browser)。如果你正在編寫(xiě)前端代碼,或者當(dāng)你描繪輪廓時(shí)在非關(guān)鍵路徑上做的其他事情。
? ? ?但如果你真的想把這些映射為3d游戲, 或者一些超級(jí)復(fù)雜的計(jì)算機(jī)視覺(jué)內(nèi)核算法, 那么你可能要用C++或其他語(yǔ)言編譯成wasm, 也許5年后, 如果人們對(duì)可編譯為wasm的語(yǔ)言充滿熱情, 那么這門(mén)語(yǔ)言地位就會(huì)上升, 我認(rèn)為這不是個(gè)問(wèn)題, 這只是大都市生活的一部分.?
? ? ?EE: 也就是說(shuō)你最終想要看到的是JavaScript語(yǔ)言消失, 如果有更好的語(yǔ)言出現(xiàn)的話??
? ? ?BE: 再重復(fù)一遍,我沒(méi)有預(yù)測(cè)它會(huì)如何被殺死,因?yàn)閣eb上所有的內(nèi)容都必須在瀏覽器內(nèi)運(yùn)行,wasm中實(shí)現(xiàn)一個(gè)能夠像V8那樣快速運(yùn)行的JavaScript runtime將是對(duì)工程師的一個(gè)真正挑戰(zhàn)。但沿著這條路走下去,如果過(guò)了很多年某個(gè)人做到了,那么就可以讓JavaScript成為n個(gè)wasm實(shí)現(xiàn)語(yǔ)言的一種。
? ? ?但JavaScript語(yǔ)言在web中仍然有神奇的立足點(diǎn)。而且它還在不斷發(fā)展,因?yàn)槲覀內(nèi)匀辉谂κ笿avaScript成為手工編碼人員更好的語(yǔ)言,所以它不會(huì)停滯不前。人們對(duì)ES6的評(píng)價(jià)是:這不是之前的JavaScript了,現(xiàn)在非常棒。
? ? ?再次,沒(méi)有可透視未來(lái)的魔幻水晶球,我只是認(rèn)為很難讓JavaScript語(yǔ)言消失。我不會(huì)去殺死JavaScript語(yǔ)言。當(dāng)人們不再需要JavaScript時(shí),其壽命自然會(huì)終止,如果人們發(fā)現(xiàn)其他語(yǔ)言更好,如果繼續(xù)沿著這條路走, 經(jīng)過(guò)許多次的更新迭代, 人們不擔(dān)心嵌入到瀏覽器中的是JavaScript語(yǔ)言, 那么我會(huì)說(shuō)“que sera sera.”(法語(yǔ): 該來(lái)的總會(huì)來(lái))
? ? ?我認(rèn)為, 那些想讓JavaScript語(yǔ)言消失的人是因?yàn)樗麄儗?duì)它由于某些原因而抱有敵意, 他們將會(huì)失望而歸,JavaScript語(yǔ)言不會(huì)消失。
? ? ?這對(duì)于JavaScript和其他語(yǔ)言來(lái)說(shuō)實(shí)際上是件好事。不要假設(shè)時(shí)間會(huì)停滯,我認(rèn)為wasm將會(huì)包含越來(lái)越多其他語(yǔ)言的特性,也包括JavaScript語(yǔ)言的特性。?
? ? ?這是各方都能夠贏的實(shí)例,這確實(shí)滿足了web業(yè)界每一家的利益, 無(wú)論是Apple, Google, Microsoft, 還是Mozilla。
? ? ?現(xiàn)在要做的是聚焦增量式提升,而不是偏離現(xiàn)實(shí)太遠(yuǎn)。類(lèi)似于ES4, PNaCl, Dart, XHTML的工作都將回退到以往的日子。所有那些試圖以自己公司宏大計(jì)劃模式來(lái)重建web的大碰撞將不會(huì)再起作用。
? ? ?所以現(xiàn)在我們這些人一起合作,解決這些小的碰撞,我們應(yīng)當(dāng)會(huì)看到一系列的小碰撞將會(huì)產(chǎn)生非常大的累積效果。
?譯者注:最后附上一頁(yè)Brendan Eich在Modern Web 2015會(huì)議上的主旨演講-JavaScript at 20 Years視頻中的最后一頁(yè),Alaways bet on JS(永遠(yuǎn)賭JS贏):
? ??
后記:[6]中Brendan Eich于2013就已經(jīng)指出Web就是游戲平臺(tái)(The Web is the Game Platform),許多技術(shù)用于加速Web端的游戲開(kāi)發(fā),包括asm.js, 一個(gè)JavaScript優(yōu)化技術(shù),純JS子集目標(biāo)語(yǔ)言for編譯器;Emscripten, 一個(gè)C++到JavaScript的編譯器;OdinMonkey, SpiderMonkey JavaScript引擎編譯器forasm.js源碼。與Epic游戲公司創(chuàng)始人和CEO Tim Sweeney對(duì)許多事有相同的觀點(diǎn),例如通過(guò)C++通過(guò)asm.js,JS可下沉作為一種安全的類(lèi)似匯編的target語(yǔ)言。
這些都表明,游戲產(chǎn)業(yè)在拉動(dòng)和推動(dòng)Web端JavaScript技術(shù)的快速發(fā)展。
參考資料:
[1]?WebAssembly系列1-從 ASM.JS 到 WebAssembly,?http://my.oschina.net/1pei/blog/487683
[2] Why we Need WebAssembly, An Interview with Brendan Eich,?Eric Elliott,?June 17th, 2015,?https://medium.com/javascript-scene/why-we-need-webassembly-an-interview-with-brendan-eich-7fb2a60b0723?
[3]?What is WebAssembly? The Dawn of a New Era,?Eric Elliott,?June 18th, 2015,?https://medium.com/javascript-scene/what-is-webassembly-the-dawn-of-a-new-era-61256ec5a8f6
[4]?Modern Web 2015, May 15th-16th, 2015,?http://modernweb.tw/program.html
[5]?WebGL 2 Specification, Editor's Draft 24 July 2015, https://www.khronos.org/registry/webgl/specs/latest/2.0/
[6]?The Web is the Game Platform, 29 March, 2013,?https://brendaneich.com/2013/03/the-web-is-the-game-platform/
轉(zhuǎn)載于:https://my.oschina.net/1pei/blog/488584
總結(jié)
以上是生活随笔為你收集整理的WebAssembly系列2-为什么我们需要WebAssembly—采访Brendan Eich的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 税控盘查看服务器设置的网站,税控盘服务器
- 下一篇: Adobe全系列软件介绍