預(yù)測C#與.NET的發(fā)展趨勢
因?yàn)槲覀冏笥也涣薱#和.net的發(fā)展,所以我們對C#和.net的發(fā)展中的科學(xué)技術(shù)問題并不關(guān)心,更多關(guān)注它是否普及應(yīng)用。
在軟件領(lǐng)域,我們有兩個(gè)極端:1是什么事情都動(dòng)手解決,從邏輯角度,“C#什么都能做”,可以把“c#”換成c,c++,vb,甚至匯編,基本上都是對的,但這本身沒有多大意義。其實(shí)我們更關(guān)心,這門語言,有沒有從語言特性上對這種開發(fā)提供支持。比如用bool類型,比c中用0,1表示false,true要“安全”得多。2 是“等一等看一看靠一看”的“等看靠”思想。例如,以前c#1.1的時(shí)候,我們等著微軟出泛型;c#2的時(shí)候,等微軟出linq,silverlight;C#3的時(shí)候,等微軟出動(dòng)態(tài)。因?yàn)槲覀儧]法直接與MS高層交流,所以我們除了“等呀等,盼呀判”,還能做什么呢?
我們有很多的理想和抱負(fù),個(gè)人不能實(shí)現(xiàn),而微軟能實(shí)現(xiàn)我們那些夢想的部分,是一種非常美好的事情。
對C#和.net的發(fā)展,其實(shí)我們也可以反思,批判,提出建議,做出預(yù)測。
C#和.net的發(fā)展,最終的目的,是提高開發(fā)效率,更加智能。具體的,包括重用,可維護(hù)性等等。
那么怎么才能提高開發(fā)效率呢?
我們知道,從語言基礎(chǔ)平臺(tái)來看,程序開發(fā)主要分為算法和API(在.net中表現(xiàn)為類和類庫)。提升效率,應(yīng)該從這兩方面下功夫。
算法邏輯就三種,順序,判斷(分支),循環(huán)。對于循環(huán),C#和Java基本上都沒有努力。雖然LINQ部分地輔助了集合的開發(fā),但離面向集合(數(shù)組,矩陣,向量,序列等等,怎么叫都可以)的通用集合開發(fā),還差的很遠(yuǎn)很遠(yuǎn)。VB簡單地引入了數(shù)組字面常量,使得數(shù)組的開發(fā),變得簡潔一點(diǎn)。像matlab, r,sas,apl(array process language)語言,是多么的簡潔,取得的成功是多么驚人,看看科學(xué)家和工程師使用的科學(xué)計(jì)算語言,就明白了??茖W(xué)工程是多么的需要這種 循環(huán)黑盒子。
實(shí)際上程序的主要工作,都在循環(huán)上,而且規(guī)律性極強(qiáng)。例如,我們要計(jì)算所有員工的月底工資獎(jiǎng)金,我們先算一個(gè)人工資獎(jiǎng)金,然后再用循環(huán)處理。
因?yàn)檠h(huán)有自身的規(guī)律性,所以不應(yīng)該由程序員來寫代碼,在更高級(高階)的環(huán)境中,循環(huán)應(yīng)該是一個(gè)黑箱。
所以為了把循環(huán)當(dāng)作黑箱處理,輔助集合數(shù)據(jù)(數(shù)組,矩陣,向量,序列等等,怎么叫多可以)的表示和應(yīng)用是基礎(chǔ),而算法的自動(dòng)生成是關(guān)鍵。
只有把集合當(dāng)作基本數(shù)據(jù)類型,循環(huán)作為單個(gè)操作,并自動(dòng)優(yōu)化循環(huán)算法(例如并行計(jì)算,延遲計(jì)算),這門開發(fā)語言,才從面向過程,面向算法,上升為面向問題的智能語言,“脫離低級趣味”。
在大學(xué)學(xué)測量平差的時(shí)候,我用FoxPro來實(shí)現(xiàn)線性代數(shù)的各種基礎(chǔ)運(yùn)算。
大三學(xué)數(shù)值分析時(shí)候,自己用C語言寫了一些算法。
其中學(xué)數(shù)據(jù)結(jié)構(gòu),書上的每一個(gè)算法,都自己先寫算法,再對照書,然后改進(jìn),這些算法,都寫了三遍,形成了多個(gè)版本和多種實(shí)現(xiàn)算法,用過的白紙,堆起來有半尺。
2002年,畢業(yè)設(shè)計(jì)做“GPS似大地水準(zhǔn)面的二次曲面擬合”,用的是自寫的C++的矩陣實(shí)現(xiàn)。這個(gè)c++矩陣類,成了我博客的第一篇博文。
工作時(shí),用c++寫了道路橋梁曲線坐標(biāo)放樣程序,是一個(gè)比較實(shí)用的功能,可以求出任意公里樁,任意寬度的,任意曲線類型的半徑。
在研究生階段,再學(xué)數(shù)值分析的時(shí)候,使用的是MatLab版本,把書上的所有的算法,自己完全實(shí)現(xiàn),并與書上對比,又進(jìn)行了改進(jìn),寫得非常認(rèn)真工整?,F(xiàn)在這本數(shù)值分析的MatLab算法,還在我的桌子上,舍不得丟棄。那些稍微復(fù)雜的算法,用c/c++,基本上都要幾百行,甚至幾千行代碼,而用matlab,幾句話,大部分也就20來句,就做的非常漂亮。
再后面廣義測量平差,GPS坐標(biāo)計(jì)算,計(jì)算量太大,用c/c++,憑個(gè)人精力,基本上是不可能去實(shí)現(xiàn)的。matlab成了不二選擇。
其后學(xué)生物統(tǒng)計(jì),接觸了R語言,APL語言,對基于集合的編程,深有體會(huì)。
為了簡化判斷(分支),C#和java都引入了bool型。但很多判斷,是事先并不確定的。代數(shù)計(jì)算器的編寫,就是一個(gè)簡單而又典型的例子。在C#里,有多種方式,來實(shí)現(xiàn)簡單計(jì)算器。在大話設(shè)計(jì)模式里甚至用工廠模式來討論(個(gè)人有些反感這種模式,更反感接口的使用,大部分是過度設(shè)計(jì))。其他如語法詞法樹,微軟的msscript.ocx,利用動(dòng)態(tài)語言(如python,javascipt)等方式,也是用得比較多的,簡單的計(jì)算,可以利用DataTable的Evaluate來進(jìn)行某些有限的計(jì)算。
動(dòng)態(tài)語言中,一句話就能解決的問題,對C#和.net程序員,卻傷透了腦筋。
只有引入動(dòng)態(tài)特性,動(dòng)一點(diǎn),再動(dòng)一點(diǎn),我要搖擺,在我的地盤我自由地跳。 “能靜則靜,想動(dòng)就動(dòng)”,“靜如處子,動(dòng)如脫兔”,“上得廳堂,下得廚房,進(jìn)得閨房”,是每個(gè)程序員的夢中情人。FoxPro,JavaScript,Python,Basic等經(jīng)典的動(dòng)態(tài)特性,是多么引人入勝,遐想聯(lián)翩呀!
至于API(或者類庫),一些是通用的,一些是面向領(lǐng)域的,還有考慮輕重緩急之分。從2002面世,C#和.net走過了7個(gè)年頭,應(yīng)該歲數(shù)不小了。但類庫還是相當(dāng)?shù)娜狈?相比vb,delphi,c等傳統(tǒng)語言)。CodePlex的項(xiàng)目雖然也不少,但成氣候的真沒幾個(gè)。
數(shù)學(xué)類庫是一切邏輯思維的基礎(chǔ)和最大工具。.net應(yīng)該大量加入數(shù)學(xué)(代數(shù)、幾何、離散數(shù)學(xué)、線性代數(shù),概率和數(shù)理統(tǒng)計(jì))類庫。而現(xiàn)在的.net類庫中,只有簡單的離散數(shù)學(xué)(數(shù)據(jù)結(jié)構(gòu)和算法是一部分離散數(shù)學(xué)的表現(xiàn)和實(shí)現(xiàn))。GIS空間數(shù)據(jù)庫,可以看成是球面幾何的應(yīng)用。融入了大量的數(shù)學(xué)類庫,C#和.net就將會(huì)在包括電信,醫(yī)療、經(jīng)濟(jì)、衛(wèi)星、測繪、生物、規(guī)劃,CAD,設(shè)計(jì)等科學(xué)工程領(lǐng)域迅速擴(kuò)大市場。
其實(shí)C#和.net還有很多需要發(fā)展的地方:主要包括
1. 基于泛型的數(shù)據(jù)集,(DataTable< T>, DataColumn< T>)
2. 基于泛型的控件: T TextBox< T>, 而本質(zhì)上,TextBox只能輸入字符串,在TextBox中怎么確定輸入的字符串合法,并得到正確的對象值,而不是字符串呢?即 T TextBox< T>.Value。 其實(shí)泛型控件的實(shí)現(xiàn)也很簡單,答案是構(gòu)造函數(shù)。利用構(gòu)造函數(shù)或類型轉(zhuǎn)換函數(shù)實(shí)現(xiàn),如果沒有重載構(gòu)造函數(shù),或者重載轉(zhuǎn)換函數(shù),輸入值失敗。同樣,T ComboBox< T>.Item[int index] 也是我們需要的。我剛才在使用ComboBox.Items[int index]的時(shí)候,卻需要使用強(qiáng)制類型轉(zhuǎn)換,還要考慮()轉(zhuǎn)換,還是as轉(zhuǎn)換,因?yàn)橹殿愋停ㄈ鐂truct)是不能用as轉(zhuǎn)換的,要多使用兩個(gè)闊話,很是丑陋.
3. 泛型間數(shù)據(jù)類型的轉(zhuǎn)換。為了安全和簡單,C#現(xiàn)在禁止泛型間數(shù)據(jù)類型轉(zhuǎn)換。但實(shí)際上,泛型間的數(shù)據(jù)類型轉(zhuǎn)換,是安全有效的。只要編譯器檢測所應(yīng)用的類型,有沒有重載對應(yīng)類型的構(gòu)造函數(shù)和轉(zhuǎn)換函數(shù)即可。
4. SilverLight,compact framework,macro framework和普通的.net framework之間的兼容和互操作,也是一個(gè)必須改進(jìn)的方面。子集和超集(父集),必須完全兼容和互操作。Vista,因?yàn)檫@個(gè)問題,而應(yīng)用受限。
5. silverlight和C#與html的集成,以及silverlight與數(shù)據(jù)庫、服務(wù)器的交互,嚴(yán)重阻礙了.net在網(wǎng)絡(luò)上的應(yīng)用。C#應(yīng)該像js操作html那樣操作DOM。
6. .net的可選安裝。飛信用.net開發(fā)了那么久,都不敢安裝.net。我們開發(fā)的應(yīng)用程序,應(yīng)該可以讓用戶只安裝必須的類庫,做到j(luò)ust in time install (JII)
7. 基于組合的winform開發(fā)框架,而不是目前的傳統(tǒng)的基于繼承的開發(fā)框架,能方便界面的快速有效開發(fā)。例如,我們把treeivew作為一項(xiàng),直接放入combobox,把DateTimePicker直接放入ToolStrip中,基于組合的框架,支持直接Items.Add(),而不用寫個(gè)自定義的繼承的類。
8. 基于集合的控件和基于組合的控件開發(fā)框架,對程序自動(dòng)生成,能大大提高效率。所有的控件,都有過數(shù)組版本。這可以通過加入對應(yīng)控件的集合版本,如RadioButtonList,,TextBoxList,,或者提供泛型控件集合。
9. 類似于VBA的二次開發(fā),把.net帶入工業(yè)批處理時(shí)代。VSA(visual studio for application)已淘汰, VSTA ( visual stdio tools for application)不成熟。傳統(tǒng)的CAD,GIS,OFFICE軟件,在規(guī)劃,設(shè)計(jì),辦公,計(jì)算領(lǐng)域,多用VBA進(jìn)行二次開發(fā),進(jìn)行工業(yè)自動(dòng)化,創(chuàng)造的價(jià)值,遠(yuǎn)遠(yuǎn)大于軟件本身的售價(jià)。
憑微軟孤軍奮戰(zhàn),路還很長…,夢還很遠(yuǎn)…
PS: Linq2Spatial,或者類似的地理計(jì)算,也是一個(gè)非常重要的方面,微軟的virtual earth, google的maps,earth的在線地圖服務(wù),創(chuàng)造了無以計(jì)數(shù)的應(yīng)用。在前段時(shí)間的日全食觀測中,我就是利用google maps來給全國各地的朋友提供信息。數(shù)字地球是整合資源信息的框架,esri最先看到了,Oracle領(lǐng)頭了(oracle spatial),google最時(shí)髦的沖到了前鋒(google maps,google earth),微軟緊跟其后(ms spatial, ms virtual earth),中科院遙感所、地理所、國家測繪局,武漢大學(xué)也死死的跟著,但力不從心。雖然我覺得過于庸俗,但這里還是引用這樣一句大家耳熟能詳?shù)脑挘骸靶畔⒌?0%都與地理位置有關(guān)”。其實(shí)這個(gè)數(shù)字是保守的。我們考慮自然界和生命體的層次:基本粒子(原子核,質(zhì)子,中子,電子),原子,分子,細(xì)胞,組織,器官,個(gè)體,物種,種群,群落,生態(tài)系統(tǒng),區(qū)域,全球,太陽系,銀河系,宇宙這個(gè)人類生存的系統(tǒng),就會(huì)發(fā)現(xiàn),從器官以下的層次,基本屬于物理,化學(xué)、生物,電子等領(lǐng)域,與地理信息無關(guān),而從個(gè)體,物種,直到銀河系,宇宙,我們都需要獲取時(shí)態(tài)的空間地理信息。但沒有多少人明白,這其中的基礎(chǔ),坐標(biāo)系是怎么建立的(球心坐標(biāo),投影坐標(biāo),各種投影坐標(biāo)的轉(zhuǎn)換和應(yīng)用),前房交會(huì),后房交會(huì),側(cè)方交會(huì),球面幾何的計(jì)算。“我在哪里?從哪里來?到哪里去?怎么走?",這是地理信息系統(tǒng)需要解決的問題,也希望我們能夠在日常計(jì)算方便集成面向?qū)ο蟮牡乩碛?jì)算。
對于C#與.NET的發(fā)展的想法就寫到這里,歡迎討論。
【編輯推薦】