未來明星語言Julia或成Python勁敵
“我們想要的是一種自由開源的語言,它同時(shí)擁有 C 的速度和 Ruby 的動(dòng)態(tài)性;我們想要一個(gè)具有同像性(可以將語言的腳本本身當(dāng)作數(shù)據(jù)進(jìn)行處理)的語言, 它有著真正的和 Lisp 一樣的宏,但卻像 MATLAB 一樣有著顯著的,類似于數(shù)學(xué)表達(dá)式的標(biāo)記;我們想要一個(gè)可以像 Python 一樣作為通用編程語言的工具, 像 R 那樣適用于統(tǒng)計(jì)分析,像 Perl 那樣自然地處理字符串,像 MATLAB 那樣給力地處理矩陣運(yùn)算,它還要能像 Shell 一樣作為膠水將各種程序粘合在一起;我們想要一個(gè)簡(jiǎn)單易學(xué)的語言,同時(shí)還能讓最苛刻的黑客們開心。我們希望它是交互式的,但我們也希望它能被編譯。” 去年今日,MIT Julia Lab 推出了 Julia 1.0 版。一年來,它的表現(xiàn)如何?
據(jù) MIT 報(bào)道,截至 2018 年底,Julia 的下載量超過 300 萬,并在超過 1500 所大學(xué)中用于科學(xué)和數(shù)值計(jì)算。根據(jù) 2019 年 8 月 TIOBE 編程語言指數(shù),Julia 從 7 月的第 50 名升至第 39 名,在眾多語言中上升幅度顯著。今年 7 月,在將 Python 解釋器移植到 Firefox 之后,Mozilla 出資將 Julia 引入 Firefox 和一般瀏覽器……
最近,Julia 開發(fā)團(tuán)隊(duì)對(duì)來自 90 多個(gè)國家的 1844 名 Julia 用戶和開發(fā)人員進(jìn)行了調(diào)查,結(jié)果顯示,93% 的受訪者喜愛 Julia,Python、C 排名第二、三位,分別獲得 61% 和 27% 的投票率。這份完整的調(diào)查報(bào)告在今年 7 月底的 JuliaCon 上發(fā)布。在此次會(huì)議上,開發(fā)者還宣布將發(fā)布一個(gè)全新的 Julia 線程接口—— 受到 Cilk 、 Intel Threading Building Blocks (TBB) 以及 Go 等啟發(fā)的通用任務(wù)并行機(jī)制。看起來,Julia 的進(jìn)化正在穩(wěn)步有序地進(jìn)行著。
Julia 會(huì)是編程語言中的“黑馬”嗎?你是否已經(jīng)準(zhǔn)備好學(xué)習(xí)這門崛起中的新語言了呢?
Julia 是什么?
Julia 誕生于 MIT 計(jì)算機(jī)科學(xué)與人工智能實(shí)驗(yàn)室 (CSAIL) 和數(shù)學(xué)系,由 Jeff Bezanson 博士、前 MIT Julia Lab 研究員 Stefan Karpinski、Viral B. Shah 和數(shù)學(xué)系教授 Alan Edelman 于 2009 年創(chuàng)建,并于 2012 年公開發(fā)布。開發(fā)者在 2012 年 2 月的博客中寫道,
“我們想要的是一種自由開源的語言,它同時(shí)擁有 C 的速度和 Ruby 的動(dòng)態(tài)性;我們想要一個(gè)具有同像性(可以將語言的腳本本身當(dāng)作數(shù)據(jù)進(jìn)行處理)的語言, 它有著真正的和 Lisp 一樣的宏,但卻像 MATLAB 一樣有著顯著的,類似于數(shù)學(xué)表達(dá)式的標(biāo)記;我們想要一個(gè)可以像 Python 一樣作為通用編程語言的工具, 像 R 那樣適用于統(tǒng)計(jì)分析,像 Perl 那樣自然地處理字符串,像 MATLAB 那樣給力地處理矩陣運(yùn)算,它還要能像 Shell 一樣作為膠水將各種程序粘合在一起;我們想要一個(gè)簡(jiǎn)單易學(xué)的語言,同時(shí)還能讓最苛刻的黑客們開心。我們希望它是交互式的,但我們也希望它能被編譯。”
Julia 是一門靈活的動(dòng)態(tài)語言,適用于科學(xué)計(jì)算和數(shù)值計(jì)算,其性能可與傳統(tǒng)的靜態(tài)類型語言媲美。它具有如下特點(diǎn):
-
快速:Julia 一開始就是為高性能而設(shè)計(jì)的。Julia 可以通過 LLVM 而跨平臺(tái)被編譯成高效的本地代碼。
-
通用:Julia 使用多重派發(fā)作為編程范式,使其更容易表達(dá)面向?qū)ο蠛秃瘮?shù)式編程范式。標(biāo)準(zhǔn)庫提供了異步 I/O、進(jìn)程控制、日志記錄、性能分析、包管理器等等。
-
動(dòng)態(tài):Julia 是動(dòng)態(tài)類型的,與腳本語言類似,并且對(duì)交互式使用具有很好的支持。
-
數(shù)值計(jì)算:Julia 擅長(zhǎng)于數(shù)值計(jì)算,它的語法適用于數(shù)學(xué)計(jì)算,支持多種數(shù)值類型,并且支持并行計(jì)算。Julia 的多分派自然適合于定義數(shù)值和類數(shù)組的數(shù)據(jù)類型。
-
可選的類型標(biāo)注:Julia 擁有豐富的數(shù)據(jù)類型描述,類型聲明可以使得程序更加可讀和健壯。
-
可組合:Julia 的包可以很自然的組合運(yùn)行。單位數(shù)量的矩陣或數(shù)據(jù)表一列中的貨幣和顏色可以一起組合使用并且擁有良好的性能。
2018 年 12 月,Julia 的三位聯(lián)合開發(fā)者 Bezanson、Karpinski 和 Shah 獲得 2019 年 James H.Wilkinson 數(shù)字軟件獎(jiǎng)。根據(jù)選拔委員會(huì)的一份聲明,“Julia 允許研究人員以直觀的語法編寫高級(jí)代碼,并以生產(chǎn)編程語言的速度生成代碼。它已被科學(xué)計(jì)算界廣泛采用,包括天文學(xué)、經(jīng)濟(jì)學(xué)、深度學(xué)習(xí)、能源優(yōu)化和醫(yī)學(xué)等應(yīng)用領(lǐng)域。尤為特別的是,美國聯(lián)邦航空管理局選擇 Julia 作為下一代機(jī)載防撞系統(tǒng)的語言。”
在 GitHub 上有 Julia 應(yīng)用于 計(jì)算生物學(xué)、統(tǒng)計(jì)學(xué)、機(jī)器學(xué)習(xí)、圖像處理、微分方程 和 物理學(xué) 等領(lǐng)域的小組。根據(jù) 最新調(diào)查報(bào)告,目前,Julia 的主要應(yīng)用領(lǐng)域包括統(tǒng)計(jì)學(xué)與數(shù)據(jù)科學(xué)、工程學(xué)、機(jī)器學(xué)習(xí)、計(jì)算機(jī)科學(xué)、物理學(xué)、數(shù)學(xué)、人工智能、信號(hào)與圖像處理等。73% 的用戶使用 Julia 從事科研工作,54% 的用戶將其用于個(gè)人工作,16% 的用戶將其用于教學(xué)。
與 Python 的區(qū)別
- Julia 需要用 end 來結(jié)束代碼塊。與 Python 不同,Julia 沒有 pass 關(guān)鍵字。
- 在 Julia 中,數(shù)組、字符串等的索引從 1 開始,而不是從 0 開始。
- Julia 的切片索引包含最后一個(gè)元素,這與 Python 不同。Julia 中的 a[2:3] 就是 Python 中的 a[1:3]。
- Julia 不支持負(fù)數(shù)索引。特別地,列表或數(shù)組的最后一個(gè)元素在 Julia 中使用 end 索引,而不像在 Python 中使用 -1。
- Julia 的 for、if、while 等代碼塊由 end 關(guān)鍵字終止??s進(jìn)級(jí)別并不像在 Python 中那么重要。
- Julia 沒有用來續(xù)行的語法:如果在行的末尾,到目前為止的輸入是一個(gè)完整的表達(dá)式,則認(rèn)為已經(jīng)結(jié)束;否則,認(rèn)為輸入繼續(xù)。強(qiáng)制表達(dá)式繼續(xù)的一種方式是將其包含在括號(hào)中。
- 默認(rèn)情況下,Julia 數(shù)組是列優(yōu)先的(Fortran 順序),而 NumPy 數(shù)組是行優(yōu)先(C 順序)。為了在循環(huán)數(shù)組時(shí)獲得最佳性能,循環(huán)順序應(yīng)該在 Julia 中相對(duì)于 NumPy 反轉(zhuǎn)(請(qǐng)參閱 Performance Tips 中的對(duì)應(yīng)章節(jié))。
- Julia 的更新運(yùn)算符(例如 +=,-=,···)是 not in-place,而 Numpy 的是。這意味著 A = [1, 1]; B = A; B += [3, 3] 不會(huì)改變 A 中的值,而將名稱 B 重新綁定到右側(cè)表達(dá)式 B = B + 3 的結(jié)果,這是一個(gè)新的數(shù)組。對(duì)于 in-place 操作,使用 B .+= 3(另請(qǐng)參閱 dot operators)、顯式的循環(huán)或者 InplaceOps.jl。
- 每次調(diào)用方法時(shí),Julia 都會(huì)計(jì)算函數(shù)參數(shù)的默認(rèn)值,不像在 Python 中,默認(rèn)值只會(huì)在函數(shù)定義時(shí)被計(jì)算一次。例如,每次無輸入?yún)?shù)調(diào)用時(shí),函數(shù) f(x=rand()) = x 都返回一個(gè)新的隨機(jī)數(shù)在另一方面,函數(shù) g(x=[1,2]) = push!(x,3) 在每次以 g() 調(diào)用時(shí)返回 [1,2,3]。
- 在 Julia 中,% 是余數(shù)運(yùn)算符,而在 Python 中是模運(yùn)算符。
與 MATLAB、R、C/C++ 的區(qū)別詳見 文檔。
為什么用 Julia?
Julia 最受歡迎的技術(shù)特征包括快速和高性能、易于使用、開源、多重派發(fā)以及解決了兩種語言問題;最受歡迎的非技術(shù)特征包括自由、社區(qū)開發(fā)者富有才華且活躍、易于創(chuàng)建包以及采用 MIT 許可證。
Julia 最大的技術(shù)問題在于包并不像所需的那樣成熟或維護(hù)良好、生成第一個(gè)圖需要很長(zhǎng)時(shí)間;最大的非技術(shù)問題在于同事、公司或合作者使用其他語言,在用戶所在的領(lǐng)域 / 行業(yè)中,沒有足夠的 Julia 用戶。
據(jù)外媒 ZDNet 此前發(fā)布的數(shù)據(jù),Julia 的 GitHub Star 數(shù)在過去一年翻了一番,該語言還被 1000 多種學(xué)術(shù)出版物引用。
關(guān)于”為什么你會(huì)使用 Julia“的問題,52% 的受訪者表示,Julia 似乎是未來的語言,43% 的人認(rèn)為,它能使工作速度更快。
你是否已經(jīng)準(zhǔn)備好學(xué)習(xí)這門新語言了?