解讀多語(yǔ)言開發(fā)的個(gè)人體驗(yàn)_.Net教程
推薦:解析ASP.NET Routing對(duì)請(qǐng)求的處理方式原本這是《關(guān)于ASP.NET Routing的幾點(diǎn)內(nèi)容》一文中的一節(jié),不過(guò)等寫完這節(jié)之后發(fā)現(xiàn)這塊內(nèi)容已經(jīng)比較完整了,而且它本身也是獨(dú)立和最為常見的部分,因此我把它提取出來(lái)單獨(dú)成文。至于那片文章的其他部分我會(huì)再修改一下,明天發(fā)布。希望這些內(nèi)容會(huì)對(duì)您理解ASP.
在文章的前面,先定義一下,這里談的“語(yǔ)言”(A)指的是“語(yǔ)言以及使用該語(yǔ)言可以很容易調(diào)用的基本類庫(kù)及可免費(fèi)或低代價(jià)獲得的第三方類庫(kù)及開源類庫(kù)”(B)。在很多情況下談“語(yǔ)言”和談“語(yǔ)言”的選擇時(shí)的語(yǔ)境,都是指的B。選擇多語(yǔ)言混合開發(fā)的一個(gè)目的是為了使用其中某個(gè)語(yǔ)言的某個(gè)類庫(kù)或重要特性。比如,在OpenCV中,計(jì)算量不大的部分使用了很多的C++的STL中的數(shù)據(jù)結(jié)構(gòu)和算法,而不是自己用C去實(shí)現(xiàn)一份。
我最近在研究Sift算子。一份C#寫的Sift代碼處理一張600×600的圖像的處理時(shí)間大概在一分鐘上下,而一份用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#驗(yàn)證過(guò)的算法)。原型開發(fā)可以在Windows上進(jìn)行,而最終的代碼卻不一定在Windows下跑。為了降低從原型到產(chǎn)品的代碼翻譯的成本,我必須保證原型開發(fā)的核心類和產(chǎn)品開發(fā)的核心類盡量類似。為此,我又引入了純C++層,形成了下面的語(yǔ)言層次:

各層的作用:
1、C/C++層以C為主。有3個(gè)原因:
(1)可移植性。畢竟C#需要CLR,沒CLR的地方,都沒法用。
(2)性能和內(nèi)存可控
(3)絕大部分核心算法都有C/C++版
2、純C++層。C/C++層的API基本都是C風(fēng)格的,難用,因此,需要封裝成對(duì)象。我把底層封裝成了一個(gè)大對(duì)象 SmartImage。用純C++封裝而不用C++/CLI封裝是因?yàn)榧僀++不需要復(fù)雜的運(yùn)行時(shí)環(huán)境。
3、C++/CLI層。C++相對(duì)于C來(lái)說(shuō),好用多了,但相對(duì)于C#來(lái)說(shuō),則又難用多了。而很多圖像處理項(xiàng)目,大部分工作量是算法參數(shù)選擇、組合和驗(yàn)證,因此,有必要再度封裝一下,方便上層調(diào)用。C++/CLI和純C++層幾乎是一對(duì)一的映射。
4、應(yīng)用層。通過(guò)上面三層的工作,就可以使用優(yōu)雅的C#來(lái)進(jìn)行日常工作了。我是宅男,怎么演示Demo、演示案例、演示進(jìn)度呢?一個(gè)很好的選擇是使用Silverlight,調(diào)用C#寫的WebService,然后再調(diào)用底層。怎樣進(jìn)行日常開發(fā)呢,下面是俺用Winform寫的一個(gè)實(shí)驗(yàn)平臺(tái):

