動(dòng)態(tài)編程語(yǔ)言 Julia 迎來(lái)了 1.0 正式版本。
Julia 可以看作是一門集眾家之所長(zhǎng)的編程語(yǔ)言,在首次公開時(shí)開發(fā)團(tuán)隊(duì)就已明確其需求:
我們想要一種擁有自由許可的開源語(yǔ)言,同時(shí)擁有 C 的速度和 Ruby 的靈活。我們想要一種同像性語(yǔ)言,有像 Lisp 這樣真正的宏,也有像 Matlab 這樣的淺顯熟悉的數(shù)學(xué)符號(hào)。我們想要一門像 Python 一樣可用于通用編程,像 R 一樣易于統(tǒng)計(jì),像 Perl 一樣自然地用于字符串處理,像 Matlab 一樣強(qiáng)大的線性代數(shù),像 shell 一樣擅長(zhǎng)將程序粘合在一起的語(yǔ)言。它簡(jiǎn)單易學(xué),卻能讓嚴(yán)苛的黑客為之傾心。我們希望它是交互式的,具備可編譯性。
開發(fā)團(tuán)隊(duì)表示,圍繞這一語(yǔ)言,一個(gè)充滿活力的社區(qū)已蓬勃發(fā)展起來(lái),為實(shí)現(xiàn)同一目標(biāo),來(lái)自世界各地的開發(fā)者們不斷地重塑并精煉 Julia 。超過(guò) 700 人對(duì) Julia 做出了實(shí)質(zhì)性貢獻(xiàn),還有更多的人數(shù)以千計(jì)的令人驚嘆的 Julia 開源包??傊?,我們構(gòu)建了這樣一種語(yǔ)言: 快速:Julia 為高性能而生。Julia 程序通過(guò) LLVM 為多個(gè)平臺(tái)編譯高效本地代碼。 通用:它使用多分派(multiple dispatch)作為范例,使得表達(dá)許多面向?qū)ο蠛秃瘮?shù)式編程模式變得容易。標(biāo)準(zhǔn)庫(kù)提供異步 I / O 、進(jìn)程控制、日志記錄、性能分析、包管理器等。 動(dòng)態(tài):Julia 是動(dòng)態(tài)編程語(yǔ)言,與腳本語(yǔ)言相似,并且對(duì)交互式使用有很好的支持。 專業(yè):它擅長(zhǎng)于數(shù)值計(jì)算,其語(yǔ)法非常適合數(shù)學(xué),支持多種數(shù)字?jǐn)?shù)據(jù)類型,和開箱即用的并行性。Julia 的多分派非常適合定義數(shù)字和數(shù)組類型的數(shù)據(jù)類型。 (可選)多樣:Julia 具有豐富的描述性數(shù)據(jù)類型,類型聲明可用于闡明和鞏固程序。 可組合:Julia 的包可以很好地協(xié)同工作。單位數(shù)量的矩陣,或貨幣和顏色的數(shù)據(jù)表列都可以組合工作 - 并具有良好的性能。
想要嘗試 1.0 的用戶,如果是從 Julia 0.6 或更早版本升級(jí)代碼,建議先使用 0.7 過(guò)渡版。0.7 版本包括棄用警告,可以幫助指導(dǎo)你完成升級(jí)過(guò)程。等到你的代碼不再出現(xiàn)警告,就可以直接升級(jí)至 1.0 而不會(huì)產(chǎn)生任何功能性更改。已注冊(cè)的軟件包也正在利用 0.7 的過(guò)渡期發(fā)布 1.0 兼容的更新。
當(dāng)然,Julia 1.0 中最重要的一個(gè)新特性是對(duì)語(yǔ)言 API 穩(wěn)定性的承諾:你為 Julia 1.0 編寫的代碼將可以繼續(xù)在 Julia 1.1、1.2 等版本中運(yùn)行。語(yǔ)言是“完全成熟的”,核心語(yǔ)言開發(fā)者和社區(qū)都可以專注于基于這個(gè)堅(jiān)實(shí)的基礎(chǔ)去構(gòu)建軟件包、工具和新特性。
Julia 1.0 不僅僅涉及穩(wěn)定性,還引入了一些新的、強(qiáng)大的和創(chuàng)新的語(yǔ)言功能。自 0.6 版本以來(lái)的一些新特性包括: 全新的內(nèi)置包管理器帶來(lái)了巨大的性能改進(jìn),使包及其依賴項(xiàng)安裝變得前所未有的簡(jiǎn)單。它還支持 per-project 的包環(huán)境,并記錄工作應(yīng)用的確切狀態(tài),以便與他人共享 - 以及你未來(lái)的項(xiàng)目。此外,還引入了對(duì)私有包和包存儲(chǔ)庫(kù)的無(wú)縫支持。你可以使用與開源軟件包生態(tài)系統(tǒng)相同的工具來(lái)安裝和管理私有軟件包。 Julia 有一個(gè)新的缺失值表示規(guī)范。能夠表示和處理缺失的數(shù)據(jù)是統(tǒng)計(jì)和數(shù)據(jù)科學(xué)的基礎(chǔ)。采用典型的 Julian 方式,新的解決方案具有通用性、可組合性和高性能。任何泛型集合類型都可以通過(guò)允許元素包含預(yù)定義值來(lái)有效地支持缺失值 missing 。在之前的 Julia 版本中,這種“統(tǒng)一類型化”集合的性能會(huì)太慢,但隨著編譯器的改進(jìn)允許 Julia 匹配其他系統(tǒng)中自定義 C 或 C ++ 缺失數(shù)據(jù)表示的速度,同時(shí)也更加通用和靈活。 內(nèi)置 String 類型現(xiàn)在可以安全地保存任意數(shù)據(jù)。你的程序不會(huì)因?yàn)闊o(wú)效 Unicode 的單個(gè)丟失字節(jié)就浪費(fèi)數(shù)小時(shí)或數(shù)天的時(shí)間。保留所有字符串?dāng)?shù)據(jù),同時(shí)指示哪些字符有效或無(wú)效,使你的應(yīng)用程序可以安全方便地處理具有所有不可避免的瑕疵的真實(shí)數(shù)據(jù)。 廣播(broadcasting)已經(jīng)成為一種具有方便語(yǔ)法特性的核心語(yǔ)言功能 - 它現(xiàn)在比以往更強(qiáng)大。在 Julia 1.0 中,將廣播擴(kuò)展到自定義類型并在 GPU 和其他矢量化硬件上實(shí)現(xiàn)高效優(yōu)化計(jì)算很簡(jiǎn)單,為將來(lái)更高的性能提升鋪平了道路。 命名元數(shù)組是一種新的語(yǔ)言特性,它使得通過(guò)名稱有效和方便地表示和訪問(wèn)數(shù)據(jù)。例如,你可以將一行數(shù)據(jù)表示為 row = (name='Julia', version=v'1.0.0', releases=8) 并使用 row.version 訪問(wèn)該 version 列,其性能與不那么方便的 row[2] 相同。 點(diǎn)運(yùn)算符現(xiàn)在可以重載,允許類型使用 obj.property 語(yǔ)法來(lái)獲取除 getting 和 setting 結(jié)構(gòu)字段之外的含義。這對(duì)于使用 Python 和 Java 等面向?qū)ο蟮恼Z(yǔ)言進(jìn)行更順暢的互操作時(shí)特別有用。屬性訪問(wèn)器重載還允許獲取一列數(shù)據(jù)以匹配命名元組語(yǔ)法的語(yǔ)法:你可以編寫 table.version 訪問(wèn) version 列,就像使用 row.version 訪問(wèn) version 行的字段一樣。 Julia 的優(yōu)化器在很多方面遠(yuǎn)比下面列出來(lái)的還要更聰明,但這些亮點(diǎn)仍值得一提。優(yōu)化器現(xiàn)在可以通過(guò)函數(shù)調(diào)用傳播常量,從而允許比以前更好地消除無(wú)用代碼和靜態(tài)評(píng)估。編譯器在避免在長(zhǎng)期對(duì)象周圍分配短期包裝器方面也要好得多,這使得開發(fā)者可以使用方便的高級(jí)抽象而無(wú)需降低性能成本。 現(xiàn)在始終使用與聲明相同的語(yǔ)法調(diào)用參數(shù)類型構(gòu)造函數(shù),這消除了語(yǔ)言語(yǔ)法中比較模糊且令人困惑的角落。 迭代協(xié)議已經(jīng)完全重新設(shè)計(jì),以便更容易實(shí)現(xiàn)多種迭代。 作用域規(guī)則(scope rule)已經(jīng)簡(jiǎn)化。無(wú)論命名的全局綁定是否已存在,局部作用域的結(jié)構(gòu)現(xiàn)在都是一致的。這消除了先前存在的 “soft/hard scope” 差異,并且意味著 Julia 現(xiàn)在可以始終靜態(tài)地確定變量是本地的還是全局的。 語(yǔ)言本身非常精簡(jiǎn),許多組件被拆分為“標(biāo)準(zhǔn)庫(kù)”軟件包,而不再屬于“基礎(chǔ)”語(yǔ)言的一部分。如果需要,可以導(dǎo)入它們(不需要安裝),但它們不再被強(qiáng)加給你。在未來(lái),這也將允許標(biāo)準(zhǔn)庫(kù)獨(dú)立于 Julia 本身進(jìn)行版本控制和升級(jí),從而允許它們以更快的速度發(fā)展和改進(jìn)。 對(duì) Julia 的所有 API 進(jìn)行徹底的評(píng)估,以提高一致性和可用性。許多模糊的遺留命名和低效的編程模式已被重命名或重構(gòu),以更優(yōu)雅地匹配 Julia 的功能。這使得處理集合更加一致和連貫,以確保參數(shù)排序遵循整個(gè)語(yǔ)言的一致標(biāo)準(zhǔn),并在適當(dāng)?shù)臅r(shí)候(更快的)將關(guān)鍵字參數(shù)整合到 API 中。
此外,圍繞 Julia 1.0 的新特性,還正在構(gòu)建許多新的外部軟件包。像是: 改進(jìn)數(shù)據(jù)處理和操作生態(tài)系統(tǒng),以利用新的缺失支持。 Cassette.jl 提供了一種強(qiáng)大的機(jī)制,可以將代碼轉(zhuǎn)換傳遞注入 Julia 的編譯器,從而實(shí)現(xiàn)事后分析和現(xiàn)有代碼的擴(kuò)展。除了用于分析和調(diào)試等開發(fā)工具之外,這甚至可以實(shí)現(xiàn)機(jī)器學(xué)習(xí)任務(wù)的自動(dòng)區(qū)分。 異構(gòu)體系結(jié)構(gòu)支持得到了極大的改進(jìn),并且與 Julia 編譯器的內(nèi)部結(jié)構(gòu)進(jìn)一步分離。
有關(guān)更改的完整列表,可參閱:
0.7 NEWS file Julia 1.0
|