Julia 1.0 正式發佈 (Traditional Chinese)

8 August 2018 | the Julia developers

Translations: Simplified Chinese, Traditional Chinese, Spanish

眾所期待的 Julia 語言 1.0 版是近十年的心血結晶。 在 JuliaCon 2018 年會上,Julia 社群歡慶並共同正式地將該版本 升級為 1.0.0

Julia 語言 第一次公開發佈 並有不少強烈的期待:

我們想要一個開源的語言,擁有自由的版權。我們想要 C 的速度和 Ruby 的動態。我們想要有一個語法與內在表示有一致性(homoiconic)的語言, 並且像 Lisp 一樣擁有真的 macro,但是擁有像 Matlab 一樣熟悉好懂的數學符號。我們也想要像 Python 一樣好用的泛用型程式語言, 處理統計要和 R 一樣,處理字串要和 Perl 一樣地自然,要有和 Matlab 一樣強大的線性代數功能,串接程式要如同 shell 一樣好用。 要學習的東西極致簡單,同時能讓大多數嚴苛的黑客寫起來開心。我們希望它是互動式的而且也是可編譯的。

一個充滿活力和繁榮的社群圍繞著這樣的語言成長起來,來自世界各地的人們都在為了這個目標而努力不懈地改進和塑造 Julia。 超過 700 人對 Julia 做出了貢獻,更多人創造了上千的開源的 Julia 套件。總而言之,我們創造了這樣一種語言:

現在可以 下載 Julia 1.0 版本 來試試 Julia。 如果你現在從 Julia 0.6 或者更早的版本開始升級程式碼,我們建議你先使用過渡的 0.7 版本, 其中包括了棄用警告(deprecation warning)來指導你升級的過程。一旦你的程式碼無警告通過, 那麼你可以無痛將程式碼更改為 1.0 版本。 已註冊過的套件可以利用這個來作為墊腳石並發布與 1.0 相容的版本更新。

當然,在 Julia 1.0 版本中一個最重要的新特性是對語言 API 穩定性的保證:你為 Julia 1.0 撰寫的程式碼將可以繼續在 Julia 1.1、1.2 中執行。這種語言是 足夠成熟的。基於這樣的一個穩固的基礎, 核心語言的開發者和社群都可以集中於第三方套件,工具,和新特性的開發上。

但是 Julia 1.0 並不只意味著穩定,它也引入一些新的、強大的以及新穎的語言特性。其中一些新的特性是 0.6 版就有的:

它也為每個專案支援虛擬環境並記錄目前工作環境的狀態然後將它分享給其它開發者或者是自己。最後重新設計的套件管理器也帶來了 私有套件和 repository 的無縫銜接。你同樣可以使用開源套件的方式來管理及安裝自己的私有套件。這個 JuliaCon 的演講 展示了套件管理器的新設計。

在典型的 Julia 寫法(Julian fashion)裡,新的解決方案是具有廣義性、組合性,也是高效能的。任何一般的集合型別(collection type)都可以簡單地使用 預先定義好的 missing 變數來有效支援遺失值。而這種集合型別的效能在過去的 Julia 版本里可能會很慢,但是現在編譯器已經 可以使得 Julia 在遺失值的表示上達到類似 C 或者 C++ 的速度,然而遠比 C 或者 C++ 更廣義和靈活。

所有的字串資料會保留,同時指出哪些字元是有效的,哪些是無效的,這樣允許你的應用程式安全而方便地執行在不可避免缺陷的真實世界的資料中。

賦予自定義型別 broadcasting 特性 和在 GPU 和向量化硬體上實作最佳的運算都更加容易, 這是為未來更多的效能提升鋪路。

row = (name="Julia", version=v"1.0.0", releases=8) 並且透過 row.version 存取 version 資料,而這和 row[2]有著同樣的效能,卻更加方便。

這有助於將以類別為基礎的語言例如 Python 和 Java 更加流暢地翻譯到 Julia。屬性存取器的重載讓存取一行資料與 named tuples 的存取語法一致:你可以寫 table.version 來獲取表格中的 version 這一行,就如同 row.version 會取得 version 這一列的這個欄位一樣。

呼叫之間傳遞常數,這將使得編譯器可以有比過去更好地執行死碼刪除(dead-code elimination)和靜態求值。編譯器現在也能夠避免對短期封裝(short-lived wrappers)的 長期物件(long-lived objects)做記憶體配置,這讓程式設計師可以用方便的高階抽象而不會有效能損失。

和兩個參數的 iterate 函式即可。這允許我們可以簡單地定義一個帶有預設值的函式來給出一個初始值。更重要的是,這也實現了一個只有在嘗試回傳失敗之後就結束的迭代器。這種迭代器可以非常普遍使用在 I/O、網絡和生產者-消費者模型中;而 Julia 現在 可以更直接和正確地撰寫這樣的迭代器。

這將消除之前的 “軟/硬作用域” 的區別,也意味著現在 Julia 可以靜態地確定變數是區域的還是全域的。

如果你需要他們,那麼只需引入這些函式庫即可(不需要再安裝)但是不會強制使用。在未來這些標準函式庫將會獨立被標記版本和更新 以達到更快的改進和升級。

我們仔細地審查了 Julia 的 API,並且提高了它的一致性和可用性。很多費解的命名和低效的實作都被重新命名和重構, 能夠更優雅地發揮 Julia 的能力。這樣的改變促使集合的使用方式更加一致和連貫。確保在整個語言中遵循一致的參數的順序, 並且將關鍵字參數(現在更快了)整合到了 API 中。

還有無數個大大小小的改善。你可以查看 0.7 NEWS 文件 當中的完整的更新。 在我們 2012 年的 "為什麼我們創造 Julia" 文章 裡,我們寫到:

它還沒有完工,但是是時候發布一個 1.0 版本了(其實歷時 6 年才發布)—— 我們創造了一個語言叫做 Julia。

雖然對於 1.0 的發布我們放了大家好幾次鴿子,但是這一次我們終於正式發布了。 我們真心為上千位以各種形式貢獻給這個真正的數值計算和泛用程式設計的現代語言的人感到自豪和無比欣喜。