解讀多語言開發(fā)的個人體驗_.Net教程

      編輯Tag賺U幣
      教程Tag:暫無Tag,歡迎添加,賺取U幣!

      推薦:解析ASP.NET Routing對請求的處理方式
      原本這是《關(guān)于ASP.NET Routing的幾點內(nèi)容》一文中的一節(jié),不過等寫完這節(jié)之后發(fā)現(xiàn)這塊內(nèi)容已經(jīng)比較完整了,而且它本身也是獨(dú)立和最為常見的部分,因此我把它提取出來單獨(dú)成文。至于那片文章的其他部分我會再修改一下,明天發(fā)布。希望這些內(nèi)容會對您理解ASP.

      在文章的前面,先定義一下,這里談的“語言”(A)指的是“語言以及使用該語言可以很容易調(diào)用的基本類庫及可免費(fèi)或低代價獲得的第三方類庫及開源類庫”(B)。在很多情況下談“語言”和談“語言”的選擇時的語境,都是指的B。選擇多語言混合開發(fā)的一個目的是為了使用其中某個語言的某個類庫或重要特性。比如,在OpenCV中,計算量不大的部分使用了很多的C++的STL中的數(shù)據(jù)結(jié)構(gòu)和算法,而不是自己用C去實現(xiàn)一份。

      我最近在研究Sift算子。一份C#寫的Sift代碼處理一張600×600的圖像的處理時間大概在一分鐘上下,而一份用C寫的Sift代碼可以秒掉這樣的圖像,所以我不得不使用C+C#的混合編程:在應(yīng)用層使用C#,在底層使用C。為了方便的使用C#調(diào)用C,又不得不用上C++/CLI。我最后選擇的工作模式是這樣的:使用C#進(jìn)行應(yīng)用算法開發(fā)、原型開發(fā)和演示(Winform/Silverlight),使用C/C++進(jìn)行最終產(chǎn)品開發(fā)(使用C#驗證過的算法)。原型開發(fā)可以在Windows上進(jìn)行,而最終的代碼卻不一定在Windows下跑。為了降低從原型到產(chǎn)品的代碼翻譯的成本,我必須保證原型開發(fā)的核心類和產(chǎn)品開發(fā)的核心類盡量類似。為此,我又引入了純C++層,形成了下面的語言層次:

      image

      各層的作用:

      1、C/C++層以C為主。有3個原因:

      (1)可移植性。畢竟C#需要CLR,沒CLR的地方,都沒法用。

      (2)性能和內(nèi)存可控

      (3)絕大部分核心算法都有C/C++版

      2、純C++層。C/C++層的API基本都是C風(fēng)格的,難用,因此,需要封裝成對象。我把底層封裝成了一個大對象 SmartImage。用純C++封裝而不用C++/CLI封裝是因為純C++不需要復(fù)雜的運(yùn)行時環(huán)境。

      3、C++/CLI層。C++相對于C來說,好用多了,但相對于C#來說,則又難用多了。而很多圖像處理項目,大部分工作量是算法參數(shù)選擇、組合和驗證,因此,有必要再度封裝一下,方便上層調(diào)用。C++/CLI和純C++層幾乎是一對一的映射。

      4、應(yīng)用層。通過上面三層的工作,就可以使用優(yōu)雅的C#來進(jìn)行日常工作了。我是宅男,怎么演示Demo、演示案例、演示進(jìn)度呢?一個很好的選擇是使用Silverlight,調(diào)用C#寫的WebService,然后再調(diào)用底層。怎樣進(jìn)行日常開發(fā)呢,下面是俺用Winform寫的一個實驗平臺:

      clip_image004

      在幾年前,我也是用過一次多語言開發(fā),那次是C++ / TCL 混合開發(fā)——底層語言+膠水語言的開發(fā)模式。非常多的項目采用的是這種開發(fā)模式。游戲界多采用這種開發(fā)模式。Matlab也是這樣一種模式。

      這種開發(fā)模式存在兩個好處:

      (1) 可以綜合底層語言的性能和膠水語言的強(qiáng)大生產(chǎn)力,損失小部分性能,來換取強(qiáng)大的生產(chǎn)力和更好的產(chǎn)品質(zhì)量。

      (2) 膠水語言可以隱藏復(fù)雜的細(xì)節(jié)問題,提供更友好的使用方式,從而擴(kuò)大產(chǎn)品的使用面。

      某書第五章所提的多語言開發(fā),它舉的例子,大多屬于此類,這些例子我個人認(rèn)為是合適的(那個測試的例子除外,因為我不懂老趙說的AAA,就跳過去沒看)。很多情況下,出于綜合考慮,人們并不是去擴(kuò)充類庫,而是直接選擇其它語言了。

      另一種很自然的多語言開發(fā)就是Web開發(fā)了,前臺Html/Js,后臺某語言,這種多語言開發(fā)太普遍了,以至于我們不把它當(dāng)作多語言開發(fā)了。從這種多語言混合開發(fā)的場景可以看出,不同的語言除了語法之外,還有許多更重要的約束條件。比如,安裝基礎(chǔ)。用C#開發(fā)共享軟件,一個局限就是目前的安裝基礎(chǔ)不夠。Silverlight的安裝基礎(chǔ)也不夠。Html/Js的安裝基礎(chǔ)非常大。再比如,運(yùn)行環(huán)境的大小——lua的運(yùn)行環(huán)境所需文件大小要遠(yuǎn)小于python——對于我這種不會Delphi,討厭匈牙利命名法,討厭Windows API,討厭MFC的人,想要在Windows下開發(fā)只有一兩兆的軟件,lua恰好可用——D不成熟,Python太大。

      再一種多語言開發(fā)的場景是集成舊系統(tǒng),這個就不多說了。

      多語言開發(fā)一般來說就是人們在工程約束的情況下所做的最優(yōu)選擇的結(jié)果。這種約束,有語法的約束、有平臺和類庫的約束、有運(yùn)行環(huán)境大小的約束、有性能的約束、有成本的約束、有人的技能的約束。

      每個人、每個公司、每個項目有自身的約束條件。還是以我自己為例子(宅男沒別的例子——這也是我的約束條件),我選擇多語言的目的有二:

      (1) 出于綜合成本考慮。比如前面的我的多語言開發(fā)的例子;

      (2) 出于閱讀代碼的考慮。世界上有很多知識,有的用C實現(xiàn)了,有的用Python實現(xiàn)了,有的用Java實現(xiàn)了,會多種語言的話,方便掌握這些知識(很多時候,這些知識并沒有很好的文檔,只有閱讀源代碼才能最準(zhǔn)確的了解它)。

      而企業(yè)選擇多語言的目的,除了技術(shù)約束之外,恐怕主要是考慮到成本吧。

      Btw. 約束條件是一個非常重要的概念,任何推斷都是有約束條件的。某書第五章的約束條件我認(rèn)為有二:

      (1) 語言是廣義的語言(我文章第一段的定義B)

      (2) 主要讀者是大眾程序員

      關(guān)于約束條件,再講些題外話。很多人認(rèn)為茅于軾是人民公敵,認(rèn)為任志強(qiáng)是人民公敵,實際上,如果你認(rèn)真閱讀了茅于軾的主要文章,閱讀了任志強(qiáng)的大部分博客,了解了他們觀點的“背景”,也即他們觀點的“約束條件”,你就不會這樣認(rèn)為了。寫這段話的目的是不希望我們成為吃袁崇煥肉的人。

      有一篇非常著名的管理學(xué)文章《論希望B卻獎勵A(yù)的愚蠢》(《管理與組織行為經(jīng)典文選》書中有這篇)。這篇文章指出了一個普遍現(xiàn)象:很多情況下,我們希望達(dá)到目的B,為了達(dá)到這個目的,我們制定了游戲規(guī)則,而這個游戲規(guī)則運(yùn)行的最終結(jié)果(有意或無意的)卻是獎勵了與B相違背的行為A。

      這種現(xiàn)象有時很復(fù)雜。下面是在網(wǎng)上搜到的一個例子:

      美國某會想在飛機(jī)上為嬰兒單開一些嬰兒座,以減少飛機(jī)失事后這些嬰兒的死亡率。但是研究后發(fā)現(xiàn),當(dāng)開嬰兒座后因為票價的上升會導(dǎo)致許多航空公司的乘客轉(zhuǎn)而去坐火車或其他交通工具,而火車和其他交通工具的出事死亡率比飛機(jī)乘客要高,計算結(jié)果是“當(dāng)每拯救一個因飛機(jī)失事而死亡的嬰兒的同時,將有3.5個乘客因換乘其他交通工具而死亡。”

       

      分享:揭秘.Net中的委托
      我本來以為委托很簡單,本來只想簡簡單單的說說委托背后的東西,委托的使用方法。原本只想解釋一下那句:委托是面向?qū)ο蟮摹㈩愋桶踩暮瘮?shù)指針。可沒想到最后惹出一堆的事情來,越惹越多,罪過,罪過。本文后面一部分是我在一邊用SOS探索一邊記錄的,寫的非

      來源:模板無憂//所屬分類:.Net教程/更新時間:2009-11-15
      相關(guān).Net教程