小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

還原JavaScript的真實(shí)歷史

 quasiceo 2016-07-15

還原JavaScript的真實(shí)歷史

作者: aimingoo  發(fā)布時(shí)間: 2012-06-08 17:13  閱讀: 4296 次  推薦: 1   原文鏈接   [收藏]  

  本文發(fā)布于2007-12-13

  問(wèn)題

  JavaScript真的繼承自Cmm嗎?

  JavaScript與Java有多少關(guān)系?

  JavaScirpt最初的設(shè)計(jì)是怎樣的?

  在許多資料,JavaScript的語(yǔ)源被追溯到一種名為Cmm的語(yǔ)言。同樣是在這一溯源的過(guò)程中,人們發(fā)現(xiàn)“其實(shí)”JavaScript不是第一種網(wǎng)頁(yè)中的腳本語(yǔ)言?,F(xiàn)在一些所謂“公認(rèn)”的情況是這樣的:

  大概在1992年,一家稱(chēng)作Nombas的公司開(kāi)始開(kāi)發(fā)一種叫做C減減(C-minus-minus,簡(jiǎn)稱(chēng)Cmm)的嵌入式腳本語(yǔ)言。這個(gè)腳本語(yǔ)言捆綁在一個(gè)叫做CEnvi的共享軟件產(chǎn)品中,當(dāng)Netscape Navigator嶄露頭角時(shí),Nombas開(kāi)發(fā)了一個(gè)可以嵌入網(wǎng)頁(yè)中的CEnvi的版本。這些早期的試驗(yàn)稱(chēng)為Espresso Page(濃咖啡般的頁(yè)面),它們代表了第一個(gè)在萬(wàn)維網(wǎng)上使用的客戶(hù)端腳本語(yǔ)言。而Nombas絲毫沒(méi)有料到它的理念將會(huì)成為因特網(wǎng)的一塊重要基石。

  然而,這是真實(shí)的情況嗎?運(yùn)行在Netscape中的第一個(gè)“客戶(hù)端腳本語(yǔ)言”真的是Cmm的濃咖啡?

  又或者真的象Wiki中記述的那樣,Brendan Eich在JavaScript引用了Cmm語(yǔ)言特性?

  不是的。盡管上述的資料看起來(lái)出自權(quán)威:《Javascript高級(jí)程序設(shè)計(jì)》(Professional JavaScript for Web Developers),但他的確錯(cuò)了。

  JavaScript與Cmm在語(yǔ)言特性上無(wú)關(guān)

  為了弄明白JavaScript與Cmm的關(guān)系,我大概用了三天的時(shí)間,從網(wǎng)上收集了多個(gè)Cmm的版本。這些版本既包括早期的Cmm(1993年),也包括在JavaScript初創(chuàng)時(shí)的Cmm(1995年),還包括在后來(lái),Cmm更名為ScriptEase的第一個(gè)版本(3.0, 1997年),作為參考,我還考察了它在服務(wù)器端的版本。

  遺憾的是,在1996年之前,在Cmm的2.x的最后一個(gè)版本之前,Cmm都并不是一個(gè)面向?qū)ο螅ɑ蚧趯?duì)象)的語(yǔ)言,Cmm正如它自己的名字所說(shuō)的一樣:是一個(gè)精減版的C,而不是C++或以C++為基礎(chǔ)的變種。所以Cmm中有“結(jié)構(gòu)”,也有#include等,整個(gè)的體系是參考C語(yǔ)言的。

  由于JavaScript在基本的語(yǔ)法特性(例如大括號(hào)、語(yǔ)句關(guān)鍵字等)上參考了C,在對(duì)象系統(tǒng)上(例如“.”作為成員存?。┥蠀⒖剂薐ava,因此在一定程度上Cmm與JavaScript存在相似性——主要是與共同借鑒自C的部分。但是除了這些之外,JavaScript與Cmm在語(yǔ)言特性上完全無(wú)關(guān)。

  JavaScript最初的基本設(shè)計(jì)是怎樣的?

  我需要補(bǔ)充一下JavaScript初始設(shè)計(jì)目標(biāo)。Brendan Eich在1995年4月前后被Netscape公司雇傭,目標(biāo)是完成一套語(yǔ)言系統(tǒng)。最初的設(shè)計(jì)里,該語(yǔ)言系統(tǒng)是為Netscape的LiveWire戰(zhàn)略服務(wù)的。該戰(zhàn)略彰顯了Netscape當(dāng)年的勃勃野心,它是Netscape公司的一個(gè)通用的Web開(kāi)發(fā)環(huán)境,包括Netscape Enterprise、FastTrack Server等。LiveWire架構(gòu)也成為所有Web服務(wù)器提供SP(Server Page)技術(shù)的藍(lán)本。例如在IIS中的ASP,以及更早期的IDC(Internet Database Connect)。

  這種技術(shù)在服務(wù)器端通過(guò)內(nèi)嵌于網(wǎng)頁(yè)的LiveScript代碼,使用名為database、DbPool、Cursor等的一組對(duì)象來(lái)存取LiveWire Database。作為整套的解決方案,Netscape在客戶(hù)端網(wǎng)頁(yè)上也提供LiveScript腳本語(yǔ)言的支持,除了訪問(wèn)Array、String等這些內(nèi)置對(duì)象之外,也可以訪問(wèn)window等瀏覽器對(duì)象。

  不過(guò)并不清楚的是:LiveScript最初的設(shè)計(jì)是先考慮服務(wù)器端應(yīng)用,還是先考慮網(wǎng)頁(yè)中應(yīng)用。但這些應(yīng)用環(huán)境的決策上的變化,時(shí)間僅僅限制在1995年4月至1995年10月之前,因?yàn)楫?dāng)月發(fā)布的netscape 2. 0 beta1已經(jīng)包含了腳本支持。

  在Netscape 2.0 beta1中并不支持<script>標(biāo)簽,而只是在form表單元素中支持了onclick這類(lèi)的事件。這時(shí)的腳本代碼是用在HTML標(biāo)簽屬性上的,也就是類(lèi)似于:<input type="button">

  很快,三周之后Netscape就發(fā)布了beta2。這個(gè)版本正式地支持了<script>標(biāo)簽,并可以解析該標(biāo)簽中的代碼、標(biāo)識(shí)符,開(kāi)始具備調(diào)用函數(shù)、表達(dá)式運(yùn)算等能力。這個(gè)版本已經(jīng)具備了JavaScript 1.0的基本性質(zhì)。

  ——什么?能調(diào)用函數(shù)、表達(dá)式運(yùn)算就是JavaScript 1.0的基本性質(zhì)了?

  是的,差不多了。相比起來(lái),JavaScript 1.0只是在這樣的基礎(chǔ)上加上了一套對(duì)象系統(tǒng)而已。在隨后發(fā)布的beta 3中,函數(shù)可以作為構(gòu)造器使用,可以創(chuàng)建出用戶(hù)自己的對(duì)象來(lái)了。再后來(lái)window等全局對(duì)象被加了進(jìn)來(lái),再把“當(dāng)前網(wǎng)頁(yè)”中的表單元素等影射成可編程對(duì)象,JavaScript 1.0就完成了。

  僅僅如此而已。在JavaScript 1.0的時(shí)代,既沒(méi)有“原型繼承”,也沒(méi)有“函數(shù)式編程”——甚至連匿名函數(shù)也沒(méi)有支持,所以下面的代碼就足夠讓瀏覽器掛掉了:

