自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Dart VS JavaScript之JavaScript的先天殘疾

開(kāi)發(fā) 前端
Google 近日推出 Dart 語(yǔ)言,劍指大紅大紫的JavaScript。為什么Google 挑了這個(gè)看著不軟的柿子,Dart 能不能順利推倒傲嬌的 JavaScript,這篇文章主要分析這兩個(gè)口水側(cè)漏的問(wèn)題。

敬告:本文作者沒(méi)寫(xiě)過(guò)上萬(wàn)行的代碼,文中信息全部為道聽(tīng)途說(shuō),未經(jīng)查證;文中觀點(diǎn)可能偏頗狹隘一根筋,謹(jǐn)做拋磚引玉之用。望達(dá)者查之,讀者自重,噴者迅猛。

Google 近日推出 Dart 語(yǔ)言,劍指大紅大紫的JavaScript。為什么Google 挑了這個(gè)看著不軟的柿子,Dart 能不能順利推倒傲嬌的 JavaScript,這篇文章主要分析這兩個(gè)口水側(cè)漏的問(wèn)題。

JavaScript 和 Google 的蜜月

JavaScript 本來(lái)是 Netscape 的小打小鬧,可作為網(wǎng)頁(yè)動(dòng)態(tài)腳本的開(kāi)先河者,它第一個(gè)實(shí)現(xiàn)了對(duì)網(wǎng)頁(yè)動(dòng)態(tài)指指畫(huà)畫(huà)的功能,必然隨著 Web 壯大而壯大。2005 年,AJAX 興起,網(wǎng)絡(luò)應(yīng)用形勝,JavaScript 更是如日中天。盡管其它腳本語(yǔ)言(e.g.VBScript, Perl等)能實(shí)現(xiàn)相同功能,JavaScript 是唯一一個(gè)跨平臺(tái)跨設(shè)備瀏覽器都支持的語(yǔ)言。知名科技 Blog 摳腚好弱甚至說(shuō),所有能用 JavaScript 實(shí)現(xiàn)的,必將被 JavaScript 實(shí)現(xiàn)。

回顧 AJAX 的興起,Google 扮演了重要的推手角色。幾個(gè)標(biāo)志性網(wǎng)絡(luò)服務(wù) Gmail, Google Maps, Google Group,甚至 Google 搜索建議,都采用了 AJAX 實(shí)現(xiàn)。用戶端無(wú)需安裝任何插件,便有交互效果。榜樣的力量是無(wú)窮的,Google 的服務(wù)充分展現(xiàn)了 AJAX 的潛力,之后就是大家一擁而上,將 AJAX 捧到聚光燈下??紤]到 JavaScript 在 AJAX 之前都是小打小鬧,驗(yàn)證個(gè)表單什么的,被人認(rèn)為不堪大用。如果當(dāng)時(shí)你說(shuō)自己會(huì) JavaScript 都沒(méi)人搭理你,怎么也要懂個(gè) ASP/JSP 才拿得出手。當(dāng)然也不是說(shuō) JavaScript 可有可無(wú)。就去年,我在網(wǎng)上訂機(jī)票,把身份證號(hào)填成手機(jī)號(hào),竟然就注冊(cè)成功了,結(jié)果最后空姐不讓我登機(jī)!媽的,2010 年了,在網(wǎng)頁(yè)上加個(gè) JavaScript 表單驗(yàn)證會(huì)死么?分辨身份證號(hào)碼和手機(jī)號(hào)碼是尼瑪世界級(jí)難題么?跑題了,總之還是 Google 把 JavaScript 從小蘿莉帶入青春期。

AJAX 應(yīng)用越來(lái)越多,JavaScript 代碼越來(lái)越多,短板也暴露的越來(lái)越明顯眾所周知,評(píng)判編程語(yǔ)言的標(biāo)準(zhǔn)和評(píng)判男人的標(biāo)準(zhǔn)不一樣。其中重要的一個(gè)標(biāo)準(zhǔn)是看編程語(yǔ)言有多快(嚴(yán)格地說(shuō),編程語(yǔ)言無(wú)快慢之分,編程語(yǔ)言的實(shí)現(xiàn)才有。為了語(yǔ)言簡(jiǎn)潔,本文用編程語(yǔ)言快慢代指。)。而 JavaScript 最大的問(wèn)題是,太!慢!了!

