2014年四大熱門語(yǔ)言的最佳實(shí)踐
原創(chuàng)在過(guò)去的一兩年里編程領(lǐng)域迎來(lái)了翻天覆地的變化,如果說(shuō)C,JAVA這些在過(guò)去幾年里風(fēng)靡全球,搶占Tiobe榜單,那么在如今移動(dòng)領(lǐng)域興起的年代 ,objetive-C也給Java造成很大的沖擊。在編程領(lǐng)域沒(méi)有“一招鮮,吃遍天”的說(shuō)法。對(duì)于開發(fā)者們來(lái)說(shuō)總是在不同的領(lǐng)域里尋找著合適的***語(yǔ)言。
那么反過(guò)來(lái)說(shuō),每種編程語(yǔ)言在不同的場(chǎng)景里,開發(fā)效率和執(zhí)行效率都是有著天壤之別,比如說(shuō)erlang適用于并行,PHP適用于WEB,R適用于統(tǒng)計(jì),C#適用于界面等等,所以術(shù)業(yè)有專攻,一個(gè)優(yōu)秀的程序員不在乎languages千千萬(wàn),更關(guān)注的是編程技術(shù)發(fā)展的指向的領(lǐng)域。
所以本文我們來(lái)分析一下目前在各個(gè)領(lǐng)域比較流行的四大編程語(yǔ)言,在不同領(lǐng)域和不同場(chǎng)景里面的***實(shí)踐。
LUA
結(jié)合Cocos2dx游戲開發(fā)
自從Cocos2d-x團(tuán)隊(duì)大力支持Lua的綁定后,備受移動(dòng)開發(fā)者的關(guān)注。在游戲開發(fā)中涉及到的用戶界面交互,場(chǎng)景管理以及角色邏輯等等完全可以使用Lua完成。實(shí)際應(yīng)用上,與Corona SDK這樣100%使用Lua進(jìn)行開發(fā)的游戲引擎相比,cocos2d-x+Lua不但有著明顯的性能優(yōu)勢(shì),更是在擴(kuò)展能力上也不受到任何限制。
在腳本語(yǔ)言的領(lǐng)域里,js則更是個(gè)強(qiáng)大的對(duì)手,很多人也會(huì)去選擇Cocos2d-x+js。那么相比之下,Cocos2d-x+Lua到底有如何的優(yōu)勢(shì)呢?編者摘自知乎上面 廖宇雷 游戲開發(fā)者的精彩回答:
1. 運(yùn)行效率:Lua 的性能在各種測(cè)試?yán)锉菾avaScript快不少。而移動(dòng)設(shè)備上存在不支持JIT 的情況(未越獄的 iOS 設(shè)備),Lua對(duì)比JavaScript的性能優(yōu)勢(shì)就更明顯。
2. 安全性:現(xiàn)在 cocos2d-x使用LuaJIT來(lái)執(zhí)行Lua,所以可以把Lua代碼編譯為字節(jié)碼再打包到游戲里。由于LuaJIT的字節(jié)碼是高度優(yōu)化過(guò)的,所以目前還沒(méi)有反編譯工具。而JS雖然也可以用字節(jié)碼,但從目前的情況看還達(dá)不到LuaJIT的安全性。
3. 與C/C++的交互:Lua 原本就是作為嵌入式語(yǔ)言來(lái)設(shè)計(jì)的,所以天然和C/C++很容易交互。JS這方面是個(gè)劣勢(shì)。
4. 與 Java/Objective-C 的交互:不管是 quick-cocos2d-x 里提供的 luaoc/luaj 模塊,還是 wax, luajava 這些開源項(xiàng)目,都讓我們可以繞過(guò) C/C++ 層實(shí)現(xiàn) Lua 和 Java/Objc 的交互。這個(gè)優(yōu)勢(shì)在游戲發(fā)行階段,集成各種第三方SDK時(shí)絕對(duì)會(huì)節(jié)約巨量時(shí)間!
當(dāng)然,cocos2d-x 目前明顯是在主推JS的解決方案,因?yàn)镴S可以跨越移動(dòng)設(shè)備、桌面的界限,實(shí)現(xiàn)一套程序跑任意平臺(tái)。不過(guò)個(gè)人認(rèn)為以當(dāng)前 HTML5 的發(fā)展情況,對(duì)于要強(qiáng)調(diào)體驗(yàn)的游戲來(lái)說(shuō),HTML5 還要一些時(shí)間。
所以,從目前的市場(chǎng)情況來(lái)說(shuō),Lua 明顯是更理性的選擇:成熟、安全性高、眾多大作采用。
Python
Web后端、服務(wù)器開發(fā)
python被稱作為膠水語(yǔ)言,可以通過(guò)編譯的C語(yǔ)言程序來(lái)擴(kuò)展,能夠完成現(xiàn)實(shí)中的各種任務(wù),包括開發(fā)者們?nèi)諒?fù)一日所做的事情。作為編制其他組件、實(shí)現(xiàn)獨(dú)立程序的工具,它通常應(yīng)用于各種領(lǐng)域。實(shí)際上,作為一種通用語(yǔ)言,Python的應(yīng)用角色幾乎是無(wú)限的:你可以在任何場(chǎng)合應(yīng)用Python, 從網(wǎng)站和游戲開發(fā)到機(jī)器人和航天飛機(jī)控制。
而能夠讓大多的開發(fā)者喜歡的是Python代碼的可讀性。清晰明了而簡(jiǎn)單的編碼可以減少編程時(shí)間。無(wú)論是面向?qū)ο?、命令式和函?shù)式的應(yīng)用,以及自動(dòng)內(nèi)存管理都是Python的特色。
在IT領(lǐng)域更多開發(fā)者更喜歡用它來(lái)做為WEB開發(fā),并被列入LAMP (Linux, Apache, MySQL 以及Python/Perl/PHP)中,***動(dòng)態(tài)語(yǔ)言。相比PHP,在知乎上一位匿名用戶就認(rèn)為Python可以非常自然的擴(kuò)展到隊(duì)列(RabbitMQ)、后臺(tái)處理系統(tǒng)(基于 Celery)、數(shù)據(jù)挖掘(SciPy、NumPy)、文本處理(NLTK)、系統(tǒng)部署(Fabric)、監(jiān)控(Supervisord)等所有方面,而PHP只能做網(wǎng)頁(yè)前臺(tái)。
所以,根據(jù)Python在Web的一些優(yōu)勢(shì),總結(jié)一下幾點(diǎn):
1. Python的代碼風(fēng)格簡(jiǎn)潔易懂易于維護(hù),包括語(yǔ)法優(yōu)勢(shì)不用寫大括號(hào),代碼注釋風(fēng)格統(tǒng)一,強(qiáng)調(diào)做一個(gè)事情只有一種方法
2. 有著豐富的Web開源框架,主流的包括Web2py,Web.py,Zope2,Pyramid,Django等。
3. 跨平臺(tái)能力,支持Mac,Linux,Windows等。
4. Python可用庫(kù)和模塊比較多,非常方便。
5. Python應(yīng)用領(lǐng)域比較廣泛,可用后端,服務(wù)器,Web應(yīng)用程序等開發(fā)。
6. Python社區(qū)非常活躍,在社區(qū)里面能夠找到一切你所需要的答案,也得到很多大牛的極力推廣。
R語(yǔ)言
統(tǒng)計(jì)分析***,沒(méi)有之一
對(duì)于R語(yǔ)言來(lái)說(shuō)一直在小眾領(lǐng)域成長(zhǎng)著,早年主要用來(lái)做統(tǒng)計(jì)計(jì)算。隨著時(shí)代的進(jìn)步,在如今大數(shù)據(jù)爆發(fā)的年代,R終于在這一波浪潮中,越來(lái)越多的工程加入到這個(gè)圈子里來(lái),對(duì)R計(jì)算引擎,R的性能,R的各種程序包進(jìn)行改進(jìn)和升級(jí),讓R獲得了新生。不但可以給Hadoop注入統(tǒng)計(jì)的血脈,連Oracle都擴(kuò)大對(duì)R語(yǔ)言的分析支持。
在知乎上chenkai的用戶就針對(duì)R語(yǔ)言統(tǒng)計(jì)分析進(jìn)行了很好的解釋:
R語(yǔ)言主要是用于統(tǒng)計(jì)分析、繪圖的語(yǔ)言。其實(shí)對(duì)于一直以商業(yè)為驅(qū)動(dòng),原則金融行業(yè)來(lái)說(shuō)從來(lái)都不缺乏實(shí)用的工具,而且據(jù)我了解有專門公司在這方面產(chǎn)品,也是相當(dāng)之成熟。所以我的看法是對(duì)于那些固定常見(jiàn)的業(yè)務(wù)并不缺乏實(shí)用成熟的工具,因?yàn)槭袌?chǎng)就是一抓一大把。
就我的理解而言R這門也可以用來(lái)探索 分析現(xiàn)有數(shù)據(jù)并高效的成圖,讓大數(shù)據(jù)圖形化,用于統(tǒng)計(jì)計(jì)算和統(tǒng)計(jì)制圖。 但前提是如果已經(jīng)其他軟件做了這件事 為何還要自己手動(dòng)Coding呢? 所以是對(duì)于常規(guī)業(yè)務(wù)是不需要 因?yàn)橛熊浖隽藳r且做的還很好,如果你是精算師 或是 某個(gè)特定市場(chǎng)前景根據(jù)數(shù)據(jù)分析預(yù)測(cè),這個(gè)時(shí)候可能就需要R語(yǔ)言的幫助了,而使用好R必然有兩個(gè)前提。
A: R語(yǔ)言分析需要有數(shù)據(jù)來(lái)源?
B: 如何快速熟練使用好R?
所以綜上,
觀點(diǎn)很簡(jiǎn)單對(duì)于常規(guī)業(yè)務(wù)真的沒(méi)有必要大材小用。常規(guī)的軟件已經(jīng)足夠好用,如果你有足夠的時(shí)間學(xué)習(xí)Coding,也覺(jué)得通過(guò)自己編寫數(shù)據(jù)模型分析預(yù)測(cè) 自己假設(shè)。這確實(shí)是一件很Cool的事情,但使用前提是需要解決我上面提到兩個(gè)問(wèn)題,如果你想做的很好還需要你相當(dāng)?shù)哪托膶W(xué)好R自身。
其實(shí)R語(yǔ)言實(shí)際意義是規(guī)避了像那些商業(yè)軟件內(nèi)部代碼不公開一樣,運(yùn)算和分析規(guī)則只有內(nèi)部人知道,而普通用戶和分析師不知情。而R的目的則是在有數(shù)據(jù)的前提下可以自由的計(jì)算任何想計(jì)算的統(tǒng)計(jì)量或圖形,其實(shí)它也避免了固定的商業(yè)分析中存在一些問(wèn)題,無(wú)法得到取截尾均值作為統(tǒng)計(jì)向量,能夠很好規(guī)避統(tǒng)計(jì)分析方法不清的問(wèn)題。
Node.js
網(wǎng)站前后端開發(fā)
Node.js經(jīng)過(guò)了幾年的發(fā)展已經(jīng)日趨成熟。在如今很多大型的高流量網(wǎng)站基本都采用了Node.js開發(fā),像cnodejs的社區(qū),雪球網(wǎng),PayPal等。在知乎上 楊捷就詳細(xì)的解讀了Node.js在Web開發(fā)的一些場(chǎng)景應(yīng)用。
首先,node新開一個(gè)http連接的開銷,相當(dāng)于一個(gè)大函數(shù)調(diào)用,相比php的新開線程動(dòng)輒花費(fèi)2MB內(nèi)存和上下文切換的漫長(zhǎng)時(shí)間,已經(jīng)很小很小了。所以,node天生就是為高并發(fā)的應(yīng)用而誕生,在設(shè)計(jì)之初就承載著巨大的使命。而這種極度追求代碼效率和美感的設(shè)計(jì),是以提升學(xué)習(xí)理解的難度,和考驗(yàn)編程能力為代價(jià)。如果你像我一樣,有代碼潔癖,追求***,那么node將是不二選擇。如果你僅僅是為了完成工作,或者快速搭建項(xiàng)目上線運(yùn)營(yíng),那么還是用php或其它什么看似方便卻一點(diǎn)也不“美”的語(yǔ)言吧。
再者,由于js的異步特征,始終有用戶代碼在執(zhí)行,省去了等待查詢數(shù)據(jù)庫(kù)和文件系統(tǒng)的時(shí)間,相比CPU的時(shí)鐘頻率,去讀一次數(shù)據(jù)庫(kù)太久太久,久到讓CPU等得花兒都謝了。node讓CPU不在等待,node讓媽媽不用擔(dān)心我的內(nèi)存。但是這種高效運(yùn)用CPU的異步回調(diào),將會(huì)帶來(lái)邏輯上的混亂,一不小心就會(huì)一團(tuán)亂麻理都理不清,下文有敘。
以上兩點(diǎn),導(dǎo)致node適合在具有大量細(xì)小的http請(qǐng)求環(huán)境下工作,典型的就是一個(gè)web即時(shí)聊天程序,或者一個(gè)支撐上萬(wàn)人同時(shí)在線的游戲服務(wù)器。你甚至不用考慮http請(qǐng)求數(shù)太多的問(wèn)題。
如果用node開發(fā)網(wǎng)站,你可以把數(shù)據(jù)請(qǐng)求分的很細(xì),也就是說(shuō)不必像php那樣把所有數(shù)據(jù)一次性加載到客戶端,而是加載一部分,讓瀏覽器渲染頁(yè)面的同時(shí),再去加載另一部分。Facebook的頁(yè)面優(yōu)化技術(shù),就是這種分塊加載的模式。可以讓頁(yè)面的加載速度在用戶體驗(yàn)上提升5到10倍。
node無(wú)論從代碼執(zhí)行速度,還是開銷,都是最***的選擇。但是缺點(diǎn)在于js異步特征的難以理解和控制,如果沒(méi)有相當(dāng)過(guò)硬的js開發(fā)經(jīng)驗(yàn)和特征理解,項(xiàng)目稍微大一點(diǎn),代碼結(jié)構(gòu)就會(huì)一片混亂。node是在考驗(yàn)一個(gè)人的代碼設(shè)計(jì)和掌控能力,如同九陰真經(jīng),練的好就一身絕學(xué)獨(dú)霸武林,練的不好就走火入魔精神崩潰。動(dòng)不動(dòng)就長(zhǎng)達(dá)8層的回調(diào)嵌套,可不是鬧著玩的。除了采用step同步方案解決控制流倒置和深層回調(diào)嵌套問(wèn)題,把數(shù)據(jù)請(qǐng)求分得很細(xì),再分多次加載,不僅在代碼流程上更美觀,也更符合node的特性。
有人說(shuō),異步代碼是反人類的。其實(shí)同步執(zhí)行才是反人類。想象一下,你需要打印一疊材料:打印機(jī)開始工作后,你站在那里等著,5分鐘后打印完畢,你取走材料回到辦公室。這似乎沒(méi)什么。但是如果有100份需要打???10000份呢?你也站在那里干等著?還是趁這個(gè)時(shí)間喝杯咖啡,或者多寫幾個(gè)if else 吧。