編程語言新寵兒 - Julia 誕生記

openkk 12年前發布 | 21K 次閱讀 編程語言

導讀:本文作者Stefan Karpinski是一名數據科學家和應用數學家。曾就職于AkamaiCitrix OnlineEtsyViral Shah愛好對高性能計算機研究工作,曾就職于微軟Star-P部門;Alan Edelman是一名教授,從事高性能計算、數值計算、線性代數、隨機特征分析(隨機矩陣理論)等方面研究。文中探討了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++。

下面通過標準測試程序來測試下它的效率,你可以自己比較下各語言的運行效率。

編程語言新寵兒 - Julia 誕生記

注:運行環境是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代碼示例:

function mandel(z)  
    c = z 
    maxiter = 80 
    for n = 1:maxiter  
        if abs(z) > 2  
            return n-1  
        end  
        zz = z^2 + c  
    end  
    return maxiter  
end  

function randmatstat(t)  
    n = 5 
    v = zeros(t)  
    w = zeros(t)  
    for i = 1:t  
        a = randn(n,n)  
        b = randn(n,n)  
        c = randn(n,n)  
        d = randn(n,n)  
        P = [a b c d]  
        Q = [a b; c d]  
        v[i] = trace((P.'*P)^4)  
        w[i] = trace((Q.'*Q)^4)  
    end  
    std(v)/mean(v), std(w)/mean(w)  
end  

為并行處理和云計算而生

Julia為分布式計算提供很多關鍵模塊,使得它可以更加靈活地支持多種并行處理。

雖然還是早期版本,Julia已經支持了云計算。下面是基于交互性的Julia會話截圖:

編程語言新寵兒 - Julia 誕生記

Julia將提供更加完整的性能支持云計算操作,比如分享和編輯,包括數據管理、數據挖掘和可視化操作等。它還允許用戶操作大數據類型而不用關心數據操作行為。

免費、開源和Library Friendly

TJulia的核心代碼遵循MIT協議,而其他庫各自遵循GPL/LGPL/BSD等協議。用戶還可以方便地將Julia作為核心功能共享庫與C/FORTRAN代碼聯合使用。

原文出處:julialang.org itechcrazy.com

 本文由用戶 openkk 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!