作為腳本語(yǔ)言,沒(méi)有事先編譯,性能完全靠瀏覽器里的 JavaScript 引擎。Google 在芬蘭找了一個(gè)團(tuán)隊(duì),閉門(mén)造車(chē)兩年打造出 V8 JavaScript 引擎,內(nèi)置入 Chrome 瀏覽器。而 Chrome 在 08 年橫空出世,用幾百上千倍的 JavaScript 速度分?jǐn)?shù)秒殺了當(dāng)時(shí)市場(chǎng)上一切其它瀏覽器。自然,后來(lái)其它瀏覽器紛紛跟上,蘋(píng)果搞了 Safari Nitro 引擎,Mozilla 更新了各種猴子 JavaScript 引擎,連 IE 也不甘落后,搞出 Chakan 引擎各種提速,這貨雖說(shuō)不比 Google Chrome V8 的速度,也聊勝于無(wú)。終于,JavaScript 引擎性能的突破使其能夠滿足現(xiàn)代網(wǎng)絡(luò)應(yīng)用部署的需要。這次,Google 把 JavaScript 從含苞待放的青春前期催熟到青春后期。

吊詭的是,如今推出 Dart 語(yǔ)言的團(tuán)隊(duì)便包含當(dāng)年開(kāi)發(fā) V8 引擎的團(tuán)隊(duì)。他們對(duì) JavaScript 的評(píng)價(jià)是:“JavaScript 語(yǔ)言與生具來(lái)的殘疾是無(wú)法通過(guò)進(jìn)化改善的。”

就是說(shuō),感情破裂了。

JavaScript 的非主流本質(zhì)

究其原因,最大的瓶頸源于 JavaScript 是非主流語(yǔ)言的本質(zhì)。

JavaScript 是基于原型(Prototype-based)的編程語(yǔ)言,而現(xiàn)在最主流的對(duì)象編程語(yǔ)言都是基于類(lèi)(Class-based)的。兩者根本的區(qū)別在于,迥異的視角產(chǎn)生的不同方法論。。。

不嚴(yán)謹(jǐn)?shù)卣f(shuō),基于類(lèi)的語(yǔ)言邏輯來(lái)自分類(lèi)學(xué)(Taxonomy),自上而下進(jìn)行實(shí)現(xiàn)。程序員先要理清楚各種類(lèi)之間的關(guān)系,定義好各種類(lèi),才能寫(xiě)出類(lèi)下面的實(shí)例(可用對(duì)象)。而基于原型的語(yǔ)言邏輯來(lái)自認(rèn)知論,舉一反三進(jìn)行實(shí)現(xiàn),更符合人類(lèi)正常認(rèn)知的模式。程序員先關(guān)注幾個(gè)個(gè)例的具體行為,之后再分類(lèi)使用。不恰當(dāng)比喻說(shuō)明,如果讓基于類(lèi)的語(yǔ)言寫(xiě)出一個(gè)男人,要先找到人類(lèi)。然后創(chuàng)建一個(gè)男人子類(lèi),子類(lèi)具有人類(lèi)一切屬性且有男性性征。之后在男人子類(lèi)創(chuàng)建出具體的男人甲。而基于原型的語(yǔ)言,可以先觀察女人和公猿,然后刪刪減減拼拼湊湊得到一個(gè)男人的原型,之后按照原形創(chuàng)建一個(gè)男人乙。

可以看出,基于類(lèi)的編程主要方法是繼承,男人子類(lèi)繼承了人類(lèi)所有屬性,男人甲擁有男人子類(lèi)所有屬性并賦了值,比如身高 175 體重 300 斤。而原型編程主要方法是克隆,男人原型克隆了女人的智商和皮膚屬性,公猿的性腺和嗓音屬性等等其它不細(xì)說(shuō)了,請(qǐng)自行腦補(bǔ)。

計(jì)算機(jī)科學(xué)史上,先出現(xiàn)的是基于類(lèi)的語(yǔ)言,后來(lái)才有基于原型的語(yǔ)言。前者在對(duì)象編程領(lǐng)域一直是主流,大學(xué)里教的主要是這個(gè),多數(shù)研究也集中在這個(gè)領(lǐng)域。而原型編程,雖說(shuō)由于 JavaScript 的存在使用的很多,但和基于類(lèi)的編程相比還是非主流狀態(tài)。這就導(dǎo)致了一些相對(duì)劣勢(shì)。

由于缺乏對(duì)類(lèi)的支持,而很多開(kāi)發(fā)人員又習(xí)慣基于類(lèi)編程。很多 JavaScript 庫(kù)模擬了自己的類(lèi)對(duì)象,便于開(kāi)發(fā)人員調(diào)用??瓷先ガF(xiàn)在兩全齊美了,其實(shí)沒(méi)有。關(guān)鍵問(wèn)題是,性能。

拜 Google 所賜,JavaScript 擁有目前世界上最有技術(shù)含量最復(fù)雜的腳本引擎,速度和其它腳本語(yǔ)言相比無(wú)以匹敵。Google 對(duì) JavaScript 的最主要提速來(lái)自 JIT(Just-in-time) 編譯,把 JavaScript 預(yù)編譯成機(jī)器碼,在執(zhí)行時(shí)直接調(diào)用機(jī)器碼提升效率??筛鷤鹘y(tǒng)編譯語(yǔ)言比起來(lái),性能不可同日而語(yǔ);甚至比 JAVA, C# 也略遜一籌。

