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