var func = function() {
} 

  JavaScript 1.0的設(shè)計(jì)目標(biāo),就是“讓網(wǎng)頁(yè)動(dòng)起來(lái)”,最初的要求包括三個(gè)方面:

  • 讓網(wǎng)頁(yè)中的元素可以被編程,所以象forms、links這些對(duì)象,在網(wǎng)頁(yè)裝載結(jié)束后就初始化為全局成員了——那時(shí)候還沒(méi)有所謂的DOM或DHTML呢。
  • 讓JavaScript跟Java接近一些,因?yàn)镹etscape與Sun有戰(zhàn)略合作。而且,Sun那時(shí)相當(dāng)火爆。
  • 讓JavaScript可以在服務(wù)器與客戶(hù)端兩邊都使用,因此它必須是嵌入式的。

  不過(guò)JavaScript的另一項(xiàng)特性,則自它的第一個(gè)版本就存在。該特性就是動(dòng)態(tài)執(zhí)行,也就是eval()。

  這是與它的“腳本”的性質(zhì)有關(guān)的。在早期的“腳本”也被稱(chēng)為“批處理程序”,就如同DOS批處理或Unix shell一樣,腳本應(yīng)當(dāng)具有裝入字符串文本并“動(dòng)態(tài)執(zhí)行”的能力。

  所以,總結(jié)起來(lái),JavaScript 1.0其實(shí)是一個(gè)可以創(chuàng)建和操作對(duì)象的普通過(guò)程式語(yǔ)言。這個(gè)時(shí)候的JS代碼既不能檢測(cè)“對(duì)象-構(gòu)造器”之間的繼承性,也沒(méi)有原型繼承這樣的東東來(lái)構(gòu)建對(duì)象系統(tǒng)。函數(shù)除了在new MyObject()時(shí)協(xié)助傳入一個(gè)this引用之外,就跟普通的函數(shù)完全一樣。而且,最為有趣的是,Brendan Eich這時(shí)還沒(méi)有形成JavaScript中最重要的“類(lèi)型系統(tǒng)”概念,此時(shí)undefined還只是系統(tǒng)全局中的一個(gè)特殊的值,而不是某種類(lèi)型。typeof關(guān)鍵字也還根本不存在。換言之,Eich現(xiàn)在要做的只是一個(gè)“可編程的、可以用對(duì)象的”腳本語(yǔ)言,至于它是否在類(lèi)型系統(tǒng)上完備或者優(yōu)美,他還顧不過(guò)來(lái)呢。

  JavaScript最重要的“構(gòu)造器-原型繼承”概念是在JavaScript 1.1版本中提出的,類(lèi)型系統(tǒng)和重要的函數(shù)式語(yǔ)言特性要等到v1.2之后才被加入。而現(xiàn)在,在1996年1月底,JavaScript 1.0隨Netscape 2. 0正式版發(fā)布了。

  JavaScript的名字

  為了弄清楚JavaScript名稱(chēng)和語(yǔ)言特性的演變,我下載了Netscape 2.0 beta1~6,以及2.0~2.02所有版本的發(fā)布文件,并逐一安裝測(cè)試。下面解釋JavaScript名字的演變過(guò)程。

  JavaScript最早是被稱(chēng)為Mocha(魔卡)的,這是這個(gè)項(xiàng)目的代碼名。這個(gè)名字一直用到Netscape 2. 0 beta 2發(fā)布之前(95.11.04)——包括在beta 1中彈出的錯(cuò)誤框上,還可以看到Mocha的名字。

  不過(guò),早在此前的9月18號(hào),Netscape就已經(jīng)發(fā)布消息將在LiveWire中啟用一種服務(wù)器端腳本(未提及名稱(chēng))。又因?yàn)槲覀兦懊嫣岬降摹扒昂蠖送ㄓ媚_本”的設(shè)計(jì),該語(yǔ)言在beta 2發(fā)布時(shí)就使用了內(nèi)部名稱(chēng)LiveScript。

  但同樣混亂的事情是,事實(shí)上這時(shí)Netscape已經(jīng)決定將該語(yǔ)言命名為“JavaScript”。因此在beta 2的發(fā)布備忘中該語(yǔ)言稱(chēng)為JavaScript,而界面上卻從Mocha改為了LiveScript。這一局面一直持續(xù)到12月4日,Netscape與Sun共同發(fā)布聲明,正式啟用了JavaScript這個(gè)名字。隨后beta 4發(fā)布(95.12.20),界面和文檔上就統(tǒng)一了。

  所以事實(shí)上“LiveScript”這個(gè)名字可以考證的生命周期,也就只有一個(gè)月的時(shí)間(在95.11.04- 12.04)。但Mocha畢竟只是項(xiàng)目代碼名,而非產(chǎn)品名,所以后來(lái)人們追溯JavaScript的歷史,大多只提到LiveScript為止。

  第一段網(wǎng)頁(yè)內(nèi)腳本真的是濃咖啡(Espresso Page)嗎?

  如上面所述的,Netscape 2.0的beta 1中就正式加入了腳本支持,最遲在beta 2之前。對(duì)象的構(gòu)建方式、<script>標(biāo)簽的使用,以及在HTML標(biāo)簽上使用onclick這類(lèi)事件句柄……這些設(shè)計(jì)就已經(jīng)被明確了。這些是一直延續(xù)到現(xiàn)在的,我們最主要的使用網(wǎng)頁(yè)的方式。那么,這個(gè)時(shí)間點(diǎn)可以不容置疑的被確定在95.11.04之前(beta 2發(fā)布之前)。我們現(xiàn)在再回過(guò)頭來(lái)看那份講述Espresso Page的消息。這其實(shí)是由Brent Noorda先生(Nombas公司總裁)于1995.11.27日發(fā)布在新聞組上(comp.infosystems.www.authoring.html)上的一則消息,原文是“這周末我們將放出一些Espresso Pages在我們的網(wǎng)站上(This weekend we put up the Espresso Pages, at...)”,那么,也就是Espresso Pages其實(shí)出現(xiàn)在11.30號(hào)之后。這已經(jīng)遠(yuǎn)遠(yuǎn)晚于上面的時(shí)間了。

  也就是說(shuō),真正第一種在Netscape中使用的客戶(hù)端腳本,仍然是由Brendan Eich編寫(xiě)的JavaScript。這種腳本使用“<script>”標(biāo)簽(在服務(wù)器端使用<server>標(biāo)簽),支持五種基本類(lèi)型(除undefined之外),支持自定義對(duì)象和構(gòu)造器等基本特性,能夠操作網(wǎng)頁(yè)中內(nèi)嵌的links、forms等對(duì)象。然而需要繼承說(shuō)明的是,由于Nombas早早地就實(shí)現(xiàn)了Cmm語(yǔ)言以及其開(kāi)發(fā)環(huán)境,所以他不需要花什么力氣就可以將它們移植到網(wǎng)頁(yè)中去并展示其非常豐富的能力。所以在Brent Noorda先生在上面的消息中說(shuō),(周末放出的)這個(gè)Demo將演示:

  - a bouncy-button game,

  - real-time verification of user input into forms,

  - an animated stick-figure,

  - and a way cool flashback into the psychadellic sixties.

  的確,這些演示的功能大概是當(dāng)時(shí)的JavaScript(LiveScript)不能實(shí)現(xiàn)的。但相同的功能所需求的特性以及其基本實(shí)現(xiàn),其實(shí)正是Netscape當(dāng)時(shí)已經(jīng)發(fā)布的版本所包含的。所以這里根本就不存在Netscape抄襲Nombas的問(wèn)題。然而換一個(gè)角度來(lái)想,Nombas可能正是看到Netscape發(fā)布版本中的種種特性,其實(shí)能夠用一個(gè)嵌入到瀏覽器中的CEnvi來(lái)完成,因此發(fā)布了這樣的一個(gè)示范版本。

  從時(shí)間先后來(lái)分析,我們可以確信的是:

  - Netscape在網(wǎng)頁(yè)中嵌入腳本是早在Espresso Pages出現(xiàn)之前的一個(gè)構(gòu)想;

  - JavaScript(LiveScript)是真正的第一個(gè)在萬(wàn)維網(wǎng)上使用的客戶(hù)端腳本語(yǔ)言。

  無(wú)論如何,Espresso Pages很好地展示了Netscape當(dāng)時(shí)正在圖謀的構(gòu)想——不管是Nombas與Netscape想到了一起,還是Nombas幫助Netscape展開(kāi)了(由Netscape設(shè)計(jì)的)藍(lán)圖。在當(dāng)時(shí)(JavaScript 1.0發(fā)布之前),CEnvi中的Cmm相當(dāng)完善,開(kāi)發(fā)環(huán)境也很成熟。所以可以承認(rèn)的是,Nombas的Espresso Pages的確更好地展示了Web的末來(lái)。但是,成為“因特網(wǎng)的一塊重要基石”的構(gòu)想——這里指頁(yè)面內(nèi)腳本,絕不是Nombas先創(chuàng)的理念。因?yàn)镹etscape beta1~3中已經(jīng)把這些理念都展示了出來(lái)。

  其它

  有一種Java的編譯器也名為Mocha,但與本文中沒(méi)有什么關(guān)系。Cmm也稱(chēng)為C--,但另外還有一種名為Sphinx C--的語(yǔ)言,其設(shè)計(jì)目標(biāo)與Cmm類(lèi)似,但不是同一種語(yǔ)言。在Java熱火的時(shí)代里,出現(xiàn)了很多以濃咖啡(Espresso)命名的產(chǎn)品,但都不是這里的Espresso Pages。Espresso Pages只是一些Demo頁(yè)面,需要下載并專(zhuān)用安裝一個(gè)CEnvi的特定版本才能查看。但這個(gè)特定版本在互聯(lián)網(wǎng)上已經(jīng)絕跡了。

  JavaScript并沒(méi)有從Java中尋找太多靈感,Brendan Eich自己說(shuō)“my influences were awk, C, HyperTalk, and Self”,這其中既不包括 Java,也沒(méi)有Cmm的影子。不過(guò)Brendan Eich也說(shuō)另外的影響是“combined with management orders to "make it look like Java."這強(qiáng)調(diào)的是一種形似,而不是語(yǔ)源上的承繼關(guān)系。

  在1996年2月,CEnvi發(fā)布了最后一個(gè)2.x版本。這個(gè)版本是對(duì)以前版本的一些修補(bǔ)。但接下來(lái),過(guò)了約一年半之后,CEnvi才發(fā)布下一個(gè)版本(v3.0)。從這個(gè)版本開(kāi)始更名為ScriptEase,放棄了舊有的Cmm規(guī)格,而采用了JavaScript規(guī)范下的語(yǔ)法。并且自這個(gè)版本開(kāi)始,ScriptEase發(fā)布Desktop和Web Server等多種不同的版本——此前CEnvi只有針對(duì)不同的操作系統(tǒng)的版本。所以事實(shí)上,非但不是Brendan Eich受到了Nombas的影響,反而是Nombas受JavaScript而放棄了整個(gè)原來(lái)的語(yǔ)言設(shè)計(jì),而且在產(chǎn)品策略上,還抄襲了Netscape的LiveWire戰(zhàn)略。

  Nombas后來(lái)被收購(gòu)掉,ScriptEase等系列產(chǎn)品不再維護(hù)。Nombas.com網(wǎng)站仍然可以訪問(wèn),但只有一個(gè)告別頁(yè)面,不過(guò)相應(yīng)的,Netscape也好不到哪里去。

  Mozilla是Netscape一個(gè)早期的Java開(kāi)發(fā)團(tuán)隊(duì)的內(nèi)部代碼名。在Netscape 2.0 beta中包含的Java代碼包中,就已經(jīng)可以看到這一標(biāo)志了。不過(guò)該團(tuán)隊(duì)真正獨(dú)立出來(lái)成為開(kāi)源組織,并最終接手Netscape未竟事業(yè),則是晚至1998年1月以后的事了。

  Mozilla與Mozilla Firefox使用兩套版本編號(hào)。所以“Mozilla 2”是2006.10月開(kāi)始發(fā)起的,而當(dāng)時(shí)Mozilla Firefox 2.0b1已經(jīng)發(fā)布了——它基于“Mozilla 1”的維護(hù)版本。同樣有趣的是,Mozilla Firefox 3.x則在基于“Mozilla 2”這個(gè)項(xiàng)目開(kāi)發(fā),大概,在2008年中期會(huì)發(fā)布正式版本(本文寫(xiě)于2007年)。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多