事實(shí)上,JavaScript 引擎相當(dāng)復(fù)雜,且提速越來(lái)越難。這也跟 JavaScript 非主流原型編程有關(guān)。

基于類(lèi)的語(yǔ)言,同類(lèi)實(shí)例的數(shù)據(jù)結(jié)構(gòu)和方法都相同,男人甲乙丙丁都有身高體重胸圍,無(wú)非是數(shù)值區(qū)別。這種情況下,腳本引擎只需要優(yōu)化該類(lèi)一次,生成本地碼,之后反復(fù)套用,自然會(huì)有效率性能提升。

而原型語(yǔ)言不同,沒(méi)有類(lèi)的概念。傳統(tǒng)原型語(yǔ)言引擎的經(jīng)典方法是給出一個(gè)大字典(HashMap),每次調(diào)用具體數(shù)值都去查字典,如此操作費(fèi)時(shí)費(fèi)力??扇绻姘凑疹?lèi)語(yǔ)言進(jìn)行預(yù)編譯,又不知道編譯出來(lái)的本地碼后面是否被頻繁調(diào)用。有時(shí)甚至得不償失,花在預(yù)編譯上的時(shí)間還未必比查字典少。Google 的 V8 引擎則另辟蹊徑,分析發(fā)現(xiàn) 90% 的JavaScript object 是有規(guī)律可循的。于是他們總結(jié)規(guī)律,人為地生成隱藏類(lèi),對(duì)隱藏類(lèi)進(jìn)行優(yōu)化編譯。當(dāng)掃描的符合條件 JavaScript 代碼時(shí),自動(dòng)調(diào)用事先編譯好的機(jī)器碼執(zhí)行。

現(xiàn)在你知道原型語(yǔ)言 JavaScript 為開(kāi)發(fā)者和引擎造成了多大的擰巴。這種復(fù)雜性帶來(lái)的維護(hù)成本上升,開(kāi)發(fā)門(mén)檻提高。要是用了主流類(lèi)語(yǔ)言,不會(huì)有這么多麻煩。

JavaScript 本身缺乏很多特性,如不支持 Static Typing,調(diào)試維護(hù)相對(duì)困難;調(diào)用多個(gè)第三方庫(kù)難以保證不沖突;內(nèi)置庫(kù)太迷你等等等等。當(dāng)然這些都有解決方法。事實(shí)是,大多數(shù) JavaScript 的粉絲也承認(rèn),JavaScript 是有一些缺陷的。

于是有了 Google Dart 語(yǔ)言,最核心的特性 1)基于類(lèi) 2)可選類(lèi)型(支持 dynamic/static typing)3)豐富內(nèi)置庫(kù) 4)開(kāi)發(fā)工具豐富。分別對(duì)應(yīng)了上文提到的 JavaScript 缺陷。

下篇待續(xù):Dart 的今生來(lái)世,主要分析 Dart 能否推倒青春后期的 JavaScript。

原文:http://www.guao.hk/posts/dart-vs-javascript-side-a-javascripts-legacy-problems.html

【編輯推薦】

  1. 眾家評(píng)說(shuō)谷歌新編程語(yǔ)言Dart
  2. Google新結(jié)構(gòu)化編程語(yǔ)言Dart可運(yùn)行在Jvm上
  3. Dart之于JavaScript正如C#之于C++
  4. Google宣布結(jié)構(gòu)化編程語(yǔ)言Dart的設(shè)計(jì)目標(biāo)
  5. Google強(qiáng)推Dart語(yǔ)言替代JavaScript 意欲何為?
責(zé)任編輯:陳貽新 來(lái)源: 谷奧
相關(guān)推薦

2020-05-18 09:22:51

JavaScriptDart 開(kāi)發(fā)

2012-02-01 08:59:01

Dart

2011-09-16 10:55:06

2011-11-28 09:05:01

JavaScriptDart微軟

2019-08-30 08:54:05

TypeScriptJavaScript語(yǔ)言

2018-01-10 15:03:27

前端TypeScriptJavaScript

2011-09-13 10:13:45

JavaScript

2011-10-12 06:09:32

Dart

2021-12-03 23:28:11

JavaScript開(kāi)發(fā)代碼

2017-06-30 12:53:50

Javascript框架Vue vs Reac

2013-09-09 10:35:34

JavaScriptDart谷歌

2011-07-11 15:51:50

cookie

2011-07-21 10:07:58

JavaScript

2012-12-21 15:11:19

JavaScript

2016-10-13 19:11:27

JavaScript函數(shù)Web

2015-12-24 09:48:40

JavaScriptthis指針深

2011-08-10 17:04:43

JavaScript

2021-02-17 11:25:33

前端JavaScriptthis

2023-11-08 08:40:35

JavaScriptS 模塊

2011-07-20 10:27:29

JavaScript
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)