JavaScript和JSON創(chuàng)建者對JavaScript未來的展望
近期在倫敦召開的 FullStack大會 上, Brendan Eich 和 Douglas Crockford 分別做演講探討了JavaScript的未來。Eich是JavaScript的創(chuàng)建者;Crockford是JSON的創(chuàng)建者,也是《JavaScript語言精粹》(“JavaScript: The Good Parts”)一書的作者。Eich的大會演講主要聚焦于一些需迭代改進的語言特性。Crockford引導(dǎo)聽眾聚焦于JavaScript軟件工程的下一步發(fā)展,他稱之為一種全球分布的、安全的異步編程模式。
Crockford指出,包括JavaScript在內(nèi)的所有編程語言目前都停滯于舊架構(gòu)中,即單機的單地址空間中,這造成了一些不必要的麻煩。但是由于JavaScript在函數(shù)和對象上實現(xiàn)的一些有意義的探索,Crockford相信相比其它語言,JavaScript要更有益于推進架構(gòu)的轉(zhuǎn)變。
Eich提及在創(chuàng)建JavaScript中的最大遺憾,就是在語言初次發(fā)布后不久就立刻對用戶有求必應(yīng),而不是考慮如何更好地解決用戶的問題。例如,12==’12’是使用相等運算符“==”做強制類型轉(zhuǎn)換,以便于處理通過HTTP將數(shù)據(jù)推送到服務(wù)器。
Crockford指出,JavaScript語言面臨著一個問題,它可能過分關(guān)注“整形手術(shù)缺陷”的修修補補,而不是清楚地指明未來的改進方向。
與十年前相比,我認為語言中好的部分更少了,但是這些部分也做得更好了。
Eich介紹了多年來JavaScript語言的改進情況,以及其中一些煥發(fā)了新活力的舊特性。例如,盡管E4X從未被JavaScript接受,但JSX,即“剔除了不好的XML部分的E4X”,卻深受React用戶的喜愛。
在本次演講中,Eich重點強調(diào)了asm和WebAssembly的價值。asm.js源自JavaScript靜態(tài)類型子集,實行以接近本機速度運行源代碼。達到如此的性能改進,是因為asm支持從即刻編譯(JIT)切換到預(yù)先編譯(AOT),直接從抽象語法樹(AST)轉(zhuǎn)換為機器代碼生成。
WebAssembly是一種加載更快的、采用更廣泛的asm.js版本。盡管WebAssembly仍然是同一JavaScript虛擬機的組成部分,但是它用單獨的進程運行,因此它可以具有比JavaScript更具表現(xiàn)力的語法。
Eich特別介紹了一些令他非常興奮的特性,這些特性最早可于明年出現(xiàn)在JavaScript中。包括:
TC39 BigInt:一種新的值類型,用于處理任意精度的整數(shù),bigness提供對TypeArrays的支持。 動態(tài)import():默認情況下,ES模塊是靜態(tài)導(dǎo)入的。動態(tài)導(dǎo)入還支持預(yù)取(prefetching)。 Array.prototype.flat/flatMap:實現(xiàn)任意數(shù)組的展平,它是實現(xiàn)展平和smooshgate的解決方案。 更多的解析操作:用于任意對象和數(shù)組。 類中的私有方法和訪問器:在Eich看來,符號前綴“#”稍具爭議,不應(yīng)再使用。 異步迭代:用于await語法。 正則表達式上的一些改進。更多建議及細節(jié)內(nèi)容,參見 TC39建議的完整列表 。
Crockford在演講中花了一些時間,質(zhì)疑了聽眾的一些深層假設(shè),并提出這些假設(shè)是如何影響大家的進步的。例如,計數(shù)是否應(yīng)采用從“0”開始,還是從“1”開始?Crockford解釋了為什么他認為一切都應(yīng)該從“0”開始。
Crockford指出,缺乏正確的尾調(diào)用和尾調(diào)用優(yōu)化( tail call optimization )his目前為止在ES2015實現(xiàn)中的最令人失望之處。當前只有Safari實現(xiàn)了該部分規(guī)范。據(jù)Crockford介紹,尾調(diào)用是ES2015中添加的最重要特性,它有助于支持作為迭代替代功能的尾遞歸(tail recursion),以及后續(xù)傳遞(continuation passing)。
在Crockford看來,純函數(shù)(pure functions)是語言未來發(fā)展中至關(guān)重要的特性。任何會影響純函數(shù)的特性,都不應(yīng)考慮在語言中采用。
目前JavaScript中也存在著不少Crockford不喜歡的特性,例如async/await特性。該特性有礙于開發(fā)人員對異步編程的理解,會使異步編程看起來就像是同步。
Crockford解釋了他對簡單性的看法。“標準越簡單,需要達成一致之處也就越少,就越有可能實現(xiàn)互操作性”。他以JSON為例做了解釋。JSON作k為一種語法,它并不涉及行為,易于理解和使用。JSON的全部語法甚至可在一張名片背面放下。
Crockford正致力于實現(xiàn)一種稱為“neo”的新語言和Transpiler(源到源編譯器)。它以一種新語言的形式實現(xiàn)Crockford認可的JavaScript特性,并源到源編譯為定義良好JavaScript程序。Crockford有望于近期推出《JavaScript工作機制》(“How JavaScript Works.”)一書,介紹其中的技術(shù)細節(jié)。
在演講的問答部分,Eich被問及了 二進制抽象語法樹(binary-ast)提案 的情況。該提案介于傳統(tǒng)JavaScript和WebAssembly之間,為所有的JavaScript提供了二進制語法樹。
Eich認為,binary-ast是一種潛在的實效(pragmatic)方法,但其優(yōu)點有待通過初始實施及后續(xù)性能指標驗證。Mozilla正在致力于初步實現(xiàn)。其潛在的風險在于它可成為另一種安全攻擊向量。此外,它會鼓勵開發(fā)人員編寫更大型的JavaScript代碼庫,而不是依靠工具和規(guī)則來優(yōu)化代碼庫。
當被問及TypeScript等類型系統(tǒng)時,Eich認為動態(tài)編程有其便利性。不會對編程產(chǎn)生妨礙的類型形態(tài),無疑是一種好的類型系統(tǒng)。Eich指出,“人們習慣于使用不需付出任何代價的類型系統(tǒng)。”
TypeScript非常出色,它是JS的一個嚴格超集。每個JS程序也是一個TS程序。Anders Hejlsberg是首屈一指的。
演講中,Crockford還被問及了一個關(guān)于TypeScript的負面問題:“它并沒有解決我所遇到的問題”。出現(xiàn)這一誤解的原因,在于TypeScript的主要優(yōu)點是幫助定義接口。Crockford曾認定,“事情間的接口通常是產(chǎn)生錯誤之處”,而TypeScript有助于防止出現(xiàn)此類錯誤。
在被問及React之類特性是否可以標準化時,Eich介紹了Dojo和Prototype等早期的軟件庫是如何將其概念引入到更高版本的JavaScript中的。進而指明,“我們的工作并非去標準化React等軟件庫”,而是努力實現(xiàn)將基本原語從軟件庫中提升到核心語言中。Eich指出,過早做標準化會導(dǎo)致問題,尤其是對于類型系統(tǒng)等尚待時日的解決方案。
在被問及對基于RxJS Observables的Observables提案的看法時,Eich指出,該規(guī)范目前停滯不前,要在JavaScript語言中構(gòu)建所需特性是一個挑戰(zhàn),他也不確定是否應(yīng)該將Observables添加到語言中。他并未提及的是, 用于流的WHATWG規(guī)范 是Observables提案的一個超集。或許正是這兩個提案之間的競爭,阻礙了Observables提案的推進。
最后在被問及對機器學(xué)習的看法時,Eich指出,盡管深度學(xué)習非常有用,但是該技術(shù)并沒有給出任何因果關(guān)系。目前的工作,只是一些高級形式的曲線擬合算法。
會議演講視頻免費提供,但需要注冊。注冊是開放的。
Eich的演講,“下一代JavaScript”( JavaScript: The Next Generation ); Crockford的演講,“JavaScript工作方式先睹為快”( How JavaScript Works: A Preview )。查看英文原文: Eich and Crockford on the Future of JavaScript: Insight from the Creators of JavaScript and JSON
來自:http://www.infoq.com/cn/news/2018/08/eich-crockford-js-future
相關(guān)文章:
1. ASP 信息提示函數(shù)并作返回或者轉(zhuǎn)向2. 淺談python出錯時traceback的解讀3. python matplotlib:plt.scatter() 大小和顏色參數(shù)詳解4. JSP數(shù)據(jù)交互實現(xiàn)過程解析5. PHP設(shè)計模式中工廠模式深入詳解6. Python importlib動態(tài)導(dǎo)入模塊實現(xiàn)代碼7. Ajax實現(xiàn)表格中信息不刷新頁面進行更新數(shù)據(jù)8. 利用promise及參數(shù)解構(gòu)封裝ajax請求的方法9. windows服務(wù)器使用IIS時thinkphp搜索中文無效問題10. .NET中l(wèi)ambda表達式合并問題及解決方法
