這些可作為當前流行語言強力替代的語言正在蒸蒸日上,或許你的下個項目正好能用到它。
有時候大量的爛大街的主流開發(fā)語言也沒辦法滿足你對特定問題的開發(fā)需求。有時候你不得不展望未來以期待能出現(xiàn)一門語言:有著良好的語言結(jié)構(gòu),能提供額外的功能,無需不斷調(diào)整優(yōu)化就能使你的代碼提高運行速度。這門語言有著更好的穩(wěn)定性以及良好的的代碼結(jié)構(gòu),能幫你避免寫出雜亂的或者錯誤的代碼。
這個世界有太多靈巧的語言,例如 C#,Java,Javascript。有些語言可能只有少數(shù)擁護者,但是大多數(shù)語言,擁有龐大的社區(qū)擁護者,這些擁護者有著對這門語言能解決特定領(lǐng)域問題能力的相同的喜愛?赡苤肋@門語言語法的程序員沒有過億,但是有時候稍稍的變動或許是有價值的,當你學習了一門新的語言,說不定下個項目就能發(fā)揮用處。
以下的九門語言應該列在每一位程序眼的讀書列表中。它們可能并不適合每個工程,因為大多數(shù)語言都是針對特定領(lǐng)域的。它們都值得研究和投入精力去學習,說不定哪一天就能派上用場。
Erlang:面向?qū)崟r系統(tǒng)的函數(shù)式語言
Erlang 最初是由瑞典電信設(shè)備制造商愛立信為通信應用(電話交換機)設(shè)計的。愛立信的開發(fā)者鼓吹 Erlang 的9個9指標的性能,聲稱 Erlang 能夠傳輸99.9999999%的數(shù)據(jù)。這時 Erlang 才開始引起人們的關(guān)注。
Erlang 的秘密是它的函數(shù)式設(shè)計范例。大部分代碼都被強制運行于它的虛擬機中,這很好的避免了其他系統(tǒng)的干擾。函數(shù)都在虛擬機內(nèi)部運行,運行在小的“類似沙箱模式的輕量級進程中”,并且只能通過消息傳遞相互通訊。你不可能僅僅抓取一個指針就夠快速該變指針在棧中的狀態(tài)。你必須保持在調(diào)用層次內(nèi)部來保證函數(shù)狀態(tài)的一致性。設(shè)計上或許有些不妥,但是這樣很好的保證了錯誤向外擴散。
這種模式簡化了運行邏輯,讓運行時代碼決定同時能夠運行什么任務。并發(fā)處理也很容易管理,運行調(diào)度程序能夠減少上下文切換。Erlang 迷們喜歡吹噓“在Web服務器上同時運行2000萬”處理器“(輕量級進程)。假如你正在構(gòu)架一個類似移動電話交換機的實時收費系統(tǒng),但是并沒有足夠的空間存儲數(shù)據(jù),那么 Erlang 正好符合你的需求。
Go:簡單、動態(tài)
谷歌不是第一家調(diào)查集合語言的組織,最終發(fā)現(xiàn)語言雜亂,復雜并且效率不高。2009年,谷歌發(fā)布了它自己的解決方案:一門靜態(tài)類型的語言,類似于 C 語言但是包含了其所不具備的特征,它讓程序員避免了類型聲明和被 malloc 調(diào)用鎖迷惑。通過 Go 語言,程序員能夠受益于塔的簡潔、已編譯的c語言的結(jié)構(gòu)以及動態(tài)腳本語言的的易用性。
同時,Sun 和 Apple 也以相同的方式創(chuàng)建了 Java 和 Swift 語言,相應的,Google 做出了一個重要的不同的決定:Go 語言的發(fā)明者希望它能足夠簡單以至于每個程序員都能輕松的掌握。Rob Pike,發(fā)明者之一,向 Ars Technica 豪言道:長遠來說,通過將事件分開處理,你能夠獲得更多。因此,Go語言還有一些靈活的特性,泛型,類型繼承,斷言,只通過干凈的簡單代碼塊操作字符串、數(shù)字以及哈希表。
據(jù)報道這門這門語言在巨大谷歌帝國內(nèi)部被很好的接受,在其它方面也獲得了認可,動態(tài)語言 Python 和 Ruby 的愛好者接受了編譯已編譯語言的嚴密性。假如你想要獲得 Google 的青睞,并且需要建立服務器端的業(yè)務邏輯,那么 Go 會是一個好的選擇。
Groovy:提供 Java 的腳本支持
Java 世界是異常的靈活。但是你需要仍忍受它”穿個背帶褲又要系皮帶”的方式,例如,聲明,每個變量的類型,分行代表每行結(jié)束,類的訪問只是返回一個值。但是 Go 語言瞄準了動態(tài)語言的吸引人之處并且將它自身緊緊的與 Java 相集成。
Groovy 棄置了 Java 乏味的引號和分號方式,提供一種簡單的編程習慣,也能用于擴展現(xiàn)有的 Java代碼。運行在 jvm 上。不僅僅如此,Groovy 緊緊的月 JavaJAR 相結(jié)合,所以你能和好的利用一有的Java 代碼。Groovy 運行起來像一門動態(tài)類型語言,并且能夠訪問靜態(tài)類型 Java 對象的數(shù)據(jù)。
Groovy 程序眼認為他們技術(shù)與 Java 程序員,同事也是 Groovy 程序員; Java 代碼,能夠提供非常多的功能。充分使用 Java 擁有的閉包,操作符重載,多態(tài)性。不要忘了使用問號來做空指針的判斷的簡易性,這比使用 if-then 語句來判斷要簡單得多。因此,簡潔的語法,使程序員敲擊鍵盤次數(shù)減少了。誰會不喜歡呢?
最后,令所有 Java 程序員羨慕的動態(tài)語言的簡單特點讓他們能夠減少工作量,有更多的娛樂時間,但是又不跳出 Java 圈。
OCaml:復雜數(shù)據(jù)層次把戲
一些程序員不喜歡聲明變量,于是他們創(chuàng)建了動態(tài)語言。其他人喜歡聲明一個變量的特定類型,integer,string 或者是 object。對于他們來說,大多胡編譯型語言都對類型聲明提供了支持。
這是一些喜歡詳細聲明變量層次類型的,甚至談到要創(chuàng)建“algebras”(代數(shù))類型。他們想象列表和多種類型的表能用來表示復雜、多層次的數(shù)據(jù)。他們提到了多態(tài),模式匹配原型以及數(shù)據(jù)封裝。這只會他們期望的復雜的,高結(jié)構(gòu)化類型、原型以及原原型世界的基礎(chǔ)。
對于他們,OCaml,一門有多個編程社區(qū)為了讓前述想法被廣泛接受而共同努力的語言。OCaml 提供類對象的支持,自動內(nèi)存管理以及跨平臺。甚至蘋果App商店也提供了 OCaml 的 App 支持。OCaml 的理想的工程可能是建立一個符號數(shù)學網(wǎng)站來教授代數(shù)。
CoffeeScript:使 JavaScript 更簡潔
技術(shù)角度來說,CoffeeScript 并不是一門語言。這是一個將你寫的代碼轉(zhuǎn)換 Javascript 的預處理器。但是它看起來有所與眾不同,因為它缺少大量的標點符號。你可以人為他是 Ruby 或者 Python,盡管內(nèi)部表現(xiàn)像 Javascript。
當封號厭惡者被強制用瀏覽器支持的 Javascript 編程的時候,Coffeescript 開始流行了。改變?yōu)g覽器工作的腳本語言是不切實際的,于是他們寫了他們自己的預處理。結(jié)果是程序員們能夠?qū)懜蓛舻泥菃岵⑶易?CoffeeScript 將那些代碼轉(zhuǎn)譯成各種符號的 Javascript 語言指令來操控瀏覽器。
少了分號緊緊支持開始。通過 CoffeeScript,你甚至不需要通過var來聲明變量。聲明函數(shù)也不需要function 關(guān)鍵字或者大括號。事實上,大括號在 CoffeeScript 中也不太被使用。代碼是如此的簡潔,以至于相比于哥特式教堂,它看起來像現(xiàn)代主義建筑物。這就是為什么很多新的 Javascript 框架通常是用 CoffeeScript 寫的然后編譯成 Javascript。
Scala:JVM上的函數(shù)式編程
假如你想要讓你的代碼有面向?qū)ο蟮那逦鷮哟谓Y(jié)構(gòu)又喜歡函數(shù)型編程模式,那你有很多選擇。假如你熟悉 Java,Scala 會是你的一個選擇。
Scala 運行在 JVM 上,并將所有的清晰的函數(shù)式編程的約束轉(zhuǎn)變成 Java 支持的語法以及聯(lián)接到具體的 JAR 文件。假如那些額外的 JAR 中有副作用和其他不可避免的令人討厭的頭痛代碼,那么使用Scala 剛剛適合業(yè)務場景,你的代碼會變得很清晰。
Scala 是靜態(tài)類型的。編譯器負責在編譯時推斷出具體類型,對象類型和原始類型沒有區(qū)別,因為Scala 想讓每一個對象都繼承自 Any。Scala 的語法比 Java 更加簡潔。Scala 程序員稱之為“低禮節(jié)”。你可以把駝峰式命名方式遺留在 Java 世界了。
Scala 提供了很多函數(shù)型語言的特征,例如懶初始化,尾遞歸,常量。但是為了能在 JVM 中運行,做了適當?shù)男薷。基本的原類型或者列表變量(像lists和哈希表),可以是可變或者不可變的。尾遞歸通過簡單的例子運行,而不是必須通過詳細聲明的可變遞歸。以上是 Scala 的全部實現(xiàn)思想,但是因為需要運行在 JVM 上,具體實現(xiàn)會有所限制。Scala 能夠所有 Java 平臺上運行,能很好的與已存在的開源 Java 代碼混用。這對于許多實踐性問題是一種權(quán)衡。
假如你需要將數(shù)據(jù)放在一千個處理器的集群中處理,并且有一堆遺留的 Java 代碼,那么 Scala 是一個很好的解決方案。
Dart:不像 JavaScript 的 JavaScript
流行并不是被吹捧出來的?赡苡性絹碓蕉囝I(lǐng)域使用到了 JavaScript,“事君數(shù),斯辱矣;朋友數(shù),斯疏矣”,有時候太過于親近反而會導致疏遠,疏遠了然后就開始尋找替代。Dart 是 Google 出品的一門適用于 Web 瀏覽器端的新語言。
Dart 并沒有從 JavaScript 基本概念中脫離出來。它工作在瀏覽器中,操作所有的 DIV 和我們所見的Web 對象。Dart 的作者僅僅只是為了清除 JavaScript 中所有惱人的部分,使之變得更簡潔。底層結(jié)構(gòu)并沒有太大的變化。因為他們希望將 Dart 代碼轉(zhuǎn)成 Javascript 來提高運行速度。
高亮可能在許多 JavaScript 類庫中提供的額外功能。你不需要通過 jQuery 或者其他通用類庫來修改部分 HTML 頁面。Dart 提供了默認的支持。也許一些熟悉的數(shù)據(jù)類型以及語法的速記技巧能夠少敲幾次鍵盤。Google 通過提供開源的支持大多數(shù)主流平臺的開源工具來答題推廣 Dart。
假如你正在建立一個動態(tài)的 Web 應用。并且已經(jīng)對于 JavaScript 厭煩了,Dart 提供了清晰的語法結(jié)構(gòu)來創(chuàng)建有多種 Web 資源數(shù)據(jù)的 Div 塊。
Haskell:通用純函數(shù)式編程語言
經(jīng)過超過20年的時間,一直研究函數(shù)型編程的學術(shù)研究者開發(fā)了 Haskell 語言,一門用來表達他們對于副作用的壞處的想法的語言。這是一門更加存粹的表達式函數(shù)型語言,通過精細的機制來處理 I/O Channels 和其他不可避免的副作用。其余的代碼應該是相當有用的。
Haskell 社區(qū)相當活躍,那里有很多 Haskell 的變體等著你去探究。有些是單機版的,其他的是通過與像 Java(Jaskell,F(xiàn)rege)或者 Python 那樣的主流語言集成的。大多數(shù)的名字顯示他們來自蘇格蘭,那里是 Haskell 研究,或者是哲學家/邏輯學家(他們是許多 Haskell 思想的啟蒙者)的溫床。假如你認為你的數(shù)據(jù)結(jié)構(gòu)和類型太復雜了,你可以考慮用 Haskell。
Julia:給Python界帶來了新的消息
科學計算領(lǐng)域有一群 Python 的愛好者,享受 Python 帶來的簡單語法以及能夠避免陷入亂用指針和字節(jié)的細節(jié)中的自由自在。除了所有的優(yōu)點,Python 通常在科學計算中處理大數(shù)據(jù)所表現(xiàn)的令人發(fā)狂的運行速度一值是一個詬病。為了提高運行速度,很多科學家轉(zhuǎn)而使用c語言來編寫核心的運行代碼。但是這帶來了新的問題,用兩種語言寫的程序很難修改或者擴展。
Julia 是這種復雜問題的一種解決方案。它的作者帶來了零 Python 程序員欣賞的干凈語法并且做了稍稍修改使之能夠在后臺編譯代碼。通過這種方式,你能夠像 Python 那樣打開個記事本或者命令行來編碼,但是你寫的任何代碼都會被即時編譯。
Julia 真是非常了不起的語言。它提供了非常強大的類型分析引擎能夠幫助優(yōu)化代碼。假如你喜歡元編程,這門語言提供了足夠的擴展接口。它最大的附加價值是通過集群發(fā)布并行算法的簡單機制。其內(nèi)置了大量的數(shù)學算法庫用來做數(shù)據(jù)分析。
最好的消息應該是它的運行速度。它的許多基本標準的運行速度是 Python 的30倍,甚至比 C 語言還快一點,假如你需要處理大量數(shù)據(jù)并且喜歡 Python 的語法,那么你最好快去學學 Julia 吧。