又看到語言之爭,各種吐嘈,唉…… 說說我的看法,我覺得一門程式設計語言用到極致就行了,何必糾結文法層面的差異?
因為曆史原因,我用.NET比較多,當然Windows編程、Java編程、Linux/Unix編程、C/C++編程、Python,JavaScript等動態語言甚至是彙編編程我也粗有研究,也測試過一門動態程式設計語言Python。刨去Visual Studio昂貴的費用(我一開始用的是盜版,當然現在因為Bizspark的關係終於用上正版了……),說實話我還是比較喜歡C#的,做項目的時候,我這個人沒什麼節操,什麼語言來錢快用什麼語言。
那怎麼個來錢快呢?
1. 學習成本比較低,在編程時碰到不會用的函數我一般都是點點點,在下拉框裡找。不知道我是人笨還是怎麼回事,反正我每次寫Python,JavaScript、PHP這些程式的時候,每次都得Google,比如啥“Open a database in python”,“Javascript substring”啦之類的。
也許你會說不是有Eclipse嗎?Eclipse的確是一個很偉大的編輯器,但就一點不好,這個慢啊!每次開啟工程,就會讓我有種天黑下來的感覺。特別是掛上一些外掛程式,特別是Maven的外掛程式,Oh My Lady Gaga,隨便開啟一個開源工程就在那更新什麼Index,暈死,其實我就是想小小的編譯一下代碼看看效果,然後就看到命令列一陣陣的輸出下載什麼不知所云的包檔案,Maven果如其名,像我這種非Java內行,總是要從這個天黑等到那個天黑才能編譯完一個小程式。
2. 編譯方面,這方面我對C/C++最大的抱怨就是,現在記憶體都已G計算了,怎麼還是在用KB記憶體時代的單檔案編譯再連結的方式編譯器?隨便寫個程式就是各種-I,-L,-l選項,更讓人抓狂還有C++ mangling這東東,不僅不同編譯器的mangling方式不一樣,這個編譯器不能連結那個編譯器產生的庫檔案也就罷了!同一個編譯器不同版本Mangling也有問題,我04年改squid的源碼,加一個代理計費的功能,資料庫用的是Oracle,為了方便用C++和OCCI寫計費程式,我靠,同樣是Oracle的OCCI庫,我在Mandrake(這個版本的Linux稍微新一點的IT人估計都沒聽說過)竟然無法連結OCCI庫,就是因為Oracle發布OCCI時是在Redhat等GCC 3上編譯的,而我的系統是GCC 4?!為了避免格盤裝Redhat(我那個時候的機器是512M記憶體的賽揚機,雖然早就開始玩VMware,但那個配置跑虛擬機器基本上等於自殺,而Mandrake那時的介面的確比Redhat好看好多,什麼WindowMaker, Enlightenment之類的視窗管理器真的會讓你有種駭客的感覺),於是我就用OCI實現了最小集合的OCCI的介面,才搞定這個事情。
更不要提什麼autoconf, automake, make之類各種詭異的文法了,還有gdb全命令列的調試介面,哦,對了,如果有興趣,建議你玩玩emacs裡啟動gdb、jdb之流體驗一下偽所見即所得 (WYSIWYG)的源碼級調試支援。
3. 編輯器支援,這一點我對Python抱怨非常大,前些天我自己給svn寫的python外掛程式出了點小問題,那我得調試修複代碼呀!各種print那就不說了,更要命的是,原來的python程式是在emacs下寫的,為了圖快就用Visual Studio編輯,結果Visual Studio裡的Tab鍵代表的空格數有那麼一點點的小差別,解譯器也不告訴你是哪一行,就說了一個什麼“Indention miss match”就退出了。最後還是在記事本裡編輯才解決這個問題,12345678(個空格),一行行地修複。本來我費了些功夫才在自己設計的程式設計語言裡加上縮排支援的,經過這一鬧騰徹底把那些代碼刪了。
這方面,Object-C我就不想說什麼了,xcode啟動並執行好端端的,突然就不見了……大概是因為我在PC上用虛擬機器跑Mac OS X引起的吧。
4. 調試支援,這也是為什麼我喜歡用C#、.NET的原因,各種調試支援,什麼跟進到資料庫的預存程序,遠端偵錯,跟進遠程DCOM RPC介面,記憶體驗屍分析,C#和C++的混合調試啦,在生產伺服器調試時自動幫你從源碼伺服器上下載正確版本的源碼啦。Python、PHP等動態語言我不知道各位是怎麼調試的,對我這種不常用的人來說,就是各種print…… 如果不是後面瀏覽器裡整合了JavaScript調試支援,以前也是各種window.alert – 邦邦邦邦,object undefined - 。
Java其實對調試的支援做的也還可以,JDK裡也有不少的工具,比如jstack, jhat之類的,jhat的OQL的思想的確不錯!只不過很可惜,如果是在生產伺服器上用,找源碼有時還是蠻費勁的。當然如果機器配置差點,大白天也會看到日食的。
5. 可配置性,這裡我恨透了所有以XML做設定檔的程式,只要是配置錯那麼一點點就罷工,這也就罷了,象tomcat竟然還有好幾個xml設定檔,什麼context.xml,server.xml,web.xml。象我這樣性急的人,有時就是想部署一個簡單的網站而已,結果就是各種less catalina.xxxx.log,Google “How to deploy a servlet in tomcat”。好容易部署成功吧,運行一下又掛了,less一下:
Org.Hibernate.XXXException……
只好用eclipse attach tomcat進程上去看看……
6. 類庫支援,什麼gem、pear之類的,我就不明白為什麼rubygems這種看起來跟紅寶石、葡萄酒一樣的單詞怎麼就會變成禁用語?
在Ubuntu上裝個PHPUnit都費勁,就僅僅是因為PHPUnit需要用最新的pear安裝,然後我用pear自己給自己升級就不知道怎麼的裝到home目錄裡了?結果是不停地cp –r ~/pear/XXXX /usr/share/pear/XXXX
7. 編寫GUI程式的便利性,當然C++有QT,WTL, MFC,Python有pygtk,Java有swing之類的東東,但我實在不想就為了在視窗上放個按鈕控制項,註冊一個點擊事件,一會用boost::function之類的玩意封裝個回呼函數,一會寫個什麼new IXXXX() { void Click(); }神馬的匿名類。
拖拖拉拉,這點點那點點多好?
我上面抱怨了這麼多,各位編程大牛肯定覺得是我太菜,不懂就別瞎說。
別的語言我就不多說了,我覺得其實一個程式沒有必要非要用一門程式設計語言寫,哪個合適就用哪個好了,比如去年我用C#給網遊寫些輔助,除了訪問記憶體、調用函數用些C++和彙編外(其實都可以用C#寫,但是不想P/Invoke麻煩),在進程裡注入個.NET虛擬機器也不覺得有什麼不方便的地方,而且從裡面開一個remoting服務,避免了很多寫前台管理程式的各種煩。
那我最近寫個C#程式,有幾個Java的庫沒心思找替換的庫,用ikvm好像也沒什麼大問題,而且在Linux用mono跑這個程式也沒有問題哦。
至於在一些規則系統裡,需要運行python、ruby、javascript等動態指令碼寫的規則定義時,無非就是用DLR解釋運行一下好了。
至於調用COM組件,在IE裡把.NET程式當作ActiveX控制項,與Win32/COM互操作,我覺得COM Interop在這方面做得已經很好了。
再不濟,如果是分布式環境,大不了就用Ioc和SOA整合一下其他語言寫的系統好了,為什麼非要糾結於一兩門程式設計語言文法上的優劣呢?
不好意思,函數語言還沒研究過,就不提它們了。