首頁 »
2008/11/21

C# 4.0(VB 10)與CLR 4.0之驚鴻一瞥

C# 4.0 VB 10動態語言 CLR 4.0
在今年2008/10/27日的PDC 2008之後,對於未來.NET 4.0的相關技術有了更多且更具體的答案,而今天所要談的主角是C# 4.0,並稍稍帶出CLR 4.0的新功能改造。


前幾天一個讀者,突然丟了一個訊息~
讀者說:"祭司好久沒有更新文章了。"
我說:"對!因為最近實在太忙了,年底一堆東西要結案,所以很忙。且不是沒有新東西,而是知道太多新東西,反而不想講。"
讀者:"雖然祭司貼的新訊心不一定能全部看懂,但總是覺得需要。"
我說:"其實我心裡是有想要講啦!最近會想辦法抽空寫幾篇文章。"


在良心不安之際,在欠各位許多新消息之際,其實許多新消息和新技術我都了然於心,也都有加以注意與研究,只是寫出來真的很耗時,以故很久沒動筆了,今天彌補大家一個新技術文章心得分享,以下是文章開始。

原本祭司在2008/10/15日寫了一篇「下一代C# 4.0的三個重要方向」一文,文中闡述其中三個重要改良:
1.Functional Programming
2.Dynamic programming
3.Concurrency

而寫這篇文章時,我一時興起用了另類手法來襯托出C# 4.0的三大特色,目的是為了讓人讀後不那麼枯燥,純粹博君一笑式的文章方式。但很怪。。有人就是看不慣,說我別寫什麼做夢文之類的。。不曉得是說有人覺得我是胡亂說的?當下來個痛批,若是祭司胡亂說,那痛批我的胡言亂語那我倒無話可說,但。。現在來印證一下祭司所指C# 4.0三個重要大方向是否是自己胡謅的,以下是C#首席架構師Anders在2008/10/27的PDC 2008大會中,一場「The Future of C#」演講中,談到C# 4.0的新功能種種,那我截錄其中一張照片給各位看。
The Future of C# 4.0


這張投影片中指出C# 4.0三大功能區塊:
1. Declarative(其中一大意就是指Functional Programming)
2. Dynamic(就是指Dynamic programming,動態語言)
3. Concurrent(就是指Concurrency ,平行運算)


而Ander演講的日期是2008/10/27,而我寫的文章是2008/10/15,我早了12天提前講,並不是事後附喝的,再者也不可能Ander演講投影片會事先給其他人看,我更是不可能曾經看過的。談來談去,只是有些未來的事,若我早說了。。一定是有我強而有力的根據,即便諸位在媒體都還沒看到過。。。我只是要陳述一個理念,就是我談未來的技術一定是有憑有據,不會任憑自由心證而誤導各位,否則可真的是對不起各位了。

不過以上屬於題外話,拉回正題,以下簡單談一下C# 4.0這三大功能中,其中和Programmer"個人"有最大相關,也是C#三大特色中最強調的,那各位猜猜是哪一個?

答案是~~~Dynamic Programming~~~

在談Dynamice Programming之前,首先我們來了解一下C# 3.0的新功能演進,請參考下圖。


圖中各位可以看到,C# 3.0諸多新功能之中,最核心最重要的改良莫過於LINQ查詢語言的融入,透過LINQ,以前對資料或物件查詢的困難事,到了LINQ手中都變容易與快速了,且有愈來愈大量的事實,無論是在MSDN Library、MSDN專欄文章或專家示範,幾乎都大量使用LINQ語法來詮釋程式碼,在這時候您怎能對LINQ無動於衷呢?幾個月之前我一直呼籲,對LINQ您一定要有基本認識,要能夠下基本的查詢語法,要有基本的觀念,否則將來對新技術的學習會構成一大障礙,同時學會了LINQ基本語法,對於微軟新研討會,祭司所講的新技術的運用,到2010年都可以聽得懂(當然2010年後也一樣適用)。

而先前講說LINQ基本的一定要學,雖然看得見端倪,但卻沒有一個絕對的事實能夠實證支持這樣的說法,但就在2008/11/13日台灣微軟Data Services Framework研討會中,祭司講解了.NET Framework 3.5 SP1的ADO.NET Data Services Framework,裡面大量使用LINQ語法來詮釋Data Services的程式,其至Entity Framework及EDM的資料查詢也非LINQ莫可。。。。這下從沒學過LINQ的人,可能開始感受到障礙的產生(也許心中還有恐懼),想想。。不懂LINQ,沒有一點點LINQ的基礎,將來在幾個層面將接連出現障礙,會變得難以融入以下幾個技術層面:
1.LINQ本身
2.ADO.NET Data Services  Framework
3. ASP.NET AJAX 4.0的Data Services資料查詢
4. Silverlight 2.0的Data Services資料查詢
5. ADO.NET Entity Framework

所以說,祭司不是講空話,工作都那麼重了,沒事叫你學學LINQ。但Data Services研討會中,對於懂基本LINQ語法的人,心中可能舒坦極了,因為他們看見自己學LINQ終於顯露出了價值,開始變得和別人不一樣,開始能夠發揮LINQ所長之處。

