轉(zhuǎn)貼: MSDN 訪談錄之C#編程一 rainbow(翻譯)
2024-07-21 02:22:19
供稿:網(wǎng)友
標(biāo)題 msdn 訪談錄之c#編程一 rainbow(翻譯)關(guān)鍵字 c#,msdn出處 http://www.msdn.com
msdn 訪談錄(msdn show)
c#編程
c#是一種令人耳目一新且為之一振的編程語言,它設(shè)計(jì)給c++程序員帶來快速的開發(fā)能力,而又不犧牲c(diǎn)和 c++所特有的功能和控制。
在今天的這一期里,我們將要和anders hejlsberg交談,他是微軟一位資深的工程師,一直幫助設(shè)計(jì)、開發(fā)和實(shí)現(xiàn)該語言,并發(fā)揮其在未來.net平臺中的作用。我們還要和jeffrey richter(著名的編程作家和咨詢專家)交談,他從事c#的工作已經(jīng)一年有余了。
介紹
robert hess,微軟產(chǎn)品經(jīng)理和“show”節(jié)目主持人。
robert hess: 讓我們繼續(xù)關(guān)注理解.net體系(architecture)。我們今天將關(guān)注新的c#(念“c sharp”而不是“c pound”!)編程語言。首先看看msdn 消息更新欄目。
msdn 消息更新
由技術(shù)編輯erica wiechers主持
(略去與c#無關(guān)的談話)
技術(shù)閑聊(techno babble )
robert hess和資深工程師anders hejlsberg會面,要討論…???
robert hess: 歡迎回到這個欄目。好了,就象任何一個要在其上面開發(fā)軟件的平臺,為了使這些應(yīng)用軟件能真正地運(yùn)行起來,所需要的一個主要東西就是一種編程語言。目前,.net已經(jīng)擁有了一種專門為此開發(fā)的專用語言,我們稱之為c#。今天和我們在一起的是anders hejlsberg,他是微軟一位資深的工程師,在c#語言以及.net平臺領(lǐng)域都扮演了一個關(guān)鍵的角色,在以前的“show”節(jié)目里大家都見過他。所以我邀請他到這里來,和大家一起談?wù)揷#,談?wù)勊鞘裁?,有了它程序員就可以從中得到什么好處,以及它是怎樣真正地影響到應(yīng)用程序的開發(fā)的。
那么,您究竟從事c#哪方面的研究工作,是從什么時(shí)候開始的?
anders hejlsberg: 在最近大概兩年半的時(shí)間里,我們一直在從事c#的研究工作。設(shè)計(jì)小組由4人組成,而且在這段時(shí)間里,我把主要的精力都放在了這上面。要知道,對于一種新的編程語言,我們有許多事情要去做。我想首先也許就是為程序員提供方便,使程序員開發(fā)出更多的產(chǎn)品就是最終目標(biāo)。如今,雖然在產(chǎn)品的收益方面僅僅只是初具規(guī)模,但可以說,我們的目標(biāo),在某種意義上,不但要使c#具有c++強(qiáng)大的功能和出色的表現(xiàn),而且還要使其具備簡單易用以及rad(rapid application development,快速的應(yīng)用程序開發(fā))語言的生產(chǎn)率。
我們已經(jīng)做了一些工作,例如,涉及到程序員如何利用更好的工具編寫組件的范疇。如果你看看我們是怎樣寫應(yīng)用程序的,應(yīng)該是曾經(jīng)怎樣寫應(yīng)用程序的,如果回顧過去,也就是說5年或10年以前,應(yīng)用程序就是這樣鐵板一塊地被創(chuàng)建的,它和操作系統(tǒng)的唯一交互,你知道,就是進(jìn)行文件的i/o操作,而且無論如何操作系統(tǒng)都會載入應(yīng)用程序,接著用戶就與其交互,最后退出??纯船F(xiàn)在我們是如何創(chuàng)建internet應(yīng)用程序的,相比起來簡直是天壤之別。應(yīng)用程序不再是鐵板一塊了,而是由一系列更小的組件構(gòu)成,它們分別棲息于不同的環(huán)境。例如,你可能擁有類似存儲過程(stored procedures)和sql server那樣的組件,也可能擁有棲息于瀏覽器中的控件,或者是存在于asp網(wǎng)頁中的代碼。商業(yè)對象生存于中間層,調(diào)用整個集合的組件就等于調(diào)用該應(yīng)用程序。于是為了使……
robert hess: 而當(dāng)時(shí)您明白其中的每一個組件都比5或10年前的一個應(yīng)用程序更加復(fù)雜。
anders hejlsberg: 噢,絕對,絕對。同樣,為了減少創(chuàng)建組件的復(fù)雜性,不象那種大塊頭程序,每當(dāng)必須創(chuàng)建其中的一個組件時(shí),就不必另起爐灶,而應(yīng)該盡量繼承一些早已存在于這些專門的棲息環(huán)境(hosting environment)中的東西。如果要寫瀏覽器中的一個控件,就要繼承一個基控件;如果要寫中間層的一個商業(yè)對象,就要繼承某些商業(yè)對象類;而要想公開屬性、方法和事件等等,就要說明它們是如何通過把屬性與組件聯(lián)系一起,以便與棲息環(huán)境相結(jié)合。而且還要能夠?yàn)檫@些組件撰寫隨組件一起發(fā)布的文檔。
robert hess: 所有的這些只是標(biāo)準(zhǔn)的面向?qū)ο蟮木幊?,smalltalk 擁有此特性的時(shí)間似乎已經(jīng)不短了,并且……
anders hejlsberg: 嗯,絕對如此,現(xiàn)在并不是不能做這樣的事。但如果注意一下這種今天已經(jīng)得到了廣泛應(yīng)用的編程語言,它們實(shí)際上并不真正支持面向組件的概念。如果你當(dāng)初同意我們什么時(shí)候談?wù)摻M件,那么認(rèn)為它們具有屬性、方法和事件在當(dāng)今是極其平常的。但如果注意一下c++,就會發(fā)現(xiàn)它僅僅提到“方法”這個概念,沒有屬性,也沒有事件。現(xiàn)在,你可以利用命名模式來仿真它們,也就是說,對于一個屬性,可以用一個get color和一個set color的方法來取代一個color屬性;而要代替類中作為第一個類成員的事件,你擁有的用于接收事件的接口就應(yīng)該被實(shí)現(xiàn),為了這樣,你就必須處理一些瑣碎的事……
robert hess:嗯,部分原因是由于c++是基于c的,它只是象預(yù)處理程那樣,又由于c本來就不支持,c++也不支持……
anders hejlsberg: 是的,實(shí)際上我多少認(rèn)為,你所看到的就是從c到c++再到c#的發(fā)展過程。從c到c++,面向?qū)ο缶幊痰母拍畋患舆M(jìn)去了。如果你經(jīng)歷了從c++到c#,那么我會說,面向組件編程的概念也已經(jīng)被加進(jìn)去了,而它們之間真的存在著某些相似的地方。就象可以用c代替c++進(jìn)行面向?qū)ο蟮木幊蹋阋部梢杂胏++代替c#進(jìn)行面向組件的編程,只不過是更困難而已。用c來進(jìn)行面向?qū)ο蟮木幊淌菢O其困難的,你必須手工地布置v表(虛擬函數(shù)表),并且還要處理所有瑣碎的事情。用c++寫組件也確實(shí)可行,但必須要為屬性手工地設(shè)置命名模式(naming patterns),必須實(shí)現(xiàn)事件同步(event syncs),必須具有外部的idl文件,在文件中可以對棲息屬性(hosting attributes)進(jìn)行描述,必須具有外部的文檔文件,等等。我們只真正采納了其次一個合理的步驟,它反映了人們是如何編寫應(yīng)用程序并把其整合到語言中的
robert hess: 那么,最初的一些目標(biāo)是什么?僅出自內(nèi)心的看法,當(dāng)您第一次著手這個項(xiàng)目時(shí),您要解決的問題和要確定的這種新語言的方向是什么?
anders hejlsberg: 嗯,我認(rèn)為正如您所說,面向組件只是一方面。我想另一個關(guān)鍵的因素就是簡單化。使編寫應(yīng)用程序更加簡單化,不讓程序員做一些瑣碎的事,機(jī)器可以代你做。大量的簡化取決于.net runtime本身,但也取決于語言?;旧希罱K我們所做的,就是讓你把更多的時(shí)間、更多的精力放在算法上,而讓系統(tǒng)去做一些瑣碎的事。我認(rèn)為,許多其它非常關(guān)鍵的事情比較現(xiàn)實(shí),我總不能吩咐人們把他們現(xiàn)有的代碼通通扔掉吧。我們必須找到權(quán)衡的方法,并不僅僅是你的編程技巧,而且還包括你以前編寫的、早已存在的代碼。因此在c#里,以權(quán)衡你技巧的名義,我們努力堅(jiān)持在與c++的基礎(chǔ)語法最接近、最真實(shí)的地方。所以用了c#,c++程序員會立即覺得很眼熟、很親切。
robert hess: 您的所做的一切應(yīng)當(dāng)以c語言為基礎(chǔ),是否就是當(dāng)初的思路之一?或者您是否原來就認(rèn)為,讓我們應(yīng)與過去徹底決裂,再開始設(shè)計(jì)一種全新的語言?
anders hejlsberg: 嗯,我想這種語言應(yīng)該以一種嶄新的面貌出現(xiàn),可是我們明白,必須讓c和c++程序員熟悉這種語言。當(dāng)然那就意味著在某種程度上,我們必須把語句結(jié)構(gòu)從彎曲的大括號變換成其它一些東西。我們已經(jīng)打下了一些基礎(chǔ),但仍然存在著其它某些關(guān)鍵的規(guī)則,譬如允許寫健壯的軟件,這就意味著象垃圾回收(garbage collection)、異常處理、類型安全這樣的功能,根本地改變了設(shè)計(jì)該語言的思路,非常難于上手,以后也不容易擴(kuò)展。我的意思是說,在c++中,c++語言擁有的一個強(qiáng)大功能之一,但有時(shí)也同樣是難點(diǎn)之一,事實(shí)上您知道,就是沒有類型安全。如果你了解清楚自己要做什么,就會從中獲取巨大的力量,否則,只是自找苦吃。在c++中,獲得一個虛懸指針(dangling pointer)易如反掌。同樣,覆蓋掉一個數(shù)組的尾部,或者擁有一個未初始化的變量等等,也是極其容易事情。而我們需要解決這些難題。我認(rèn)為,我們不能只從 c++著手并擴(kuò)展它。而真的必須以退為進(jìn),以c++的靈魂設(shè)計(jì)出新的方案,而這些我們已經(jīng)差不多完成了。
robert hess: 那么其它語言呢?您注意到這些語言在做了什么嗎?是否它們就是pascal 或 modular 2 或 forth,您從中得到什么借鑒?
anders hejlsberg: 絕對!噢,我們考慮到,嗯,我的意思是說,我本人出身于深厚的pascal背景,所以,自然要考慮到pascal, modula, oberon, 要考慮到smalltalk,java,c++以及所有的語言。要知道,今天它們能生存下來并得到了應(yīng)用,且或多或少地傳播開了。
robert hess: 您覺得這些語言的哪些功能比c和c++表現(xiàn)得更出色?而您就可在新的語言中引進(jìn)這些功能?
anders hejlsberg: 嗯,我認(rèn)為有一件事可以說明,我總是喜歡smalltalk,就是因?yàn)樵谠撜Z言中,任何東西都是對象。這使程序得到了大大的簡化,因?yàn)闊o論擁有什么樣的數(shù)據(jù)片,都可以把它當(dāng)作一個對象從a點(diǎn)搬到b點(diǎn)。一般來說,任何東西都可以對其進(jìn)行操作。可以把它當(dāng)作對象類型,放在容器中。在smalltalk實(shí)際的實(shí)現(xiàn)過程中,如果這樣做的話,程序性能的額外負(fù)擔(dān)(overhead)就會大大加重。例如,在smalltalk中,當(dāng)運(yùn)算float數(shù)字時(shí),每生成一個新的數(shù)字,如當(dāng)1.0和2.0加到一起時(shí),就要分配一個含有3.0值的新對象。而這樣做,代價(jià)當(dāng)然是非常昂貴的。如今在c#中,我們已經(jīng)進(jìn)行了一些革新工作,使你獲得了同一樣的利益,而卻沒有額外負(fù)擔(dān)。只要把float當(dāng)成float,或者是double就把它當(dāng)成double使用,就沒有什么代價(jià)。但如果把它們視為對象(也僅當(dāng)這樣做時(shí)),就得給它們分配堆(heap)。因此,就形成了樣相當(dāng)完美的統(tǒng)一體,既能給您大量的好處,而又沒有程序性能的額外負(fù)擔(dān)。
robert hess:c#生成的最終結(jié)果的某些結(jié)構(gòu)到底如何?您得到了一個c#程序的文本文件并且編譯它,那么編譯器本身存在著些什么問題,如何設(shè)計(jì)這些方案以便在使用時(shí)更具效率,而這種優(yōu)化其它語言有可能已經(jīng)做過,而甚至最終還要生成二進(jìn)可執(zhí)行文件嗎?
anders hejlsberg:嗯,我們已經(jīng)做了一些涉及到如何編碼的工作。假如你是一個c++程序員,當(dāng)然熟悉怎么做,在c++中聲明和實(shí)現(xiàn)是分開的。所以所有聲明都放在h文件里,接著在另一些模塊中把它包含進(jìn)去(# include),然后再在cpp文件中寫出實(shí)現(xiàn)程序。在c#中,把它們都寫在同一個地方。這樣,可在那里寫出聲明接著又立即寫出實(shí)現(xiàn)代碼。
robert hess:假如您必須在另外一些文件中采用在main文件中聲明的某些值,那又怎么辦?
anders hejlsberg:那么會出現(xiàn)什么情況呢?當(dāng)編譯時(shí),實(shí)際生成的代碼或重新生成的輸出文件都含有兩種代碼:元數(shù)據(jù)(metadata),符號表(symbol tables)或其它相關(guān)的符號信息(symbolic information),而不是僅生成只含有可執(zhí)行代碼的x86機(jī)器碼。在某種意義上,這些代碼變成了自我描述。所以當(dāng)想從一個代碼片使用另一代碼片時(shí),只要引用它們便可,而這些代碼的自我描述足以讓人們知道在那里有什么類,類擁有什么成員,可以調(diào)用什么方法,屬性是什么以及類型名是什么,等等。
robert hess:那么,是不是象您所指的.obj文件或.exe文件,抑或……
anders hejlsberg:嗯,您說的很對,我們在.net中使用的格式就是pe格式,故可以指向另外的exe或dll。我們現(xiàn)在調(diào)用這些匯編程序,并基本上用這種語言大量地描述這些高級dll,它們不僅含有代碼,也含有這樣的信息:說明什么在代碼中,以及這些代碼真正地引用了其它什么樣的匯編程序。
robert hess:您所說的代碼是指二進(jìn)制代碼或可執(zhí)行代碼。
anders hejlsberg:嗯,實(shí)際上,我們并不直接生成可執(zhí)行的x86機(jī)器碼,而是生成msil,也就是中間語言,它由.net定義,并由jit(實(shí)時(shí)編譯器)編譯。
robert hess: ok,這樣看來,您擁有了一個可執(zhí)行文件,其本身與中間語言以及元數(shù)據(jù)相關(guān)聯(lián),而如果我想要在其中一個應(yīng)用程序里使用它,我只要指向它并說道,嘿,我要借用這些類,借用這些對象,并在這樣的程序中使用它。這使我想起了許多人曾經(jīng)提過的一個問題,涉及到中間語言存在著潛在的漏洞,有些人可能會攫取這種文件并對其進(jìn)行反編譯,然后再恢復(fù)成當(dāng)初的源代碼。因此,并非所有的智能特性(intellectual property)都有利于開發(fā)者。這方面還有什么問題?
anders hejlsberg:嗯,首先,您現(xiàn)在實(shí)際上可以用dll進(jìn)行處理。這可能有點(diǎn)難,但您可以采用包含x86碼的一個dll,然后至少把它反編譯成匯編程序。您可做同樣的……
robert hess:在我的apple ii上,我一直都是這樣做的。
anders hejlsberg: 確實(shí)如此,我對此感到慚愧。但是運(yùn)用.net dll并把其反編譯成msil,也可以做相同的工作。它們并不能直接地被反編譯成c#,盡管您也有可能蒙對,但太難了。不同的地方在于,有著非常多的符號信息(symbolic information)關(guān)聯(lián)到由c#生成的代碼,以及msil,對不起,是.net匯編程序。例如,你可以從代碼中得知,什么類在這里,它們的成員是什么,等等。這是一個需要解決的棘手問題,因?yàn)樽尨a自我描述(self describing)的好處多多,但事實(shí)上代碼對自己進(jìn)行的描述,也同樣使反編譯工具所處理的代碼變得似乎容易理解了。如果我們認(rèn)識到這個問題,基本上我們要做的,就是創(chuàng)建一個稱作攪拌機(jī)(obfuscator)的東西,它會加入并搞亂代碼,使代碼變得幾乎難于看懂,可仍然保留著原來相同的公共接口。
robert hess:是的,因?yàn)槟龅竭@樣的難題:當(dāng)采用、編寫這些編譯器程序時(shí),就想讓編譯器理解代碼(或類似的過程等),但卻不想讓人們在同一層次上看懂它們。
anders hejlsberg:確實(shí)如此,確實(shí)如此。我確實(shí)想指出,對于一個小程序,實(shí)際上可以對其進(jìn)行反編譯,給出足夠的時(shí)間和資源,你甚至可理解它在干什么。然而對于真實(shí)世界中的一個應(yīng)用程序,這卻是一項(xiàng)艱巨的任務(wù)。在現(xiàn)實(shí)中你最好運(yùn)行這個應(yīng)用程序,理解它在干什么,然后寫出它的一個copy。你會很快達(dá)到這個水平的。
robert hess:或許寫出一個更牛的程序,因?yàn)槟且粋€更牛的程序員,對嗎?為了斷定我們的觀眾是否想要著手實(shí)現(xiàn)下一個c#項(xiàng)目,他們需要去理解有關(guān)c#的一些什么問題?
anders hejlsberg:嗯,我想首先你必須考慮到自己的基礎(chǔ)。如果你有現(xiàn)成的代碼體,讓我們假定它是用c++寫成的吧,也許把這些代碼移植到.net framework的最佳途徑就是使用managed c++,該c++編譯器隨.net一起發(fā)布。然而,如果你著眼于編寫新的代碼,也就是寫新模塊、更大的模塊,加入到一個應(yīng)用程序或一個完全了解的應(yīng)用程序中,而且你精通c++,那么我建議考慮c#。
robert hess:因此,我們沒有必要說,每個人都必須用c#重寫他們的應(yīng)用程序。我們在說,人們必須了解他們目前所從事的工程的類型,是否是一個現(xiàn)成的項(xiàng)目、陳舊代碼,并且有時(shí)還要用c#寫一些組件,莫非您可以交替地使用c#和c++?
anders hejlsberg:噢,絕對。首先,如果你擁有現(xiàn)成的代碼,假定這些代碼是由windows平臺所支持的任何一種語言寫成的,則把它們編譯成com組件或dll,就會獲得與這些代碼很強(qiáng)的交互操作能力(interoperability)。如果要寫專門用于.net framework的代碼,用于.net framework的新代碼,當(dāng)然要用.net framework所支持的任何語言寫。我們計(jì)劃在visual studio .net中發(fā)布四種語言:c#、 c++、 visual basic 和 jscript??墒菫榱伺c產(chǎn)業(yè)界和學(xué)術(shù)界合作,我認(rèn)為,最新的統(tǒng)計(jì)可能不是很準(zhǔn)確,但我想總共大約17種不同的語言現(xiàn)在都瞄向了這一個平臺,其范圍一直從apl到cobol。
robert hess:那么象fortran又怎么樣呢?
anders hejlsberg:我相信相關(guān)的工作正在進(jìn)行中,可我不能準(zhǔn)確地知道到底誰正在設(shè)計(jì)fortran編譯器。但關(guān)鍵的是,實(shí)際上我們已經(jīng)做了多次示范了,你可以在c#中寫一個基類,并在c++中繼承它,然后再用vb程序創(chuàng)建它的一個實(shí)體。在不同的語言之間進(jìn)行的互用操作是無縫的。我想正是這些性能,使.net framework甩開產(chǎn)業(yè)界中其它競爭對手的產(chǎn)品。(有興趣的讀者可以到http://www.lahey.com/net_down.htm去下載lahey/fujitsu fortran for .net technology preview 1,譯注)
robert hess:而且它采用并允許在基礎(chǔ)層次上進(jìn)行多語言的互用操作。
anders hejlsberg:是的,很準(zhǔn)確。不過是位于一個很高的層次。您可能會爭辯:現(xiàn)在的語言可以進(jìn)行互用操作,但只能位于很低的層次,例如,dll的入口點(diǎn)、具有指針在其中的結(jié)構(gòu),等等。而我們正在談?wù)摰礁叩恼Z義層次,是位于面向?qū)ο蟮膶哟?,具有類和接口等等?br>