在幾年前,我也是用過(guò)一次多語(yǔ)言開發(fā),那次是C++ / TCL 混合開發(fā)——底層語(yǔ)言+膠水語(yǔ)言的開發(fā)模式。非常多的項(xiàng)目采用的是這種開發(fā)模式。游戲界多采用這種開發(fā)模式。Matlab也是這樣一種模式。
這種開發(fā)模式存在兩個(gè)好處:
(1) 可以綜合底層語(yǔ)言的性能和膠水語(yǔ)言的強(qiáng)大生產(chǎn)力,損失小部分性能,來(lái)?yè)Q取強(qiáng)大的生產(chǎn)力和更好的產(chǎn)品質(zhì)量。
(2) 膠水語(yǔ)言可以隱藏復(fù)雜的細(xì)節(jié)問(wèn)題,提供更友好的使用方式,從而擴(kuò)大產(chǎn)品的使用面。
某書第五章所提的多語(yǔ)言開發(fā),它舉的例子,大多屬于此類,這些例子我個(gè)人認(rèn)為是合適的(那個(gè)測(cè)試的例子除外,因?yàn)槲也欢馅w說(shuō)的AAA,就跳過(guò)去沒看)。很多情況下,出于綜合考慮,人們并不是去擴(kuò)充類庫(kù),而是直接選擇其它語(yǔ)言了。
另一種很自然的多語(yǔ)言開發(fā)就是Web開發(fā)了,前臺(tái)Html/Js,后臺(tái)某語(yǔ)言,這種多語(yǔ)言開發(fā)太普遍了,以至于我們不把它當(dāng)作多語(yǔ)言開發(fā)了。從這種多語(yǔ)言混合開發(fā)的場(chǎng)景可以看出,不同的語(yǔ)言除了語(yǔ)法之外,還有許多更重要的約束條件。比如,安裝基礎(chǔ)。用C#開發(fā)共享軟件,一個(gè)局限就是目前的安裝基礎(chǔ)不夠。Silverlight的安裝基礎(chǔ)也不夠。Html/Js的安裝基礎(chǔ)非常大。再比如,運(yùn)行環(huán)境的大小——lua的運(yùn)行環(huán)境所需文件大小要遠(yuǎn)小于python——對(duì)于我這種不會(huì)Delphi,討厭匈牙利命名法,討厭Windows API,討厭MFC的人,想要在Windows下開發(fā)只有一兩兆的軟件,lua恰好可用——D不成熟,Python太大。
再一種多語(yǔ)言開發(fā)的場(chǎng)景是集成舊系統(tǒng),這個(gè)就不多說(shuō)了。
多語(yǔ)言開發(fā)一般來(lái)說(shuō)就是人們?cè)诠こ碳s束的情況下所做的最優(yōu)選擇的結(jié)果。這種約束,有語(yǔ)法的約束、有平臺(tái)和類庫(kù)的約束、有運(yùn)行環(huán)境大小的約束、有性能的約束、有成本的約束、有人的技能的約束。
每個(gè)人、每個(gè)公司、每個(gè)項(xiàng)目有自身的約束條件。還是以我自己為例子(宅男沒別的例子——這也是我的約束條件),我選擇多語(yǔ)言的目的有二:
(1) 出于綜合成本考慮。比如前面的我的多語(yǔ)言開發(fā)的例子;
(2) 出于閱讀代碼的考慮。世界上有很多知識(shí),有的用C實(shí)現(xiàn)了,有的用Python實(shí)現(xiàn)了,有的用Java實(shí)現(xiàn)了,會(huì)多種語(yǔ)言的話,方便掌握這些知識(shí)(很多時(shí)候,這些知識(shí)并沒有很好的文檔,只有閱讀源代碼才能最準(zhǔn)確的了解它)。
而企業(yè)選擇多語(yǔ)言的目的,除了技術(shù)約束之外,恐怕主要是考慮到成本吧。
Btw. 約束條件是一個(gè)非常重要的概念,任何推斷都是有約束條件的。某書第五章的約束條件我認(rèn)為有二:
(1) 語(yǔ)言是廣義的語(yǔ)言(我文章第一段的定義B)
(2) 主要讀者是大眾程序員
關(guān)于約束條件,再講些題外話。很多人認(rèn)為茅于軾是人民公敵,認(rèn)為任志強(qiáng)是人民公敵,實(shí)際上,如果你認(rèn)真閱讀了茅于軾的主要文章,閱讀了任志強(qiáng)的大部分博客,了解了他們觀點(diǎn)的“背景”,也即他們觀點(diǎn)的“約束條件”,你就不會(huì)這樣認(rèn)為了。寫這段話的目的是不希望我們成為吃袁崇煥肉的人。
有一篇非常著名的管理學(xué)文章《論希望B卻獎(jiǎng)勵(lì)A(yù)的愚蠢》(《管理與組織行為經(jīng)典文選》書中有這篇)。這篇文章指出了一個(gè)普遍現(xiàn)象:很多情況下,我們希望達(dá)到目的B,為了達(dá)到這個(gè)目的,我們制定了游戲規(guī)則,而這個(gè)游戲規(guī)則運(yùn)行的最終結(jié)果(有意或無(wú)意的)卻是獎(jiǎng)勵(lì)了與B相違背的行為A。
這種現(xiàn)象有時(shí)很復(fù)雜。下面是在網(wǎng)上搜到的一個(gè)例子:
美國(guó)某會(huì)想在飛機(jī)上為嬰兒?jiǎn)伍_一些嬰兒座,以減少飛機(jī)失事后這些嬰兒的死亡率。但是研究后發(fā)現(xiàn),當(dāng)開嬰兒座后因?yàn)槠眱r(jià)的上升會(huì)導(dǎo)致許多航空公司的乘客轉(zhuǎn)而去坐火車或其他交通工具,而火車和其他交通工具的出事死亡率比飛機(jī)乘客要高,計(jì)算結(jié)果是“當(dāng)每拯救一個(gè)因飛機(jī)失事而死亡的嬰兒的同時(shí),將有3.5個(gè)乘客因換乘其他交通工具而死亡。”
分享:揭秘.Net中的委托我本來(lái)以為委托很簡(jiǎn)單,本來(lái)只想簡(jiǎn)簡(jiǎn)單單的說(shuō)說(shuō)委托背后的東西,委托的使用方法。原本只想解釋一下那句:委托是面向?qū)ο蟮�、類型安全的函�?shù)指針�?蓻]想到最后惹出一堆的事情來(lái),越惹越多,罪過(guò),罪過(guò)。本文后面一部分是我在一邊用SOS探索一邊記錄的,寫的非
- asp.net如何得到GRIDVIEW中某行某列值的方法
- .net SMTP發(fā)送Email實(shí)例(可帶附件)
- js實(shí)現(xiàn)廣告漂浮效果的小例子
- asp.net Repeater 數(shù)據(jù)綁定的具體實(shí)現(xiàn)
- Asp.Net 無(wú)刷新文件上傳并顯示進(jìn)度條的實(shí)現(xiàn)方法及思路
- Asp.net獲取客戶端IP常見代碼存在的偽造IP問(wèn)題探討
- VS2010 水晶報(bào)表的使用方法
- ASP.NET中操作SQL數(shù)據(jù)庫(kù)(連接字符串的配置及獲取)
- asp.net頁(yè)面?zhèn)髦禍y(cè)試實(shí)例代碼
- DataGridView - DataGridViewCheckBoxCell的使用介紹
- asp.net中javascript的引用(直接引入和間接引入)
- 三層+存儲(chǔ)過(guò)程實(shí)現(xiàn)分頁(yè)示例代碼
.Net教程Rss訂閱編程教程搜索
.Net教程推薦
- 用Xaml做網(wǎng)頁(yè)框架
- 淺析vc.net中配置OpenOffice的SDK應(yīng)用開發(fā)
- 判斷WebBrowser瀏覽器網(wǎng)頁(yè)加載完成的處理方法
- CheckBoxList兩列并排編譯為表格顯示具體實(shí)現(xiàn)
- .net開發(fā)投票機(jī)的思路
- 如何在.Net Micro Framework中顯示漢字
- asp.net中Word轉(zhuǎn)Html的辦法(不需要WORD組件)
- ASP.NET web.config中數(shù)據(jù)庫(kù)連接字符串connectionStrings節(jié)的配置方法
- asp.net/c#字符格式化
- 解析GridView中嵌套DropDownList的實(shí)現(xiàn)
- 相關(guān)鏈接:
- 教程說(shuō)明:
.Net教程-解讀多語(yǔ)言開發(fā)的個(gè)人體驗(yàn)
。