上帝的玩偶:haXe语言
在動畫片《我叫MT》中,有個“五火球神教”,五火球神教的口號是“征服世界”。在小說《風姿物語》中瘋狂的白家的某代家主白拉登,他手中的扇子上寫著“世界征服”四個大字。
?
?
瘋狂!只能用瘋狂來形容。少年們,下面請看一群瘋狂的黑客為我們提供的程序語言“征服世界”的解決方案吧!
這里的黑客指的是真正的黑客,是程序世界里勇于嘗試和探險的人,不是那些Cracker們。
這是一個激動人心的旅程,其起點來自某個不為人知的角落。
在2005年之前,小小的Flash開源社區(qū)中流傳著MTASC的傳說,MTASC的全稱為?Motion-Twin?ActionScript?2?Compiler,顧名思義,它是一個ActionScript?2語言的編譯器(當時的Flash官方腳本語言),MTASC是用OCaml語言編寫的,OCaml語言是一種主流的函數(shù)式編程語言,正如《計算機程序的構(gòu)造和解釋》一書使用Scheme所描述,《Types?and?Programming?Languages》和《Advanced?Topics?in?Types?and?Programming?Languages》這兩本類型系統(tǒng)的圣經(jīng)用的是OCaml描述。OCaml是玩類型系統(tǒng)的黑客們的御用語言。
.Net社區(qū)所熟知的F#也是基于OCaml的,通俗點講,F#是OCaml的親兒子,OCaml是F#的粑粑。
玩函數(shù)式語言的家伙們通常身上都有黑客氣質(zhì),因此,當ActionScript?2?改頭換面為ActionScript?3后,開發(fā)MTASC的家伙們做出了一個大膽的決定:
“少年不哭,
? 站起來擼;
? 不做備胎,
? 征服世界!”
?
于是,一門跨平臺跨語言的神上神語言橫空出世——haXe!而隨著移動時代和html5時代的到來,haXe的解決方案竟然是這樣的優(yōu)美和令人贊嘆。
與我們知道的語言不同,haXe是一門“Universal?Language”,我覺得翻譯成“上帝語言”比較準確。haXe是一門超越語言的語言,使用haXe寫的程序,可以編譯成不同的其它語言源碼,再進行編譯。如,haXe?->?C++,haXe?->?JS?,haXe?->?as3/swf,haXe?->?php。同時,haXe社區(qū)又為不同的平臺提供了統(tǒng)一的API抽象,形成了跨平臺跨語言的解決方案。
haXe開發(fā)環(huán)境的安裝見《擁抱haXe之javascript?也玩mvc》一文,本文詳細談?wù)勎覍aXe的理解。
很多程序員言不離OO,好像OO便是很高級的玩意。而在高聳如云的云端,住著一些仙人,口中沒有OO,只有類型。我看不懂《Types?and?Programming?Languages》,所以,下面對類型系統(tǒng)的說法只是我的胡亂所想,有可能謬誤百出。
在.Net文檔中,我們經(jīng)常看到一個詞:Type,對,這就是類型。而對象,則是Object。類型這個詞,是高于對象的。C中的int是一種類型,函數(shù)是一種類型,C#中的Object是一種類型,每一個編程語言都提供了一種類型系統(tǒng)。類型的水,比OO的水深的多。而haXe,就是一套類型翻譯系統(tǒng),將由haXe類型系統(tǒng)所描述的代碼,翻譯成目標語言的類型系統(tǒng),它玩的是類型。
為了跨語言,haXe只提供了簡單的基本類型,如Int,Float,Bool,Void等,在基本類型之外,haXe幾乎提供了一門現(xiàn)代語言的所有工具:靜態(tài)類型、動態(tài)類型、命名空間、泛型、函數(shù)對象、迭代器、內(nèi)聯(lián)、繼承、多態(tài)、getter,setter,接口,mixin,typedef,標準庫……。它使用某種高玩?zhèn)儾拍芾斫獾募夹g(shù)確保這個類型系統(tǒng)到目標類型系統(tǒng)間正確的轉(zhuǎn)換(不必擔心它會發(fā)生錯誤,它的正確性應(yīng)該是得到證明過的,是證明不是證實啊親),如此一來,使用haXe就具有兩個好處:
(1)使用haXe寫的代碼,能正確的轉(zhuǎn)換到不同的目標語言,這樣,最大程度的達到代碼級別的共享。
你可能覺得,這不是帶著鐐銬跳舞嗎?是的,在以前是,但是,現(xiàn)在不是了,現(xiàn)在的平臺越來越多元化了。用js寫前臺的,用js寫后臺的,用php寫后臺的,用C#寫應(yīng)用的,用C#寫后臺的,用C++寫應(yīng)用的,用C++寫后臺的,用Java寫應(yīng)用的,用Java寫后臺的……如果一個功能,用一門語言寫好了之后,它可以翻譯成各種不同的語言,還是很有價值的。雖然C很萬能,但也沒辦法在前臺JS中用啊,因此,haXe的這種解決方案是一種很有特色很有針對性的解決方案。比如,我有一個東西,既想通過html5發(fā)布,又想通過Flash發(fā)布,還想發(fā)布成iOS本地應(yīng)用,那么,有比haXe更好的解決方案嗎?沒有。用haXe就很簡單了,寫一份代碼,編譯成js的,在html5中用,編譯成flash的在Flash中用,編譯成C++的在iOS中用。再比如,張三的公司要推出一款Web產(chǎn)品,既有PHP版又有.Net版(比如,Discuz這種),用haXe開發(fā)可以只維護一份代碼。
你可能還有另一個疑問:不同平臺間的差異十分大,就算我可以不用Byte,但那些底層API都不一樣啊。沒關(guān)系,haXe社區(qū)提供了NME,對不同平臺的基本API提供了抽象,還是一份代碼,到處編譯。實在不行了,你還可以通過條件編譯和Magic代碼來直接調(diào)用外部API。
(2)對于某些弱類型系統(tǒng),比如js,使用haXe可以帶來生產(chǎn)力的極大提高!強大的類型系統(tǒng)啊,親!大部分錯誤編譯器都幫你檢查出來了,親!有命名空間啊,親!有泛型啊親!接口啊,繼承啊,多態(tài)啊,getter,setter,static等都有啊親!注釋啊,還有那些你用不上的類都不會被編譯進js中的啊,親!還有個小型的標準庫啊,親!
下面談?wù)勈褂胔aXe的三個主要的場景。
(1)Web?APP
隨著Html5時代的到來,Web?APP會越來越多。以往的Web主要是基于文檔的頁面,也就是說,一頁Web頁面,大部分是html和css,JS只是腳本,代碼量并不多。而Web?APP改變了這一狀況,Web?APP中,可能html和css代碼量會比較少,JS代碼會比較多。
以我現(xiàn)在手中的Web?APP為例,截至目前為止,只有150行html代碼,50行css代碼,而JS代碼有5000行。JS代碼中,大部分是處理業(yè)務(wù)邏輯,只有一小部分是處理dom。如果使用JS開發(fā),要規(guī)劃好類,要做好類與類的繼承關(guān)系還并不是一件簡單的事情,又由于不是強類型,代碼一多,很難維護。
而我一開始就選用了haXe,就沒有這些問題了。把每一個Dom節(jié)點當作一個控件,style當作控件的顯示屬性(haXe中,css直接被typedef為HtmlDom的style對象的屬性了),然后,監(jiān)聽各種事件,更新控件的屬性即可,就像寫Winform程序一樣。由于haXe有強大的類型系統(tǒng),規(guī)劃好類,一切很順利的搞定,用的很爽,像寫C#程序一樣。
看看下面的代碼組織,你能想到這是一個js?web?應(yīng)用嗎:
好處一:使用命名空間、類來組織代碼,代碼結(jié)構(gòu)清晰,容易維護。最終,haXe編譯器會將使用到的類編譯成一個獨立的js文件,剔除了用不上的類。發(fā)布也很簡單;
好處二:由于是強類型,即使我用的是開源IDE,自動完成系統(tǒng)也很完善,打個點就知道類型有哪些成員和操作了;
好處三:使用熟悉的OO開發(fā)方式來開發(fā),不用去折騰js那一套類型系統(tǒng)來模擬OO、命名空間等機制;通過mixin,甚至連.Net的擴展方法也可以實現(xiàn);
好處四:haXe編譯器保證了類型的正確處理,將很多js運行期可能出現(xiàn)的錯誤在編譯時就發(fā)現(xiàn)了,直接定位到代碼的行處,提前解決問題。
這個項目在進行第三期了,預(yù)期最終js代碼量會達到10000行,如果我直接使用js開發(fā),恐怕是個災(zāi)難。
我一直宣稱JS是Html5的最大軟肋,就在于Web?APP一旦復(fù)雜起來,JS的缺陷就會開始暴露。你能想象到擁有10000個類的JS代碼是什么樣子嗎(如果要在頁面實現(xiàn)Office,CAD,Matlab這樣檔次的應(yīng)用,怎么說也得幾千個類吧)?而對于這種情況,haXe提供了成熟的解決方案。當然,這個解決方案是誤打誤撞的,少年不哭,站起來擼,Flash開源社區(qū)飛出來一根屌絲,在Html5的土壤中發(fā)了芽。
(2)移動APP
在移動開發(fā)領(lǐng)域,現(xiàn)在是蘋果,Android在主導(dǎo),還有個老去的黑莓,還有未長大的WP,如何只用一份代碼,就開發(fā)出上述平臺通用的應(yīng)用呢?haXe同樣提供了解決方案,就是haXe+nme,詳見網(wǎng)站?http://www.haxenme.org/
WP就不談了,市場占有率太低,nme還沒考慮它。
你可以將NME看作對平臺UI和基本OS操作、基本W(wǎng)eb操作的抽象,來看看NME的介紹:
“NME?targets?iOS,?Android,?webOS,?BlackBerry,?Windows,?Mac,?Linux?and?Flash?Player?using?your?same?code.”
它的野心不止是移動平臺,而是所有的主流平臺!
是的,我們要征服世界,盡管我們只是幾個孤獨的黑客!
這里只提移動APP是因為它的價值主要體現(xiàn)在移動平臺上,因為在桌面平臺上,有更NB的解決方案,比如.Net,haxe+nme沒什么競爭力。
它可以編譯成Native?APP(這利用的是haXe->C++特性)在桌面或移動平臺運行:
“Harness?native?features?and?performance?without?writing?C++?or?Objective-C.”
這一點挺有競爭力的。目前雖然Flash也能做到在部分平臺編譯為Natice?APP,但是ActionScript3的性能比不上C++。同時,Flash的移動應(yīng)用的尺寸比較大,也是一個缺陷。
它也可以編譯成Flash程序在瀏覽器或者移動平臺運行:
“Compile?for?Adobe?AIR?or?Adobe?Flash?Player?using?the?same?codebase.”
這一點唯一的實用價值是編譯成Flash程序,可以Web上瀏覽。編譯為Flash?移動應(yīng)用還不如直接編譯成C++移動應(yīng)用,尺寸更小,速度更快。
它也可以編譯成Html5應(yīng)用在瀏覽器上運行:
“Designed?to?work?with?Jeash?for?rich?HTML5?applications?in?your?web?browser.”
Jeash是一款html5平臺實現(xiàn)的Flash?API,而NME實現(xiàn)的也是Flash的API,所以這一來,就有點意義了。
這里有haxe+nme的案例,全部是游戲:
http://www.haxenme.org/showcase/
這是一個巧妙的跨平臺解決方案。當然,這個解決方案依然是誤打誤撞的,無論是haXe還是nme,都比iphone年齡大。少年不哭,站起來擼,Flash開源社區(qū)飛出來一根屌絲,在移動應(yīng)用的土壤中發(fā)了芽。
(3)Flash?APP
haXe的前身MTASC的唯一用途就是開發(fā)Flash應(yīng)用,而進入haXe時代后,Flash?APP反而是最不值得關(guān)注的一個領(lǐng)域了。haXe開發(fā)相比as3開發(fā)優(yōu)勢不多,一個優(yōu)勢是haXe提供了一些Flash未公開的API操作,可以提高性能;另一個優(yōu)勢就是haXe編譯速度非常快。這兩個優(yōu)勢都不是決定性優(yōu)勢,我覺得沒多大發(fā)展前途,haXe的主要前途應(yīng)該是html5領(lǐng)域和移動應(yīng)用領(lǐng)域。
而未來,不是Web?APP壓倒移動APP,就是移動APP壓倒Web?APP,無論哪一個取勝,都沒有關(guān)系的。有了haXe,你就是上帝。
對性能特別敏感的應(yīng)用,haXe還搞不定,或者,你得hack一下haXe。haXe的核心代碼就那么幾個文件,幾千行。
?
最后,來一首安蕾爾的《Evil Evil》:
?本文轉(zhuǎn)自xiaotie博客園博客,原文鏈接http://www.cnblogs.com/xiaotie/archive/2012/04/19/2456447.html如需轉(zhuǎn)載請自行聯(lián)系原作者
xiaotie?集異璧實驗室(GEBLAB)
總結(jié)
以上是生活随笔為你收集整理的上帝的玩偶:haXe语言的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2016年工作总结和计划
- 下一篇: 上海纳税百强2016,邢台2017纳税百