十種可(kě)能改變IT行業走向的(de)編程語言__編程語言前沿
作為(wèi)開發人員,我們真的(de)還需要學(xué)習那麽多的(de)新型編程語言嗎。現在所擁有的(de)選擇已經是相當的(de)豐富,命令語言、函數語言、面向對象型語言、動态語言、編譯語言、解釋型語言以及腳本語言等等。這些身處業界前沿的(de)編程語言為(wèi)軟件開發工作的(de)未來提供了獨到的(de)解析視(shì)角。
我們真的(de)還需要那麽多新型編程語言嗎。當前開發人員們所擁有的(de)選擇無疑已經相當豐富。命令型語言、函數型語言、面向對象型語言、動态語言、編譯語言解釋型語言以及腳本語言等等似乎已經完全罩得住我們可(kě)能面對的(de)一(yī)切任務,而且今日也幾乎沒有哪位專業人士能夠通曉上述全部語言。
然而,新型語言仍然在以驚人的(de)速度不斷湧現。有些是學(xué)生或者愛好者以個人項目的(de)形式所設計,另一(yī)些則是來自(zì)大型IT供應商的(de)産品。連中小型企業也不甘勢弱,積極針對其所在行業的(de)需要開發出服務用語言。為(wèi)什麽人們如(rú)此熱衷于這種重複性勞動呢(ne)。
答案其實很簡單,盡管目前大家手頭的(de)語言在功能性與通用性方面已經相當強大,但仍然沒有哪種單獨的(de)語法規則能程度迎合任何一(yī)種實際需求。更重要的(de)是,編程行為(wèi)自(zì)身也處于不斷的(de)發展變化當中。多核CPU的(de)崛起、雲計算的(de)升溫、高(gāo)流動性與分布式體系結構,這一(yī)切的(de)一(yī)切都向開發人員提出了新的(de)技術性挑戰。要為(wèi)現有語言——尤其是當下流行的(de)語言——添加新功能、範例以及模式可(kě)以說比登天還難。有時候直接搞一(yī)套新語言往往是解決方案。
那麽在這裏,我将帶大家一(yī)同縱覽十種位居業界前沿的(de)編程語言;其中每種方案都從全新的(de)視(shì)角诠釋了軟件開發工作的(de)藝術性,并以各自(zì)不同的(de)特色解決了某些具體問題或是彌補了當下某款主流語言的(de)獨有缺憾。它們中有些是已經頗為(wèi)成熟的(de)項目,而有些則尚處于自(zì)身發展的(de)初級階段。有些可(kě)能對于大家來說還相當陌生且顯得晦澀但懂,但毋庸置疑的(de)是,它們很可(kě)能在未來給開發業界帶來颠覆性的(de)突破,并徹底改變今年(nián)數年(nián)的(de)編程工具發展趨勢——在新一(yī)代語言面世前,它們就是未來的(de)生力軍。
實驗性編程語言: Dart
JavaScript在為(wèi)網絡頁面添加基本交互功能方面表現拔群,但當網頁應用程序的(de)體積達到數千行代碼時,該語言的(de)局限性就将暴露無遺。谷歌正是基于這種缺憾而推出了Dart,而這種語言也承載了谷歌為(wèi)網頁編程帶來全新标準的(de)雄心壯志。
38c32459-c785-4450-adf4-113ec18976db.jpg
與JavaScript相似,Dart采用了與C語言相似的(de)語法及關鍵字。然而Dart與JavaScript最為(wèi)顯著的(de)區别在于,前者中的(de)對象明确指向類及接口,這與C++及Java頗有異曲同工之妙。Dart還允許程序員們利用靜态式有選擇地(dì)聲明變量。追溯設計者的(de)思路,他們應該是希望Dart與JavaScript一(yī)樣更易于學(xué)習、保有動态特色以及流暢的(de)執行效果,這樣一(yī)來開發人員就能夠在編寫代碼方面投入較少的(de)時間,産品維護也将更為(wèi)便捷,同時細小的(de)錯誤帶來的(de)影響也将被降程度。
目前我們還不能用Dart解決太多實際問題。其設計理(lǐ)念是希望該語言能夠同時運行于客戶機與服務器之上(與Node.js差不多),但現在惟一(yī)能夠讓Dart代碼在客戶端上運行的(de)辦法是将其通過編譯轉換為(wèi)JavaScript。它還不能正确作用于每一(yī)款浏覽器。不過由于Dart以BSD類開源許可(kě)方式進行發布,因此任何購買了谷歌版本的(de)廠商都可(kě)以随意将其構建于自(zì)己的(de)産品當中。谷歌要做(zuò)的(de)隻是說服業界接受這個編程領域的(de)新生兒即可(kě)。
實驗性編程語言第二位: Ceylon
Gavin King并不承認Ceylon這款他在紅(hóng)帽公司中創造出來的(de)語言肩負着“Java終結者”的(de)曆史使命。在King的(de)從業經曆中,最為(wèi)耀眼的(de)一(yī)頁正是他作為(wèi)Hibernate——Java對象關系映射框架的(de)創建者所赢得的(de)贊譽。他喜歡Java,但他仍然認為(wèi)Java還有很多提升空間。
King對于Java的(de)抱怨主要集中在冗長(cháng)的(de)語法結構,這種語言缺乏一(yī)級與高(gāo)端功能,而且對元編程的(de)支持也相當薄弱。而更令他感到沮喪的(de)是,Java中對于結構化數據定義的(de)聲明性語法極為(wèi)欠缺,用他的(de)話來說這使得Java“與XML根本無法分割。”Ceylon的(de)目标就是解決上述疑難雜症。
King與他的(de)團隊并不打算完全從零做(zuò)起。Ceylon虛拟機就不會出現,此類功能将通過Ceylon編譯器将內(nèi)容轉換為(wèi)Java字節代碼,進而運行于JVM當中。不過Ceylon絕不會止步于一(yī)款編譯器這麽簡單。該項目的(de)一(yī)大雄心是打造一(yī)套全新的(de)Ceylon SDK體系來取代Java SDK,引用King對于後者的(de)評價——結構臃腫、笨拙,且從來沒有得到“适當的(de)、與時俱進的(de)調整。”
這是一(yī)項艱巨的(de)任務,因為(wèi)紅(hóng)帽公司到目前為(wèi)止還沒有發布過任何一(yī)款Ceylon工具。King表示自(zì)己期待着能在年(nián)內(nèi)看到一(yī)款編譯器出現,但不會指望短(duǎn)時間內(nèi)會有“由Ceylon編寫”的(de)軟件問世。
實驗性編程語言第三位: Go
解釋程序、虛拟機以及托管代碼如(rú)今正風靡一(yī)時。我們真的(de)需要另一(yī)款用于将目标內(nèi)容編譯為(wèi)本地(dì)二進制文件的(de)老式語言嗎。來自(zì)谷歌工程師團隊的(de)小組——由Robert Griesemer以及貝爾實驗室的(de)傳奇式人物Ken Thompson與Rob Pike共同執掌——給出的(de)答案是肯定的(de)。
19d21be9-495d-4fce-8b60-ca434a4420ba.jpg
Go是一(yī)種通用型編程語言,且适用于從應用程序開發到系統編程等各種工作需求。從這種意義上來說,它更接近于C語言或C++,而不是Java或是C#。但與後兩者一(yī)樣,Go中也包含着各類現代化功能,包括垃圾收集、運行時間映象以及對并行性的(de)支持。
同樣重要的(de)是,Go在設計上有意降低(dī)了編程難度。其基礎語法與C語言非常相近,但卻消除了多餘的(de)語法及樣闆文件,同時簡化了對象定義等常用功能的(de)操作。Go項目小組的(de)目标是打造出了一(yī)款像動态腳本語言那樣擁有親切代碼的(de)語言,并且能夠像編譯語言那樣提供強大的(de)功能性。
Go尚處于創建過程之中,而且其語言規範也仍可(kě)能發生變動。也就是說,我們目前已經可(kě)以開始嘗試使用了。谷歌已經為(wèi)其打造了對應的(de)可(kě)用工具與編譯器,說明文檔之類也相當豐富;舉例來說,Effective Go教程就是大家了解Go與其它早期語言不同之處的(de)上佳起點。
實驗性編程語言第四位: F#
函數型程序設計在計算機科學(xué)家以及學(xué)術界一(yī)直都相當流行,但像Lisp以及Haskell這樣的(de)純函數型語言通常被人們認為(wèi)無法作用于實際應用中的(de)軟件開發工作。對于函數型代碼,大家抱怨最多的(de)是它們很難與由C++及Java等命令型語言所寫成的(de)代碼與庫相整合。
說起F#(發音為(wèi)“F=sharp”),這款微軟推出的(de)語言在設計上可(kě)謂兼顧了功能性與實用性。由于F#在.Net公共語言運行(簡稱CLR)中屬于一(yī)級語言,因此能夠訪問其它CLR語言的(de)所有同類庫及功能,包括C#及Visual Basic等。
F#代碼與OCaml多少有些類似,但它同時擁有不少相當有趣的(de)特色語法。例如(rú),F#中的(de)數字型數據可(kě)以通過分配獲得計量單位,進而為(wèi)科學(xué)類計算服務。F#還為(wèi)異步式I/O、CPU并行處理(lǐ)以及GPU負載分擔等功能提供了必要的(de)理(lǐ)論支持。
在度過了微軟研究中心中漫長(cháng)的(de)醞釀期後,F#現在終于同Visual Studio 2010一(yī)同面世了。更妙的(de)是,微軟這一(yī)次不按常理(lǐ)出牌,将F#編譯器與代碼庫通過Apache開源許可(kě)呈現在我們面前;大家不僅能夠使用這款語言,更可(kě)以将其引入Mac及Linux系統(通過Mono運行工具)。
實驗性語言第五位: Opa
Web開發工作是公認的(de)繁雜無比。就算是最簡單的(de)一(yī)款Web應用程序也需要不計其數的(de)代碼行與多種語言交替使用:HTML與JavaScript處理(lǐ)客戶端、Java或PHP應對服務器、SQL負責數據庫等等。
Opa其實并不打算單獨取代上述任何一(yī)種語言。相反,它存在的(de)目的(de)是希望通過為(wèi)Web編程設定一(yī)套全新規範的(de)方式一(yī)次性将各類方案直接抹殺。在Opa應用程序中,客戶端UI、服務器端邏輯以及數據庫I/O都由同一(yī)種語言負責實施——也就是Opa本身。
而要完成這一(yī)目标,Opa需要将客戶端與服務器端框架進行整合。由Opa編譯器來決定某個特定程序是否應該運行于客戶端、服務器端或是同時運行于二者之上,其後該編譯器将輸出運行所必需的(de)代碼。對于客戶端型程序而言,編譯器會将Opa的(de)代碼內(nèi)容轉換為(wèi)相應的(de)JavaScript代碼,包括其中的(de)AJAX調用。
當然,這樣規模的(de)整合型系統也暗藏着一(yī)些後台機關。Opa的(de)運行環境将其Web服務器與數據庫管理(lǐ)系統捆綁在一(yī)起,也就是說我們無法用其它獨立的(de)備選方案取代它們的(de)位置。這當然可(kě)以算是一(yī)點缺憾,但為(wèi)了保持标準的(de)細緻化與完整性,并使得數據驅動的(de)Web應用程序能夠以短(duǎn)短(duǎn)數十行代碼得以表達,這一(yī)切都是值得的(de)。Opa項目完全開源,并且目前已經支持64位Linux以及Mac OS X平台;今後随着工作的(de)深入還将有更多端口得以開放。
實驗性編程語言第六位: Fantom
我們是否應該在開發自(zì)己的(de)應用程序時考慮對java及.Net的(de)支持。如(rú)果使用Fantom來編寫代碼,那麽一(yī)切都不必擔心,連交換機平台也不在話下。這是因為(wèi)Fantom在設計上兼顧到了跨平台的(de)可(kě)移植特性。Fantom項目中不僅包括能夠為(wèi)JVM或者.Net CLI輸出字節代碼的(de)編譯器,同時也擁有一(yī)組能夠容納Java及.Net接口的(de)抽象化API,也就是創建了一(yī)套額外的(de)可(kě)移植層。
Fanrom的(de)可(kě)移植性還有着進一(yī)步的(de)擴展規劃。目前由Fantom到JavaScript編譯器已經可(kě)以使用,而接下來我們還可(kě)以期望看到包括LLVM編譯器、Parrot虛拟機以及iOS版Objective-C在內(nèi)的(de)各類延展型項目。
不過千萬别把可(kě)移植性當作Fantom語言惟一(yī)的(de)存在理(lǐ)由。雖然它在本質上仍然是以C語言為(wèi)基礎,但它同時也對該原始模型進行了充分改良。Fantom語言試圖在某些頗具争議的(de)語法讨論——例如(rú)牢固與動态或者接口與類——之中獲取中立身份。它不僅增加了對數據結構說明及序列化對象的(de)簡化說明,還囊括了對函數型程序設計及并行性創建工作的(de)有力支持。
Fantom是基于Academic許可(kě)3.0版本的(de)開源項目,并且現在在Windows以及Unix類平台(包括Mac OS X)上已經可(kě)以付諸使用。
實驗性編程語言第七位: Zimbu
大多數編程語言都從其它早期語言中借用到了某些功能或是語法。而Zimbu則把這種拿來主義精神發揮到。作為(wèi)Vim文本編輯器作者Bram Moolenaar的(de)另一(yī)款得意之作,Zimbu的(de)目标是成為(wèi)一(yī)款速度快、語法簡潔、适應移植需求且便于閱讀的(de)語言,并最終使得來自(zì)任何圖形用戶界面的(de)應用程序代碼得以運行于目标操作系統內(nèi)核當中。
由于Zimbu與生俱來的(de)雜交血統,其語法也相當獨特,但同時卻又功能豐富。它采用與C語言相似的(de)表達式及運算符,但卻使用自(zì)己的(de)一(yī)套關鍵字、數據類型及塊狀結構體系。另外,它還支持內(nèi)存管理(lǐ)、線程及通道(dào)等功能。
可(kě)移植性一(yī)直是個關鍵問題。盡管Zimbu是一(yī)款編譯型語言,但其編譯器輸出的(de)是ANSI C碼,這就使得文件隻能由具備本地(dì)C編譯器的(de)平台來生成。
遺憾的(de)是,Zimbu項目如(rú)今尚處于起步階段。而其編譯器雖然已經能夠為(wèi)自(zì)身及其它程序創建一(yī)些演示範例,但并不是全部Zimbu有效代碼都能夠正确運行。不過預期功能目前還不完善,其中一(yī)些還隻是加以草(cǎo)草(cǎo)設置,因此我相信隻要假以時日,這些問題都能得到妥善解決。另外語言規範也很可(kě)能随着時間的(de)推移而産生變化,例如(rú)在必要時添加新的(de)關鍵字、類型以及語法等。所以說明文檔等材料目前還沒有統一(yī)的(de)結論。不過如(rú)果大家對這種語言有興趣的(de)話,其初始工具已經在Apache許可(kě)基礎上得以公布。
實驗性編程語言第八位: X10
并行處理(lǐ)一(yī)度作為(wèi)軟件開發領域中的(de)獨特生态圈存在,但随着多核心CPU及分布式計算技術的(de)日益普及,并行化也崛起成為(wèi)未來發展的(de)主流方向。遺憾的(de)是,今日,編程語言仍然沒能跟上時代的(de)步伐。而這正是IBM研究中心苦心開發X10的(de)原因,這是一(yī)種以提高(gāo)開發人員生産效率為(wèi)主旨的(de)實用型語言,希望在現有基礎上将開發效率提高(gāo)“十倍”。
X10利用劃分式全局地(dì)址空間(簡稱)編程模型來解決并行類任務。代碼與數據作為(wèi)各自(zì)獨立的(de)單位,分别位于一(yī)個或多個“空間”當中,這就使得将單線程字節代碼(單獨空間)向高(gāo)性能集群中單核心或多核心處理(lǐ)器(多個空間)的(de)多線程處理(lǐ)能力轉化的(de)過程更為(wèi)簡便。
X10代碼總體來說與Java比較相近;事實上,X10運行環境可(kě)以直接作為(wèi)本地(dì)可(kě)執行文件以及類文件應用于JVM當中。X10編譯器能夠輸出C++或是Java類型的(de)源代碼。達成與Java語言之間的(de)直接操作性是該項目的(de)努力方向。
就目前而言,這種語言雖然還處于發展變化中,但也已經算得上相當成熟。其編譯器與運行環境支持一(yī)系列平台,包括Linux、Mac OS X以及Windows。包括基于Eclipse的(de)IDE及調試工具等都已經以Eclipse公共許可(kě)為(wèi)基礎進行發布。
實驗性編程語言第九位: haXe
大多數語言都可(kě)以用來編寫可(kě)移植代碼。C語言編譯器能夠作用于幾乎每一(yī)種CPU架構,而Java字節代碼則能夠在一(yī)切具備JVM的(de)環境中發揮功效。但haXe(讀音為(wèi)“hex”)能做(zuò)的(de)則比可(kě)移植性更多。它是一(yī)款跨平台語言,能夠适應各種不同類型的(de)運行環境——包括本地(dì)二進制解釋程序及虛拟機。
開發人員可(kě)以利用haXe編寫程序,然後将結果編譯為(wèi)對象代碼,例如(rú)時下流行的(de)JavaScript、PHP、Flash/ActionScript或者NekoVM等等;而像C#、Java等其它輸出模塊目前仍處于研發階段。在核心語言之外有haXe标準庫作為(wèi)補充,其指向各類目标的(de)功能也同樣齊全,而且還為(wèi)目标平台的(de)獨特功能配備了專用的(de)函數庫。
haXe在語法上與C語言相似,函數集合相當豐富。它的(de)主要優勢在于規避了目标平台自(zì)身固有的(de)缺陷。舉例來說,haXe具備JavaScript所欠缺的(de)嚴謹歸類;它在ActionScript的(de)基礎上增加了通用語句及類型推導;它還完全消除了PHP語言在語法方面的(de)設計疏漏與雜亂無序。
雖然仍處于開發階段,但haXe在其創造者Motion Twin遊戲工作室的(de)推動下已經進入商業化運營,因此我們已經應該用嚴肅的(de)眼光看待它。它支持Linux、Mac OS X以及Windows平台,并采用數款開源類許可(kě)相結合的(de)分布模式。
實驗性編程語言第十位: Chapel
在高(gāo)性能計算領域,很少有哪家企業的(de)風頭能夠蓋過Cray,因此Cray公司的(de)原始編程語言Chapel能夠上榜也就毫不奇怪了。這是一(yī)款在設計上主要考慮到超級計算機及集群實際需求的(de)語言。
Chapel是Cray公司Cascade Program項目的(de)一(yī)部分,該項目可(kě)謂野心勃勃,其部分計劃內(nèi)資金甚是由美國國防部研究計劃局(簡稱DARPA)所提供。其目标主要是從底層硬件中提取抽象并行算法,進而提高(gāo)現有架構的(de)性能表現,并使得并行類程序具備更好的(de)可(kě)移植性。
Chapel的(de)語法脫胎自(zì)許多來源。除了幾款我們常見的(de)主流語言(例如(rú)C、C++以及Java),它還從像Fortran及Matlab這樣的(de)科學(xué)類編程語言中借鑒了不少概念型內(nèi)容。它的(de)并行處理(lǐ)能力在一(yī)定程度上與ZPL及高(gāo)性能Fortran密切相關,另一(yī)些Cray早期項目也是它的(de)學(xué)習目标。
Chapel最引人注目的(de)特色之一(yī)是其“多分辨率編程”功能,這項功能使得開發人員能夠在應用程序中引入更多抽象化代碼,并在實施中添加更多細節闡述以使得定義本身更加明确。
Chapel仍處于開發階段。目前它能夠運行于Cray超級計算機及各類高(gāo)性能集群之上,并且可(kě)以移植到大多數Unix類系統(包括Mac OS X以及安裝了Cygwin的(de)Windows系統)當中。該語言源代碼采用BSD型開源許可(kě)。
編輯:--ns868