我們真的還需要那么多新型編程語言嗎?當前開發(fā)人員們所擁有的選擇無疑已經(jīng)相當豐富。命令型語言、函數(shù)型語言、面向對象型語言、動態(tài)語言、編譯語言解釋型語言以及腳本語言等等似乎已經(jīng)完全罩得住我們可能面對的一切任務,而且時至今日也幾乎沒有哪位專業(yè)人士能夠通曉上述全部語言。
然而,新型語言仍然在以驚人的速度不斷涌現(xiàn)。有些是學生或者愛好者以個人項目的形式所設計,另一些則是來自大型IT供應商的產品。甚至連中小型企業(yè)也不甘勢弱,積極針對其所在行業(yè)的需要開發(fā)出服務用語言。為什么人們如此熱衷于這種重復性勞動呢?
答案其實很簡單,盡管目前大家手頭的語言在功能性與通用性方面已經(jīng)相當強大,但仍然沒有哪種單獨的語法規(guī)則能夠最大程度迎合任何一種實際需求。更重要的是,編程行為自身也處于不斷的發(fā)展變化當中。多核CPU的崛起、云計算的升溫、高流動性與分布式體系結構,這一切的一切都向開發(fā)人員提出了新的技術性挑戰(zhàn)。要為現(xiàn)有語言——尤其是當下流行的語言——添加最新功能、范例以及模式可以說比登天還難。有時候直接搞一套新語言往往是最佳解決方案。
那么在這里,我將帶大家一同縱覽十種位居業(yè)界前沿的編程語言;其中每種方案都從全新的視角詮釋了軟件開發(fā)工作的藝術性,并以各自不同的特色解決了某些具體問題或是彌補了當下某款主流語言的獨有缺憾。它們中有些是已經(jīng)頗為成熟的項目,而有些則尚處于自身發(fā)展的初級階段。有些可能對于大家來說還相當陌生且顯得晦澀但懂,但毋庸置疑的是,它們很可能在未來給開發(fā)業(yè)界帶來顛覆性的突破,并徹底改變今年數(shù)年的編程工具發(fā)展趨勢——至少在新一代語言面世前,它們就是未來的生力軍。
實驗性編程語言第一位: Dart
JavaScript在為網(wǎng)絡頁面添加基本交互功能方面表現(xiàn)拔群,但當網(wǎng)頁應用程序的體積達到數(shù)千行代碼時,該語言的局限性就將暴露無遺。谷歌正是基于這種缺憾而推出了Dart,而這種語言也承載了谷歌為網(wǎng)頁編程帶來全新標準的雄心壯志。
與JavaScript相似,Dart采用了與C語言相似的語法及關鍵字。然而Dart與JavaScript最為顯著的區(qū)別在于,前者中的對象明確指向類及接口,這與C++及Java頗有異曲同工之妙。Dart還允許程序員們利用靜態(tài)式有選擇地聲明變量。追溯設計者的思路,他們應該是希望Dart與JavaScript一樣更易于學習、保有動態(tài)特色以及流暢的執(zhí)行效果,這樣一來開發(fā)人員就能夠在編寫代碼方面投入較少的時間,產品維護也將更為便捷,同時細小的錯誤帶來的影響也將被降至最低程度。
目前我們還不能用Dart解決太多實際問題。其設計理念是希望該語言能夠同時運行于客戶機與服務器之上(與Node.js差不多),但現(xiàn)在惟一能夠讓Dart代碼在客戶端上運行的辦法是將其通過編譯轉換為JavaScript。甚至它還不能正確作用于每一款瀏覽器。不過由于Dart以BSD類開源許可方式進行發(fā)布,因此任何購買了谷歌版本的廠商都可以隨意將其構建于自己的產品當中。谷歌要做的只是說服業(yè)界接受這個編程領域的新生兒即可。
實驗性編程語言第二位: Ceylon
Gavin King并不承認Ceylon這款他在紅帽公司中創(chuàng)造出來的語言肩負著“Java終結者”的歷史使命。在King的從業(yè)經(jīng)歷中,最為耀眼的一頁正是他作為Hibernate——Java對象關系映射框架的創(chuàng)建者所贏得的贊譽。他喜歡Java,但他仍然認為Java還有很多提升空間。
King對于Java的抱怨主要集中在冗長的語法結構,這種語言缺乏一級與高端功能,而且對元編程的支持也相當薄弱。而更令他感到沮喪的是,Java中對于結構化數(shù)據(jù)定義的聲明性語法極為欠缺,用他的話來說這使得Java“與XML根本無法分割。”Ceylon的目標就是解決上述疑難雜癥。
King與他的團隊并不打算完全從零做起。Ceylon虛擬機就不會出現(xiàn),此類功能將通過Ceylon編譯器將內容轉換為Java字節(jié)代碼,進而運行于JVM當中。不過Ceylon絕不會止步于一款編譯器這么簡單。該項目的一大雄心是打造一套全新的Ceylon SDK體系來取代Java SDK,引用King對于后者的評價——結構臃腫、笨拙,且從來沒有得到“適當?shù)摹⑴c時俱進的調整。”
這是一項艱巨的任務,因為紅帽公司到目前為止還沒有發(fā)布過任何一款Ceylon工具。King表示自己期待著能在年內看到一款編譯器出現(xiàn),但不會指望短時間內會有“百分之百由Ceylon編寫”的軟件問世。
實驗性編程語言第三位: Go
解釋程序、虛擬機以及托管代碼如今正風靡一時。我們真的需要另一款用于將目標內容編譯為本地二進制文件的老式語言嗎?來自谷歌工程師團隊的小組——由Robert Griesemer以及貝爾實驗室的傳奇式人物Ken Thompson與Rob Pike共同執(zhí)掌——給出的答案是肯定的。
Go是一種通用型編程語言,且適用于從應用程序開發(fā)到系統(tǒng)編程等各種工作需求。從這種意義上來說,它更接近于C語言或C++,而不是Java或是C#。但與后兩者一樣,Go中也包含著各類現(xiàn)代化功能,包括垃圾收集、運行時間映象以及對并行性的支持。
同樣重要的是,Go在設計上有意降低了編程難度。其基礎語法與C語言非常相近,但卻消除了多余的語法及樣板文件,同時簡化了對象定義等常用功能的操作。Go項目小組的目標是打造出了一款像動態(tài)腳本語言那樣擁有親切代碼的語言,并且能夠像編譯語言那樣提供強大的功能性。
Go尚處于創(chuàng)建過程之中,而且其語言規(guī)范也仍可能發(fā)生變動。也就是說,我們目前已經(jīng)可以開始嘗試使用了。谷歌已經(jīng)為其打造了對應的可用工具與編譯器,說明文檔之類也相當豐富;舉例來說,Effective Go教程就是大家了解Go與其它早期語言不同之處的上佳起點。
實驗性編程語言第四位: F#
函數(shù)型程序設計在計算機科學家以及學術界一直都相當流行,但像Lisp以及Haskell這樣的純函數(shù)型語言通常被人們認為無法作用于實際應用中的軟件開發(fā)工作。對于函數(shù)型代碼,大家抱怨最多的是它們很難與由C++及Java等命令型語言所寫成的代碼與庫相整合。
說起F#(發(fā)音為“F=sharp”),這款微軟推出的語言在設計上可謂兼顧了功能性與實用性。由于F#在.Net公共語言運行(簡稱CLR)中屬于一級語言,因此能夠訪問其它CLR語言的所有同類庫及功能,包括C#及Visual Basic等。
F#代碼與OCaml多少有些類似,但它同時擁有不少相當有趣的特色語法。例如,F(xiàn)#中的數(shù)字型數(shù)據(jù)可以通過分配獲得計量單位,進而為科學類計算服務。F#還為異步式I/O、CPU并行處理以及GPU負載分擔等功能提供了必要的理論支持。
在度過了微軟研究中心中漫長的醞釀期后,F(xiàn)#現(xiàn)在終于同Visual Studio 2010一同面世了。更妙的是,微軟這一次不按常理出牌,將F#編譯器與代碼庫通過Apache開源許可呈現(xiàn)在我們面前;大家不僅能夠免費使用這款語言,更可以將其引入Mac及Linux系統(tǒng)(通過Mono運行工具)。