那如何學習LINQ?諸位沒發現,祭司一直講的是"基本",而不是叫你專修(因為這很困難,也很漫長,甚至有點不實際),要叫一個人買一本LINQ專書,然後全部都修完,這可能負擔很重,10個裡面有1人能專修完一本LINQ書就很了不起了;但。。其實新技術運用LINQ都還不至於用到那麼深,你只要懂基本的語法,十之八九就能夠上手新技術範例了。學LINQ方式有很多種,例如買LINQ專書,看網路上文章或MSDN Library,此外若您想要快速又觀念正確地學會基本的LINQ,可以參考「聖殿祭司的ASP.NET 3.5專家技術手冊II」,因為學LINQ最好一定要和C# 3.0及VB 9的語言新特性一起學,也就是LINQ + C# 3.0或LINQ + VB 9,否則你很容易被新語言中的新指令關鍵字弄混淆,以致觀念不清。

OK~談完C# 3.0(VB 9)新發明LINQ之後,現在輪到C# 4.0(VB 10),這時它最大的特色是Dynamic Programming,請參考Anders投影片所指C# 4.0演進。


而什麼是Dynamic Programming呢?中文就叫動態語言,例如最典型的JavaScript就是動態語言,在比較早之前,因為動態語言本身型別不明確,型別宣告之後,也可以一直不斷的變換,而這在程式設計面都會潛藏許多不穩定的因子,等程式執行時,Bug才會被發現,而不是事先可以透過Compiler來進行檢查,事先預防。。故某種程度在若干年前,特別是Java及.NET大量普的世代,JavaScript可謂是惡名流佈。

此外動態語言的"動態"一詞,我個人感覺有點牆頭草,因為型別可以一直亂換,且JavaScript程式同一功能,其語法的寫作卻常可以變換出兩到三種,兩到三種有時看似很像,但卻有可能大異其趣,是故JavaScript總難以被正確完全理解,不像C#是可以透過其設計與架構,從程式開始,到運行中間,再到執行結果可以一一論述與預測的,畫一張流程圖來解釋也沒問題,但JavaScript要我畫我卻畫不出來,我甚至不曉得它引擎是如何運作,中間是如何執行,且為什麼幾種相似語法,結果及執行成本卻是天差地遠,是故過去幾年中,我對JavaScript的熱愛程度與信任度,總是遠低於C#,這純粹是我的看法與喜歡,也不一定是真理,諸位也不必想法和我一樣。

那再者微軟及Anders又是如何看待Dynamic Language的呢?或者說即便Dynamic在之前有那麼多負面的印象,為什麼微軟及Anders又會回過頭來正眼瞧它,甚至是變成C# 4.0(VB 10)的座上賓?我想其中一個開頭的原因是因為Ruby及Python這類的動態語言,在過去幾年獲得許多人的青睞,營造不少成功的氣氛,讓不少軟體鉅子回過頭正眼瞧它,仔細思量為什麼這動態語言小子這麼紅?

其實動態語言,它以前的缺點如弱型別、彈性、可動態變換型別、不需處理太多底層的事,在現在來看反而變成優點!!!為什麼呢?首先是因為Java發展到後面變得異常複雜,甚至C#語法也愈變愈複雜難以理解,甚至要呼叫底層一些物件、型別或方法,又要使用Reflection映射來處理,且你還得懂為什麼要那樣處理,才有辦法在沒有參考的程式碼或別人指導下,寫出你想要的程式碼。

是故在"太複雜"的反思、反動或說反抗之下,這就是Ruby等動態語言成功之處,它們不需要處理過度複雜底層的事,程式碼簡短有彈性,可快速完成開發工作,將寶貴的時間與精力留在重要的商業邏輯上,而非耗用在技術本身的難度上,這些就是Dynamic Language最大最大的優點。。。用它們來改造C# 4.0及VB 10的程式碼,可以讓許多複雜的程式變簡單,例如以下是其比較。

傳統C#靜態語言之語法


C# 4.0的動態語言之語法

各位自行比較一下上面兩張圖,用傳統C#靜態語言之語法撰寫相同的程式,不但複雜、難懂又囉唆,若改用C# 4.0動態語言之後,簡單明瞭又快速,你想~誰會想繼續用傳統複雜的語法,來完成相同的工作!?當然這指是在沒有特殊考量的情況下,或者將來我們可以適時運用動態語言,來迴避局部困難的C#語法區段,讓程式變得容易。

所以為什麼微軟會適時融入動態語言的重要功能特色不是沒有道理的,下圖說明動態語言與靜態語言之優點特色比較。



而傳統CLR(Common Language Runtime)執行環境根本是為C#及VB這類靜態語言所建構的,根本沒有所謂的執行前不需事先編譯這回事,那要如何達成動態語言直譯式,執行時再逐一解譯呢?微軟這時改造了CLR,在它的上面再建構一個獨立的Dynamic Language Runtime,使得.NET可以同時支援靜態及動態語言,又可以不必破壞原有的CLR執行層。
CLR 4.0


所以看到這,不但諸位見到了Dynamic Language動態語言,而祭司又順勢引出了另一大重點~CLR 4.0,原本在.NET 3.5沒有新版本的CLR,仍舊是CLR 2.0,而在.NET Framework 4.0時會附上新的CLR 4.0,以滿足各位喜歡新東西的喜好或虛榮心。

至於CLR 4.0還有什麼新技術,有什麼樣的變動或大改進呢?那又是另外一個故事了。。。期待下回見!

註:
C# 4.0許多新功能,也是會對等加入到VB 10之中,所以當祭司說C# 4.0時,也是等同指著VB 10。


下一代C# 4.0的三個重要方向←上一篇 │首頁│ 下一篇→靜態語言 vs. 動態語言的比較
本文引用網址: