MIT 開發的 Julia 語言是全球熱度上升最快的程式語言之一,下載量超過 200 萬次,下載者包括谷歌、Facebook、FAA 和美國能源部等各個部門的開發者。近日,MIT CSAIL 實驗室正式釋出了 Julia 1.0,該語言期望結合 C 的速度、Matlab 的數學表徵、Python 的通用程式設計與 Shell 的膠水命令列,並構建開源、自由與便捷的程式語言。
-
Julia 語言的官網:julialang.org/
-
Julia 語言專案地址:github.com/JuliaLang
在過去一年中,研究者利用 Julia 在一臺超級計算機上分析天文影像,速度提升了 1000 倍,在 15 分鐘內將接近 2 億個天體進行分類。從技術上來看,這種語言還會長期發展下去。然而,現在是一個里程碑的時刻:在本週於倫敦舉辦的 Julia 語言年會上,Julia 1.0 正式釋出!一起釋出的還有 JuliaCon。
Julia 的開發者之一、就職於 MIT 電腦科學與人工智慧實驗室(CSAIL)的教授 Alan Edelman 表示:「Julia 1.0 的釋出證明,該語言已經做好準備,將 Python 和 R 的高效性和易用性與 C++的閃電速度結合在一起,改變技術世界。」
從實際應用來說,Julia 已經用於自動駕駛汽車、機器人和 3D 印表機,此外還廣泛應用於精準醫療、擴增實境、基因組學及風險管理。從 Julia 的生態系統來說,目前它主要的特徵或應用領域為資料視覺化、一般性的 UI 與網站、資料科學、機器學習、科學計算與平行計算等。
Julia 目前下載量已經達到了 200 萬次,且 Julia 社群開發了超過 1900 多個擴充套件包。這些擴充套件包包含各種各樣的數學庫、數學運算工具和用於通用計算的庫。除此之外,Julia 語言還可以輕鬆使用 Python、R、C/C++ 和 Java 中的庫,這極大地擴充套件了 Julia 語言的使用範圍。
Julia 1.0
備受期待的 Julia1.0 累積了開發者近十年的努力。JuliaCon2018 舉行了釋出會,該社群正式將該版本設定為 1.0.0.。
Julia 開發者對該語言提出了很多需求:
我們想要一種十分自由的開源語言,同時兼具 C 語言的速度和 Ruby 語言的靈活度。我們想要一種同像性語言,具有像 Lisp 一樣真正的巨集,也有像 Maltlab 一樣淺顯易懂的數學符號。它是像 Python 一樣有用的通用程式語言,像 R 語言一樣便於統計的語言,像 Perl 一樣自然的字串處理語言,像 Matlab 一樣強大的線性代數語言,也是像 shell 一樣的「膠水語言」。它簡單易學,卻能讓嚴苛的黑客們為之傾心。我們希望它兼具互動性和可編譯性。
圍繞這一語言,一個欣欣向榮的社群已經蓬勃發展起來,為了同一目標,世界各地的人們不斷地重塑並改進著 Julia。超過 700 人對 Julia 做出了實質性貢獻,更有不計其數的人制造了數千個驚人的 Julia 開源包。總之,我們構建了一種這樣的語言:
-
快速:Julia 為高效能而生。Julia 程式通過 LLVM 為多個平臺編譯高效的原生程式碼。
-
通用:它使用多分派作為範例,使得表達許多物件導向和函式式的程式設計模式變得容易。標準庫提供非同步 I/O、程式控制、日誌記錄、效能分析、包管理器等。
-
動態:Julia 是動態型語言,與指令碼語言類似,並且支援互動式使用。
-
專業:它擅長數值計算,其語法適用於數學,支援多種數值資料型別,並具有良好並行性。Julia 的多分派天生適合定義數字和類陣列的資料型別。
-
多樣:Julia 擁有豐富的描述性資料型別,型別宣告使程式條理清晰且穩定。
-
可組合:Julia 的包可以很好地組合在一起。單位數量的矩陣,或者貨幣和顏色的資料列表,都可以組合——而且效能很好。
現在 Julia 1.0 版本已經可以下載了。如果你從 Julia 0.6 或更早的版本升級程式碼,我們建議你首先使用過渡版本 0.7,它包含了棄用警告,可以幫助引導升級過程。如果你的程式碼沒有警告,那麼你就可以直接變更到 1.0 版本而不會產生任何功能性的改變。已註冊軟體包正利用 0.7 這個過渡版本,併發布了 1.0 的相容更新。
當然,Julia 1.0 中最重要的一個新特徵是對語言 API 穩定性的承諾:為 Julia 1.0 編寫的程式碼可以繼續在 Julia 1.1、1.2 等版本上使用。該語言是「完全成熟的」,核心語言開發者和社群都可以基於這個堅實的基礎構建新的包、工具和特徵。
Julia 1.0 不僅涉及穩定性,還引入了多種新的強大、創新性語言功能。自 0.6 版本以來的新功能如下,更多詳細與準確的內容請檢視更新文件原文:
-
一種全新的內建程式包管理器給 Julia 1.0 帶來巨大的效能提升,並令其相比以往更容易進行程式包和依賴庫安裝。它還支援每專案(per-project)的包環境,並記錄工作應用的明確狀態來和其他人(以及你的未來專案)共享。最後,該新設計還完全支援私人包和軟體包儲存庫。你可以使用相同的工具安裝和管理你用於開源包生態系統的私人包。JuliaCon 的展示視訊對新設計和行為提供了很好的概述。
-
Julia 擁有對缺失值的新的標準表示。允許表示和處理缺失資料對於統計和資料科學來說是很基礎的。在典型的 Julia 程式設計形式中,新的解決方案是通用的、可組合的和高效能的。任何泛用群集型別可以高效地支援缺失值,僅需要允許元素包含預定義值 missing。這種「統一型別化」的群集的效能在過去版本中可能會非常慢,但如今的編譯器改進已經允許 Julia 在其它系統中匹配自定義 C 或 C++的缺失值表示的速度,同時在通用性和靈活性上也遠遠超越過去的版本。
-
內建的 String 型別現在可以安全地支援任意資料。你的程式不會在一項工作中因為無效 Unicode 的單個丟失位元組就浪費數小時或數天的時間。所有的字串資料在指示哪些字元是有效或無效的同時就已經被儲存,允許你的應用安全、方便地處理包含所有不可避免瑕疵的真實世界資料。
-
廣播(broadcasting)由於方便的語法特性已經成為了一種核心的語言功能,並且已經比過去更加強大。在 Julia 1.0 中,可以很簡單地將廣播擴充套件到自定義型別,並在 GPU 和其它向量化硬體上實現高效的優化計算,為未來更高的效能效益奠定了基礎。
-
命名元陣列是一種新的語言功能,可以通過命名使資料表示和訪問更加高效和方便。例如,你可以將一行資料表示為 row = (name=”Julia”, version=v”1.0.0″, releases=8),並使用 row.version 來訪問 version 列,它與不那麼便利的 row [2] 有相同的效能。
-
點運算子現在可以過載,並允許型別使用 obj.property 句法獲取除 getting 和 setting 結構域外的含義。這對於使用 Python 和 Java 等面嚮物件語言之間更加平滑的互動操作非常有用。屬性訪問器過載還允許獲取一列資料的語法匹配命名元組的語法:你可以編寫 table.version 以訪問表中的 version 列,這就和使用 row.version 訪問行的 version 欄位一樣。
-
Julia 優化器在很多方面比我們列出來的特徵還要優秀,但這裡只會提一些亮點。優化器現在可以通過函式呼叫傳播常數,因此比以前能更好地消除無用程式碼和實現靜態評估。編譯器在避免為長期目標分配短期包裝器方面也做得更好,這使得開發者能使用便捷的高階抽象並且不會產生效能損失。
-
現在可以用宣告引數型別的建構函式的方式呼叫它們自己,這消除了語言句法中令人困惑且模糊的地方。
-
完全重新設計迭代協議,使之更易實現多種可迭代量。Julia 1.0 沒有設計三種不同泛型函式(start、next、done)的方法,而是設計 iterate 函式的一引數和二引數方法。這通常允許在開始狀態使用包含預設值的單一定義來便捷地定義迭代。更重要的是,這使得實現只在嘗試並無法生成值後才知道它們已經被實施過的迭代器成為可能。這些迭代器在輸入/輸出(I/O)、網路和生產者/消費者模式中是非常普遍的,Julia 可以用一種直接、準確的方式表達這些迭代器。
-
作用域規則(scope rule)被簡化。區域性作用域的結構現在可以一致地進行使用,不用管某命名的全域性約束是否已經存在。
-
Julia 語言本身是非常好的學習器,很多元件被分割封裝進 Julia 的「標準庫」包,而不是作為「基礎」語言的一部分。如果你需要它們,可以匯入它們(無需安裝)。未來,標準庫還將出現多種版本,並獨立於 Julia 更新,這使得它們可以更快地迭代。
-
我們已經對 Julia 的所有 API 進行了完全的評議,以改善穩定性和可用性。對很多模糊的已有命名和無效的程式設計模式進行了重新命名或重構,使之更匹配 Julia 的能力。這使得處理集合更加穩定和一致,以確保引數順序遵循 Julia 語言中一貫的標準,並在恰當的情況下將(更快的)關鍵詞引數整合進 API。
現在圍繞 Julia 1.0 的新功能專門構建了許多新的外部軟體包,如資料處理和操作生態系統的改進和異構架構支援的改進等。
Julia 1.0 還包括了無數其它的改進,如果想檢視完整的列表,請訪問:docs.julialang.org/en/release-…