Julia 1.0 (Simplified Chinese)

Julia 1.0 (Simplified Chinese)
08 Aug 2018

備受期待的Julia語言的1.0版本積累了富有野心的程序員們的十年心血。 在 JuliaCon2018 發布會上,Julia 社區正式將該版本設置為1.0.0

Julia項目起初是因為這些強烈的需求而公開發起的開源項目:

我們想要的是一個自由開源的語言,并且它同時擁有C的速度和Ruby的動態性;我們想要一個具有同像性(可以將語言的腳本本身當作數據進行處理)的語言, 它有著真正的和lisp一樣的宏,但是卻像Matlab一樣有著顯然的,類似于數學表達式的標記;我們想要一個既可以像Python一樣作為通用編程語言的工具, 又可以像R那樣適用于統計分析,能像Perl那樣自然地處理字符串,能像Matlab那樣給力地處理矩陣運算,它還要能像shell一樣作為膠水將各種程序粘 合在一起;我們想要一個簡單易學的語言,同時它還能讓最苛刻的魔法師們(hackers)開心。我們希望它是交互式的,但我們也希望它能被編譯。

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

  • 快速:Julia一開始就是為高性能而設計的。Julia可以通過LLVM而跨平臺被編譯成高效的本地代碼。
  • 通用:Julia使用多分派作為編程范式,使其更容易表達面向對象和函數式編程范式。標準庫提供了異步I/O,進程控制,日志記錄,性能分析,包管理器等等。
  • 動態:Julia是動態類型的,與腳本語言類似,并且對交互式使用具有很好的支持。
  • 數值計算:Julia擅長于數值計算,它的語法適用于數學計算,支持多種數值類型,并且支持并行計算。Julia的多分派自然適合于定義數值和類數組的數據類型。
  • 可選的類型標注:Julia擁有豐富的數據類型描述,類型聲明可以使得程序更加可讀和健壯。
  • 可組合:Julia的包可以很自然的組合運行。單位數量的矩陣或數據表一列中的貨幣和顏色可以一起組合使用并且擁有良好的性能。

現在可以通過下載Julia 1.0版本來嘗試Julia。 如果你現在從Julia 0.6或者更早的版本開始升級代碼,我們建議你先使用過渡性的0.7版本, 其中包括了棄用警告(deprecation warning)來指導你的升級過程。一旦你的代碼無警告通過, 那么你可以在沒有任何功能變化的情況下將代碼更改為1.0版本。 已注冊過的包可以利用這個來過渡并發布與1.0版本兼容的更新。

當然,在Julia 1.0版本中一個最重要的新特性是對語言API穩定性的承諾:你為Julia1.0編寫的代碼將可以繼續在 Julia 1.1, 1.2中運行。這種語言是“足夠成熟的”。基于這樣的一個堅實的基礎, 核心語言的開發者和社區都可以集中于第三方包,工具,和新特性的開發上。

