導讀:本文探討了Julia語言的開發緣由以及它的新特性。 筆者認為一門新語言的誕生勢必會掀起一陣新的旋風,開發者在享受它帶來樂趣的同時也在為它的存在價值而爭論不休,究竟Julia能否給開發者帶來新的福音呢? 讓我們來一同走進它:
為什麼要創建Julia程式設計語言?
用一句話來說,因為我們求知若渴、不斷追求。
我們擁有Matlab核心使用者,有擅長Lisp方面的駭客,Pythonistas和Rubyists方面的專家也有不少;此外,還有一些是Perl方面的大牛,有一部分開發者在我們剛略懂皮毛前便使用了Mathematica。 換句話說,他們懂的不僅僅是皮毛,比起其他人,開發R語言要多的多。 而C語言對我們來說卻是一塊荒島。
我們非常熱愛這些語言,他們是如此的完美和強大。 我們在科學計算、機器學、資料採礦,大型線性代數和分散式平行計算做了大量的研究工作——可以說每個專案都有各自的優勢,甚至給其他人產生畏懼。 任何一個專案都會權衡考量。
我們貪婪,我們想要的更多。
我們需要有一門開來源語言,這門語言在行業內是被公認許可的(基於許可證情況下)。 我們希望這門語言能夠有C語言一樣的速度,Ruby一樣得活力(dynamism)。 我們需要像homoiconic一樣的語言,它像Lisp一樣有宏,但是也像Matlab一樣有顯而易見、熟悉的數學標記。
我們希望傳統的程式設計語言像Python一樣適用,像R語言一樣適用于統計,像Perl一樣適用于字串處理,像線性代數Matlab一樣強大,像DOS命令一樣擅長粘合程式。 這似乎看起來簡單易學,但是想要讓駭客樂意去迎合它卻不是簡單之事。 我們希望它具有互動性且能夠被編譯。
像C語言一樣運行速度之快?
希望提供的需求:Hadoop分散式核心,因為沒有JAVA和XML千位元組的樣板檔,無法在數百台機器上通過千百萬位元組的日誌檔進行篩選查找Bug。
拒絕複雜化的操作許可權。 我們想寫一段簡單的分等級的迴圈(代碼),這段迴圈(代碼)通過一個單核CPU上的寄存器利用嚴密的機器代碼就可以編譯。 比如寫一個A*B的代碼,然後用一千台電腦進行1000次計算,這些電腦放在一起就是一個巨大的矩陣產品。
當我們不喜歡類型時,永遠不會提起它。 當需要動態函數時,需要利用泛型程式設計來編寫演算法並將其應用到類型中,尋求最佳方法從多重角度且有效的為所有函數挑選參數,通過數十種方法來定義不同類型間的共同特性,付出這麼多的努力,我們無非是想語言變得更加簡單、乾淨。
所有這些要求看起來並不過分,對嗎?
大約兩年半前,開始著手開發這門語言,那時還不是完整版,隨著發佈時間臨期將至,最終1.0版醞釀而生——我們將其命名為Julia。
1.0版基本上90%達到了我們的「無理」要求。 而現在需要您來提出「無理」要求並進一步改造它。 因此,如果您也是一名積極進取、求知若渴的程式師,您不妨來試一試。
程式設計語言新寵——Julia誕生
Julia是一個新的高性能動態高級程式設計語言。 語法和其他程式設計語言類似,易於其他語言使用者學習。 Julia擁有豐富的函式程式庫,提供了數位精度、精緻的增幅器(sophisticated amplifier)和分散式並行運行方式。 核心函式程式庫等大多數庫是由Julia編寫,但也用成熟的C和FORTRAN庫來處理線性代數、亂數產生和字串處理等問題。 Julia語言可定義函數並且根據使用者自訂的參數類型組合再進行重載。
JIT高性能編譯器
Julia使用的JIT(Just-in-Time)即時編譯器很有效地提高了它的運行效率,在某些地方甚至能比得上C和C++。
下面通過標準測試程式來測試下它的效率,你可以自己比較下各語言的運行效率。
注:運行環境是MacBook Pro,2.53GHz,Intel Core2 Duo CPU和8G 1066MHz,DDR3記憶體。
上表中只有C++執行時間是絕對時間,其它都是相對於C++的相對時間,數值越小代表用時越少。 除少數幾項測試Julia惜敗于Matlab和JavaScript外,Julia完勝其他高階語言,甚至在pi summation上,成功以25%的優勢擊敗C++。 通過使用Intel核心數學庫(MKL),MatLabs在矩陣乘法運算中稍佔便宜,但是擁有MKL授權的Julia同樣可以使用Intel MKL庫,不過預設的開源BLAS庫性能也不錯。
這個測試表是通過編譯器性能對一系列常用代碼模式進行分析而得出的。 比如:字串解析、函式呼叫/回檔、排序和數值迴圈、生成亂數和陣列運算等。
Julia克服了高階語言一直難以逾越的難關:標量算數迴圈(在pi summation上就能體現出來。 )。 Matlab的浮點運算JIT和 V8 JS引擎對此也處理得很好。 但JS不支援LAPACK等線性代數庫導致了在矩陣運算中的低性能,而Julia有比較多的方法消除負載(overhead),使得它可以輕鬆支援任何函式程式庫。
矩陣統計的Julia代碼雖然性能上比不上C++但卻要簡潔得多。 然而,規範和編制太過隨意可能會在將來成為一個問題。
Julia代碼示例:
為並行處理和雲計算而生
Julia為分散式運算提供很多關鍵模組,使得它可以更加靈活地支援多種並行處理。
雖然還是早期版本,Julia已經支援了雲計算。 下面是基於交互性的Julia會話截圖:
Julia將提供更加完整的性能支援雲計算操作,比如分享和編輯,包括資料管理、資料採礦和視覺化操作等。 它還允許使用者操作大資料類型而不用關心資料操作行為。
免費、開源和Library Friendly
TJulia的核心代碼遵循MIT協定,而其他庫各自遵循GPL/LGPL/BSD等協定。 使用者還可以方便地將Julia作為核心功能共用庫與C/FORTRAN代碼聯合使用。
(責任編輯:蒙遺善)