解讀多語言開發的個人體驗_.Net教程
推薦:解析ASP.NET Routing對請求的處理方式原本這是《關于ASP.NET Routing的幾點內容》一文中的一節,不過等寫完這節之后發現這塊內容已經比較完整了,而且它本身也是獨立和最為常見的部分,因此我把它提取出來單獨成文。至于那片文章的其他部分我會再修改一下,明天發布。希望這些內容會對您理解ASP.
在文章的前面,先定義一下,這里談的“語言”(A)指的是“語言以及使用該語言可以很容易調用的基本類庫及可免費或低代價獲得的第三方類庫及開源類庫”(B)。在很多情況下談“語言”和談“語言”的選擇時的語境,都是指的B。選擇多語言混合開發的一個目的是為了使用其中某個語言的某個類庫或重要特性。比如,在OpenCV中,計算量不大的部分使用了很多的C++的STL中的數據結構和算法,而不是自己用C去實現一份。
我最近在研究Sift算子。一份C#寫的Sift代碼處理一張600×600的圖像的處理時間大概在一分鐘上下,而一份用C寫的Sift代碼可以秒掉這樣的圖像,所以我不得不使用C+C#的混合編程:在應用層使用C#,在底層使用C。為了方便的使用C#調用C,又不得不用上C++/CLI。我最后選擇的工作模式是這樣的:使用C#進行應用算法開發、原型開發和演示(Winform/Silverlight),使用C/C++進行最終產品開發(使用C#驗證過的算法)。原型開發可以在Windows上進行,而最終的代碼卻不一定在Windows下跑。為了降低從原型到產品的代碼翻譯的成本,我必須保證原型開發的核心類和產品開發的核心類盡量類似。為此,我又引入了純C++層,形成了下面的語言層次:

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

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