但是Julia 1.0并不意味著穩定,它也帶來一些新的,強大的并且創新的語言特性。其中一些新的特性是0.6開始就有的:

  • 一個全新的內建 包管理器。它比過去的包管理器性能更好, 也更加簡單。它也支持虛擬環境和記錄當前工作環境的狀態然后將其分享給其它開發者或者是自己。最后重新設計的包管理器也帶來了 私有包和包的倉庫的無縫銜接。你可以用使用開源生態同樣的方式用它來管理自己的私有包。這個 JuliaCon的幻燈片 展示了新設計的包管理器。

  • Julia具有新的 對于缺失值(missing value)的正則表達。處理缺失值的能力對于統計學和數據科學是一項基本能力。 在典型的Julia寫法里,這個解決方案是一般性的,可擴展的也是高性能的。任何一般的集合類型(collection type)都可以簡單地通過使用 預先定義好的 missing 變量來有效支持缺失值。而這樣的集合類型的性能在過去的Julia版本里可能會很慢,但是現在編譯器已經 可以使得Julia在缺失值的表示上達到類似 C 或者 C++ 的速度,而遠比 C 或者 C++ 一般和靈活。

  • 內建的 String 類型可以安全的使用任意的數據類型。你的程序不會因為一個單獨的無效Unicode字節而失效好幾個小時或者好幾天。 所有的字符串數據會保留,同時指出哪些字符是有效的哪些是無效的,這樣允許你的應用安全并方便地運行在不可避免會出現缺陷的真實世界的數據中。

  • 盡管廣播早已成為一項語言的核心特性并且有著方便的語法支持,而現在它將比過去更加強大。在Julia 1.0里為自定義類型擴展 廣播和實現高效的GPU和向量化硬件上的擴展都 更加容易,為未來實現更高的性能鋪平了道路。

  • 可命名元組是一個新的語言特性,它將是的通過名字直接獲取數據變得更加高效和方便。例如,你可以這樣表示一列數據 row = (name="Julia", version=v"1.0.0", releases=8) 并且通過 row.version 訪問 version 的數據,而這和 row[2] 有著相似的性能,但是卻更加方便。

  • 點算符現在可以被重載,并且允許類型使用類似于 obj.property 的方式表示某種意義,而不是用來設置和獲取合成類型(struct)的 成員。這對于將具有 class 的語言例如 PythonJava 翻譯到Julia來說更加平滑。性質的訪問器重載也將是的獲取匹配數據的名 稱的一列于可命名元組更加一致:你可以寫 table.version 來獲取表格中的 version 這一列就好像 row.version 會獲取 version 這一行的這個元素一樣。

  • Julia的優化器在諸多方面都更加聰明來,以至于我們無法全部列在這里,但是可以列舉一些重要的特點。優化器現在可以在函數 調用之間傳播常數變量,這將使得編譯器可以比過去更好的消除死代碼(dead-code)和進行靜態求值。編譯器現在也能夠對短期存在 的長期對象的封裝避免多余的內存分配,這將使得程序員可以使用更方便的高級抽象而不會擔心帶來性能損失。

  • 參數類型的構造函數現在將使用和聲明同樣的語法來調用。這將減少一些對語法小的誤解。

  • 迭代器協議被重新設計。新的迭代器協議更加簡單,而不需要定義三個不同的函數:startnextdone。現在只需定義一個變量 和兩個變量的 iterate 函數即可。這將常常使得我們可以簡單地通過定義了一個函數參數默認值的函數來實現迭代器。更加重要的是,這將使得 實現一個只有在嘗試返回值失敗之后才知道需要結束的迭代器成為可能。這種迭代器在 I/O,網絡和生產者/消費者模型中普遍存在;而Julia現在 可以以更加直接和正確的方式表達這樣的迭代器。

  • 作用域的規則被簡化了。引入局部作用域的構造將更加一致,而不需要管全局的命名綁定是否已經存在。 這將消除之前存在的 “軟/硬 作用域”的區別,也意味著現在Julia可以靜態地確定變量是局部的還是全局的。

  • Julia語言本身變得更加輕量級來,很多部分都不放在來標準庫中。這個標準庫將和Julia一起發布但是不會作為語言的基礎依賴。 如果你需要他們,那么只需導入這些庫即可(不需要再安裝)但是它們不再強制你使用了。在未來這些標準庫將會單獨被標記版本和更新 以獲取更快的改進和升級。

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

  • 圍繞Julia 1.0的新特性,我們特別地創建了一些新的外部包:
    • 數據處理生態系統通過翻新利用了新的缺失值支持
    • Cassette.jl將為Julia帶來向編譯器中注入代碼變換,使得 事后分析(post-hoc analysis)和擴展已有的代碼成為可能。在除了提供profiling和debugging這樣的工具之外, 這甚至可以用于實現用于機器學習任務的自動微分。
    • 異構計算的支持被大大提高,并且從Julia編譯器中分離了出來。Intel KNL系列硬件可以直接使用Julia。而Nvidia的GPU 也可以通過CUDANative.jl來直接編程(無須編寫CUDA代碼),而 支持Google TPU的接口也正在開發中。

還有很多沒有被列舉的大大小小的提高。你可以通過 0.7 NEWS 文件查看 完整的更新。在我們2012年的 “為什么我們創造來Julia”博文里,我們寫到:

它還沒有完工——但是已經可以發布一個1.0版本了(其實等了6年才要發布)——我們創造的這個語言叫做Julia。

雖然對于1.0的發布我們放了大家好幾次鴿子,但是這一次我們終于正式發布了。 我們真心為所有為這個真正為數值計算和通用編程設計的現代語言的各種形式的貢獻的人感到自豪和高興。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容