C#首席設(shè)計(jì)師Anders Hejlsberg專訪(2)轉(zhuǎn)
2024-07-21 02:22:22
供稿:網(wǎng)友
osborn:
讓我們進(jìn)入語法細(xì)節(jié)。我在想,c#是否包括對(duì)正則表達(dá)式的內(nèi)建支持。我沒有在語言參考里看到它,或許它可能在別的什么地方吧。
hejlsberg:
首先,在基類庫里有一個(gè)正則表達(dá)式類。我們并沒有在語言里加入對(duì)正則表達(dá)式的任何直接支持,但是,實(shí)際上我們有些非常類似的特性。并不值得對(duì)它們做重大的處理。但是,比如當(dāng)你需要指定一個(gè)時(shí)候—我們給你這個(gè)能力去寫一個(gè)逐字字符串而不需要你每次寫兩個(gè)后斜杠。當(dāng)你寫正則表達(dá)式時(shí)并且當(dāng)你的正則表達(dá)式里的引號(hào)還套引號(hào)時(shí),它實(shí)際上有極大的幫助。雖然這個(gè)幫助不足掛齒,但顯然其核心在.net框架里,而這個(gè)框架可以被任何編程語言共享。
osborn:
c#和java名字空間看起來不同。它們是否概念相同而實(shí)現(xiàn)上不同?
hejlsberg:
概念上是的,但是在實(shí)現(xiàn)上非常不同。在java里,包名也是物理的東西,它指定了你的源代碼文件的目錄結(jié)構(gòu)。在c#中,物理包和邏輯名稱完全獨(dú)立,無論你如何稱呼你的名字空間,它都和你的實(shí)際代碼的物理包不相關(guān)。這就給你更多的彈性—把物理上分布的單元包裝在一起,并且不強(qiáng)迫你建很多的目錄。在語言自身,有很多很明顯的區(qū)別。在java里,包也是你的物理結(jié)構(gòu),因此,java源文件必須在正確的路徑里,并且只能包含一個(gè)公開類型或者一個(gè)公開的類。因?yàn)閏#沒有那種物理和邏輯上的綁定,所以你可以任意命名你的源文件。每一個(gè)源文件都可以被多個(gè)名字空間使用并且可以帶有多個(gè)公開類。進(jìn)一步講,你可以把所有的源碼寫在一個(gè)大文件里,或你可以把它們分散到交叉的小文件中去。概念上講,c#編譯時(shí)發(fā)生了什么—你給編譯器提供了所有構(gòu)成你的工程的源文件,然后它只管前進(jìn)并指出該干什么。
osborn:
我有一個(gè)關(guān)于泛型編程的問題:你認(rèn)為它是個(gè)重要的概念嗎?它應(yīng)該成為面向?qū)ο笳Z言的一部分嗎?如果是的話,你們把泛型編程加為c#的一部分的計(jì)劃如何?
goodhew:
好的。在第一個(gè)版本里包括泛型編程的愿望受到了限制。并不象每一個(gè)人以為的那樣,微軟并沒有無限制的資源。在這第一個(gè)版本里,我們不得不做一些困難的決定。
osborn:
有多少人參與開發(fā)c#?
hejlsberg:
語言設(shè)計(jì)組由4個(gè)人構(gòu)成,編譯器組由另外五個(gè)開發(fā)人員構(gòu)成。
petrusha:
框架呢?
hejlsberg:
那就多了,整個(gè)公司都被卷入了。
goodhew:
就整個(gè)visual studio和.net平臺(tái)組而言,我們的部門大概有千人左右。包括程序管理人員、開發(fā)人員、測(cè)試人員,包括所有創(chuàng)建例程、框架、運(yùn)行時(shí)、asp編程模型的人員以及其它所有的人比如我,管理層的。
hejlsberg:
就你剛才所說的泛型方面,我明確地認(rèn)為它是個(gè)非常有用的概念,并且你當(dāng)然可以列舉出發(fā)生在學(xué)術(shù)界和業(yè)界所有的泛型研究。模板是該問題的一個(gè)解決方法。在我們內(nèi)部討論中,我們決定要在新平臺(tái)里做這個(gè)事情。但我們真正喜歡做的是讓底層的運(yùn)行時(shí)理解泛型。這和如何創(chuàng)建泛型原型是不同的。用java的“擦除”概念系統(tǒng)里沒有真正的泛型知識(shí)。如果公共語言運(yùn)行時(shí)理解泛型的概念,多種語言就可以共享這個(gè)功能。你可以在一個(gè)地方用c#寫一個(gè)泛型類,別的人用別的語言也可以使用。
使泛型成為運(yùn)行時(shí)的一部分還可以使你更有效率的做某些事情。泛型實(shí)例化的最理想的時(shí)間是在運(yùn)行時(shí)。如果用c++,模板的實(shí)例化發(fā)生在編譯時(shí),你有兩個(gè)選擇:聽任你的代碼膨脹或試圖在鏈接時(shí)去除掉一些膨脹代碼。但是,如果你有多個(gè)應(yīng)用,你可能會(huì)忘記這一點(diǎn),你將只能得到膨脹的代碼。
如果把泛型的知識(shí)納入公共語言運(yùn)行時(shí),則運(yùn)行時(shí)可以理解—當(dāng)一個(gè)應(yīng)用或組件請(qǐng)求一個(gè)“foo”列表時(shí),它首先會(huì)問:“我已經(jīng)有了一個(gè)實(shí)例化的“foo”列表了嗎?”如果是,就用那一個(gè)。實(shí)際上,如果foo是一個(gè)引用類型,并且我們?cè)O(shè)計(jì)正確的話,我們可以讓所有引用類型共享一個(gè)實(shí)例。對(duì)于值類型,比如整型和浮點(diǎn)型,我們可以為每一個(gè)值類型創(chuàng)建一個(gè)實(shí)例,但這應(yīng)該在應(yīng)用請(qǐng)求時(shí)才做。為了把泛型加入運(yùn)行時(shí),我們已經(jīng)做了大量的設(shè)計(jì)工作和必要的基礎(chǔ)性工作。
你先前提到的關(guān)于il的東西是有意思的,因?yàn)榧尤敕盒偷臎Q定影響了il的設(shè)計(jì)。如果il指令嵌入類型信息,如果,例如,一個(gè)“加”指令不再是個(gè)“加”了,而是一個(gè)整數(shù)“加”或是浮點(diǎn)數(shù)“加”或是一個(gè)雙精度數(shù)“加”,你就把類型信息硬加入到了指令流里,并且在這一點(diǎn)上來說il不是泛型的。我們的il格式實(shí)際上是真正的類型中立的。并且,為了保持類型中立,我們可以遲些時(shí)候加入泛型而不會(huì)給我們帶來麻煩,至少不會(huì)太麻煩。這也是我們的il和java的字節(jié)碼看起來不一樣的原因之一。我們il類型中立。“加”指令可以加棧頂?shù)娜魏蝺蓚€(gè)東西。在泛型世界,當(dāng)它被初始化時(shí),它可以被翻譯成不同的代碼。
osborn:
所有.net語言都可獲得泛型能力嗎?
hejlsberg:
是的。微軟劍橋研究院已經(jīng)創(chuàng)建了一個(gè)支持泛型能力的公共語言運(yùn)行時(shí)和c#編譯器的版本,我們正在研究如何盡快使其前進(jìn)。第一個(gè)版本是不可能加入泛型了,我們知道的就這么多。但是我們正在工作以確保我們?cè)诘谝粋€(gè)版本里做了正確的事情從而使泛型可以適用于整個(gè)藍(lán)圖。
osborn:
c#和.net框架以及visual studio的下一個(gè)版本計(jì)劃發(fā)行日期是?
goodhew:
唔,我們?yōu)閬磉@兒參加pdc的6500名人員帶來了技術(shù)預(yù)覽版。我們希望2000年秋季的某個(gè)時(shí)間發(fā)布beta版,然后在準(zhǔn)備好以后,我們發(fā)布發(fā)行版。我們所做的一個(gè)真正令人激動(dòng)的事情是看看windows2000發(fā)行版發(fā)布進(jìn)行的如何,以讓關(guān)鍵客戶參與到合作開發(fā)和合作部署的進(jìn)程中來。關(guān)于.net框架和visual studio.net,我們將再次和客戶一起工作以決定最終產(chǎn)品的發(fā)行日期。我們打算讓他們告訴我們什么時(shí)候產(chǎn)品該就緒了。并且,因?yàn)橛姓嬲目蛻魠⑴c到這個(gè)進(jìn)程中來,我們將獲得更好的產(chǎn)品質(zhì)量。這種做法的不利的一面是使產(chǎn)品開發(fā)和發(fā)布的進(jìn)程有點(diǎn)不確定。但這是根本性的改變。我們?cè)趯ふ乙粋€(gè)打破質(zhì)量障礙的產(chǎn)品發(fā)行方式,而不僅僅是挑一個(gè)武斷的日期說我們要發(fā)貨了。
osborn:
因此,不是一個(gè)代碼完成的日期,我們?cè)趯ふ乙粋€(gè)“準(zhǔn)備好出發(fā)”的日期?
goodhew:
是的,沒錯(cuò)。我認(rèn)為開發(fā)者將會(huì)發(fā)現(xiàn)visual studio.net發(fā)行版是微軟歷史里最高質(zhì)量的發(fā)行版本之一。
osborn:
你們已經(jīng)把c#提交給ecma[譯注:歐洲計(jì)算機(jī)制造商協(xié)會(huì)]。標(biāo)準(zhǔn)化真的是一個(gè)嚴(yán)肅的目標(biāo)嗎?你希望在其它平臺(tái)上也可使用c#嗎?
hejlsberg:
的確如此!把c#作為一個(gè)可能的標(biāo)準(zhǔn)提供給業(yè)界當(dāng)然是我們的目標(biāo),這也是我們把它提交給ecma的原因之一。在引導(dǎo)這個(gè)有著公共語言基礎(chǔ)設(shè)施的公共設(shè)計(jì)的語言的進(jìn)程中,我們當(dāng)然希望得到ecma的支持。關(guān)于公共基礎(chǔ)設(shè)施,我的意思是指這個(gè)規(guī)范所規(guī)定的一個(gè)核心類庫集,如果其它公司使用其它平臺(tái)實(shí)現(xiàn)它,他們有理由期望發(fā)現(xiàn)可以在他們的程序里利用這些類。
goodhew:
我想指出的是我們正在和ecma做真正的開放標(biāo)準(zhǔn)。當(dāng)ecma為c#和公共語言基礎(chǔ)設(shè)施達(dá)成標(biāo)準(zhǔn)后,在ecma的版權(quán)和授權(quán)政策下,真正的開放將可實(shí)現(xiàn)。任何客戶、任何人都可以被授權(quán)ecma c#標(biāo)準(zhǔn),子集之,超集之,并且不必付版稅。他們可以在任何平臺(tái)和任何設(shè)備實(shí)現(xiàn)之。我們完全希望人們那么做。這和我們的競(jìng)爭者根本不同。他們徘徊在標(biāo)準(zhǔn)之外,尋找某某人去為他們私有的語言貼上印花。
john:
我在早餐和午餐時(shí)聽說:“如果微軟沒有把com搞到基礎(chǔ)設(shè)施中去,平臺(tái)會(huì)多么具有可移植性?”
hejlsberg:
完全可能。com并非c#和公共語言基礎(chǔ)設(shè)施標(biāo)準(zhǔn)化之必須。根本不是。c#有一個(gè)完備豐富的類模型,而com則是從另外一個(gè)視角看待應(yīng)用的互操作性。但是,c#和公共運(yùn)行時(shí)的核心中從未說過必須要有com、 guid、 hresult、 addref 或 release等等。一個(gè)都沒有。.net 公共語言運(yùn)行時(shí)徹底摒棄了com,但它還是給了你巨大的com互操作能力。鑒于先前所述,我仍然認(rèn)為它將非常重要,但絕非不可或缺。
goodhew:
我認(rèn)為這些評(píng)論起因于我們公開的最初版本的語言規(guī)范。微軟在某次會(huì)議上把它寫進(jìn)了規(guī)范。在那次會(huì)議上,我們認(rèn)為按照微軟平臺(tái)來說這是非常重要的。結(jié)果,我們?cè)谝?guī)范里多次引用com和dll這樣?xùn)|西。dll是如何在已給定平臺(tái)上激活本地代碼的更多的一般性問題中的一個(gè)特例。對(duì)于納入標(biāo)準(zhǔn)化組織以及和象ibm的人(我們和他們一起制訂soap規(guī)范)一起工作的一個(gè)好處是我們可以不做任何這樣的提及,以防止在規(guī)范的未來版本里,把我們自己綁死或鎖定在象com框架這樣的東西上。
就象anders說的那樣,com互操作能力和com支持對(duì)我們和已有的微軟客戶來說是極其重要的。我認(rèn)為為了在.net支持com我們做了大量的工作。但是,業(yè)界的人們已經(jīng)閱讀了大量的我們對(duì)com和dll字眼引用的東西,他們由此推論.net僅僅是為windows平臺(tái)設(shè)計(jì)的,這是完全錯(cuò)誤的。
hejlsberg:
并且,我認(rèn)為就象com的互操作能力對(duì)于微軟和在微軟平臺(tái)上構(gòu)建解決方案的客戶很重要一樣,c#和公共語言基礎(chǔ)設(shè)施的標(biāo)準(zhǔn)化將允許在任何其它平臺(tái)上選擇實(shí)現(xiàn)這個(gè)語言以加入意義重大的互操作能力。
osborn:
所以你們將不會(huì)堅(jiān)持應(yīng)該有個(gè)什么“純c#”和“純.net”的實(shí)現(xiàn)?
hejlsberg:
什么叫“純”?真正有多少“純”java應(yīng)用存在?我冒險(xiǎn)猜測(cè)一下,非常非常少。那就是我估計(jì)的數(shù)量。讓我們承認(rèn)這一點(diǎn),人們希望能利用他們已存在的代碼。不可能叫那些公司把什么東西都扔掉。
goodhew:
你和roger sessions交流過嗎?[編注:roger sessions是objectwatch公司的ceo,并且是《com+ and the battle for the middle tier》的作者] 。
osborn:
沒有。
goodhew:
roger談到了ejb規(guī)范的相關(guān)章節(jié),那兒講了賣方[vendor]許可擴(kuò)展。毫不奇怪,賣方擴(kuò)展包括諸如事務(wù)管理、安全、消息以及其它更多的方面,這在構(gòu)建企業(yè)級(jí)系統(tǒng)中是相當(dāng)重要的。在一篇文章[譯注:http://www.objectwatch.com/issue_24.htm]里,sessions粗略地列舉了11個(gè)領(lǐng)域的機(jī)能,這是可容許的賣方規(guī)范實(shí)現(xiàn)。因此,如果你選擇ibm websphere作為你的ejb實(shí)現(xiàn),你為你的ejb應(yīng)用寫的代碼將不可避免地被鎖定在websphere。java是100%純和100%可移植的概念是不正確的。在ibm的開發(fā)者工作站點(diǎn)上,有一個(gè)偉大的專訪[譯注:http://www-106.ibm.com/developerworks/features/gosling/index.html]。james gosling直接指出了這一點(diǎn)。他說,是的,整個(gè)“寫一次到處運(yùn)行”、“100%純的東西”真是個(gè)愚蠢的想法,更多的是屬于營銷上東西。他說,實(shí)際上,“我們并不認(rèn)為我們能夠交付這一切,基本上,我們辦不到”。這就是這個(gè)語言的發(fā)明者說的,不存在什么純粹性和可移植性。
osborn:
我們有沒有遺漏一些沒透露的c#的偉大的特性或創(chuàng)新,你愿意補(bǔ)充一下嗎?
hejlsberg:
關(guān)于.net框架,隱含地,也包括c#,我想提的一點(diǎn)是:它是構(gòu)建分布式應(yīng)用的手段。并非很久以前,我們創(chuàng)建兩階層的客戶/服務(wù)應(yīng)用,然后對(duì)象協(xié)議如corba、 iiop、 rmi、和dcom 接踵而至。這種類型的編程是ejb—(corba或rmi的底層實(shí)現(xiàn)[譯注:dcom除外])的基礎(chǔ)。我們已經(jīng)會(huì)構(gòu)建這種強(qiáng)連接式的分布式系統(tǒng),但它們不具備伸縮性。它們?cè)趙eb上不能夠伸縮因?yàn)樗鼈兪怯袪顟B(tài)的,它們?cè)诜?wù)端保持狀態(tài),你不能夠轉(zhuǎn)入另一臺(tái)機(jī)器,把它插入并讓相關(guān)東西復(fù)制自己。
當(dāng)初,當(dāng)我們坐下來著手設(shè)計(jì).net框架時(shí),我們回頭看了看web上究竟發(fā)生了什么。它正在變成松散連接、非常分布式的世界。我們努力理解它對(duì)潛在的編程模型的影響。因此,我們從根本上假定分布式的應(yīng)用是構(gòu)建在松散連接、無狀態(tài)風(fēng)格的。依此,我們做出的設(shè)計(jì)可提供巨大的伸縮性。你只管擴(kuò)展。你轉(zhuǎn)入更多的框架并且把它們插入。一旦做出了這個(gè)根本性的假設(shè),一切就隨之改變。它改變了怎樣設(shè)計(jì)你的根本服務(wù),怎樣設(shè)計(jì)你的消息,甚至是怎樣設(shè)計(jì)你的用戶界面。這是一個(gè)新的編程模型。我們已經(jīng)選擇了xml和soap作為使這個(gè)模型工作的方式。它們被深深地集成到.net。并且這種集成對(duì)于我們?cè)谠O(shè)計(jì).net框架時(shí)做出的每一個(gè)決策是如此核心,以至于它不是那種你只是進(jìn)來蜻蜓點(diǎn)水地逛一逛就可以的東西。
osborn:
你能指出一些對(duì)程序員來說明顯特別的地方嗎?
hejlsberg:
一個(gè)相當(dāng)好的例子是xml是如何被集成到c#中的。c#中有特性[譯注:即attribute,關(guān)于名詞譯法的說明,上文有描述]的概念,它允許你向類型和成員加入宣稱性信息。就象你可以說某個(gè)成員是公有的或私有的一樣,你可能還想說這個(gè)是事務(wù)的,或者這個(gè)假定是個(gè)web service,或這個(gè)假定被以xml方式的序列化支持。因此,我們加入特性以提供一般性機(jī)制,但是我們?cè)谒械膚eb service和xml基礎(chǔ)設(shè)施中都用到了它。我們還給你用特性修飾類和字段的能力。在你的類中,你可以說“當(dāng)這個(gè)類型變成xml時(shí),它應(yīng)該變成“this”標(biāo)簽名,并且屬于“this”xml名字空間。”你將有能力指定一個(gè)字段變成一個(gè)元素,而另外一個(gè)變成屬性[譯注:此處指xml中的屬性]。你還能夠控制xml的模式[譯注:即schema];在你的類聲明的地方控制它,這樣,所有附加的宣稱性信息就都可以獲得了。一旦以該方式正確地使用特性修飾你的c#代碼,系統(tǒng)就可以簡單把它轉(zhuǎn)化成xml中一個(gè)指定的類,在線上傳輸,當(dāng)它傳回時(shí),就可以在另一端重建該對(duì)象。這都是在一處定義完成的。它不象傳統(tǒng)的定義文件或多種信息和命名模式。它就在那兒。當(dāng)你在ide中創(chuàng)建它們時(shí),它就給了你完整的聲明。我們還可以提供高級(jí)工具,讓它幫你做這個(gè)事。
我知道我有點(diǎn)離題了,但是我們提供的這些基礎(chǔ)設(shè)施的確令人興奮。單單因?yàn)槲覀冇羞@些特性,你就可以請(qǐng)求xml序列化基礎(chǔ)設(shè)施或web service基礎(chǔ)設(shè)施把已給出的類翻譯成xml。當(dāng)你這么做了,我們實(shí)際上將為這個(gè)類配上xsd模式,并且我們將創(chuàng)建一個(gè)特別的解析器,它是從我們一般的xml解析器派生出來的(.net基類的一部分),并且重載方法并加入邏輯,因此它是專門為那個(gè)模式服務(wù)的。所以,我們已經(jīng)初始化好一個(gè)解析器,可以本地代碼的速度解析xml。如果它不正確,我們將給你一個(gè)體面的出錯(cuò)信息,它可以精確地告訴你是什么出了問題。我們可以在代碼緩存基礎(chǔ)設(shè)施中緩存它,它將坐等直到下一次一個(gè)具有同樣模式的類來臨并將發(fā)生作用,“嘭!”,我的意思是,難以置信,難以置信的生產(chǎn)能力!
osborn:
所以,在蓋子下的確有很多有趣的引擎。
hejlsberg:
是的,并且我認(rèn)為,當(dāng)在這個(gè)領(lǐng)域里達(dá)到這個(gè)思想時(shí),我們是領(lǐng)先的一代。
osborn:
精彩之至。謝謝,耽誤你時(shí)間了。
hejlsberg:
不客氣。