Julia 1.5 リリースノート
新しい言語機能
- マクロの呼び出し
@foo {...}
は空白を省略して@foo{...}
と書けるようになりました (#34498)。 -
⨟
が乗算と同じ優先順位を持つ二項演算子としてパースされるようになりました。この記号は REPL で\bbsemi
の後にTAB
を押すことで入力できます (#34722)。 -
±
と∓
が+
や-
と同様に単項演算子としても扱われるようになりました。マクロや行列のコンストラクタでは空白が意味を持つので注意が必要です。例えば[a ±b]
は[±(a, b)]
ではなく[a ±(b)]
としてパースされます (#34200)。 - 識別子
x
をキーワード引数あるいは名前付きタプルの要素に渡すとx=x
と等価になるようになりました。つまり変数の名前がキーワードまたはタプルフィールドの名前として使われます。同様に、式a.b
ではb
がキーワードまたはフィールドの名前として使われます (#29333)。 - Unicode 13.0.0 が (utf8proc 2.5 を通して) サポートされました (#35282)。
- コンパイラ最適化レベルを実験的なマクロ
Base.Experimental.@optlevel n
を使ってモジュールごとに設定できるようになりました。パフォーマンスが重要でないコードに対するこの値を 0 または 1 に設定することで、反応時間を大幅に改善できる可能性があります (#34896)。
言語の変更
- 対話的 REPL はトップレベルの式に対して「ソフトスコープ」を使うようになりました。つまり、
for
ループなどのブロック内部で起こる代入は、値が代入される変数がグローバル変数として定義されていればその変数に対する代入となります。これは Julia 0.6 以前と同様の振る舞いであり、IJulia もこの振る舞いを採用しています。この変更はデフォルトの REPL に対して入力された (あるいはペーストされた) コードに対してだけ影響を及ぼすことに注意してください (#28789, #33864)。 - REPL でない場所 (つまりファイル) において、トップレベルのスコープブロック内で変数への代入が起こり、その変数と同じ名前のグローバル変数が存在する場合には、その代入は曖昧とみなされます。曖昧な代入が起こると警告が表示され、そのコードは REPL では異なる動作をすることがユーザーに伝えられます。この警告はコマンドライン引数
--warn-scope
で制御できます (#33864)。 -
convert(NTuple, (1, ""))
のような任意のタプルからNTuple
への変換は誤って許されていましたが、エラーを出すようになりました。エラーである理由は、NTuple
は均一なタプルだけを表すためです (NTuple
の意味は変わっていません) (#34272)。 -
(;)
という記法はバージョン 1.4 で非推奨となりましたが、空の名前付きタプルを作るようになりました (#30115)。 -
@inline
マクロが短形式の無名関数に適用できるようになりました (#34953)。 -
三重クオートを使った文字列リテラルにおいて、空白の削除がエスケープシーケンスの処理の後ではなく前に行われるようになりました。例として次の文字列リテラルを考えます:
""" a\n b"""
これまでは
b
の前の一つの空白がインデントの量を設定し、このリテラルは" a\nb"
を表しました。これに対して Julia 1.5 では上記の文字列は"a\n b"
と解釈されます。b
の前の空白が行の始めにあるとはみなされないためです。これまでの振る舞いはバグです (#35001)。 -
<:
と>:
を.<:
と.>:
で配列に対してブロードキャストできるようになりました (#35085)。 - パーサーが関数定義の行番号を関数本体の先頭に
LineNumberNode
として追加するようになりました (#35138)。 -
a'
がBase.adjoint(a)
ではなくvar"'"(a)
と展開されるようになりました。これによりBase.adjoint
関数をローカルスコープで隠すことが可能になります (ただし通常は隠すべきではありません)。デフォルトでは Base がvar"'"
をBase.adjoint
の別名として公開するので、独自型はBase.adjoint
を拡張するべきです (#34634)。
コンパイラ・ランタイムの改善
- 要素に参照を持つ不変構造体 (タプルを含む) のスタック上へのアロケート、および配列や他の構造体内部へのインラインのアロケートが可能になりました (#33886)。これにより一部の処理におけるヒープアロケートの数が大幅に減少します。オブジェクトのレイアウトとアドレスに関する仮定をしているコード (典型的には C などの言語と協調動作するコード) では更新が必要になるかもしれません。例えば、アドレスが変わってはいけないオブジェクトは
mutable struct
であるべきです。この変更の結果として、配列のview
はアロケートを行わなくなりました (#34126)。
コマンドライン引数の変更
- デフォルトでは非推奨の警告が出力されないようになりました。言い換えると、
--depwarn=...
フラグが与えられないときのデフォルト値が--depwarn=no
となりました。ただしPkg.test()
が実行するテストではこの警告は出力されます (#35362)。 - 標準出力と標準エラー出力が TTY のときデフォルトで色が付くようになりました (#34347)。
-
-t N
または--threads N
を使うと Julia がN
スレッドで起動するようになりました。このオプションはJULIA_NUM_THREADS
より優先されます。このオプションが指定する値はコマンドライン引数-p
/--procs
および--machine-file
で起動されるワーカープロセスにも伝播されます。addprocs
で起動するワーカープロセスのスレッド数を設定するには、キーワード引数exeflags
を使ってaddprocs(...; exeflags=`--threads 4`)
のようにしてください (#35108)。
マルチスレッディングに関する変更
- マルチスレッディング API のいくつかの部分は注意事項付きの安定 (stable) とされました。例えば
Base.Threads
が公開する識別子でドキュメントされているものは (atomic_
演算を除いて) 全て安定です。 -
@threads
が省略可能なスケジュールに関する引数を取るようになりました。@threads :static ...
とすれば、以前のバージョンと同じスケジュールが使われることを保証できます。デフォルトで使われるスケジュールは将来変更される予定です。 - ロックがファイナライザの実行を自動的に防ぐようになりました。デッドロックを避けるためです (#38487)。
ビルドシステムの変更
- make だけが関係するキャッシュシステムがビルドシステムに追加され、時間のかかる処理をできるだけ遅く (かつ一度だけ) 実行するようになりました (#35626)。
新しいライブラリ関数
- パッケージのユーザーがエラーに遭遇したときに、その解決を助けるためのヒントを提供できるようになりました。実験的な
Experimental.register_error_hint
関数を使います。独自の例外型を定義するパッケージでは、showerror
メソッドからExperimental.show_error_hints
を呼び出すことでヒントをサポートできます (#35094)。 - Base に
@ccall
マクロが追加されました。これはccall
を Julia 風の構文で置き換えるものです (正確に同じではありません)。このマクロは異なる型を持つ可変長引数に対するforeigncall
もラップしますが、LLVM の呼び出し規約を指定する機能がありません (#32748)。 -
combine
引数を持ったmerge!
とmerge
を置き換える関数としてmergewith!
とmergewith
が追加されました。これらの関数はcombine
がFunction
でなければならない制限を持たず、クロージャを返す単一引数のメソッドも提供します。merge
とmerge!
を使った古いメソッドは後方互換性のために残されています (#34296)。 - 二つのコレクションが共通要素を持たないかどうかを判定する
isdisjoint
関数が新しく追加されました (#34427)。 - オブジェクトが改変可能かどうかを判定する
ismutable
関数を追加し、isimmutable
関数を非推奨としました (#34652)。 -
include
は省略可能な第一引数mapexpr
を受け取るようになりました。この引数はパースされた式を評価する前に変形します (#34595)。 - 固定長整数のビットの並びを反転させる
bitreverse
関数が新しく追加されました1 (#34791)。 - 固定長整数のビットの並びを回転させる
bitrotate(x, k)
関数が新しく追加されました (#33937)。 -
contains(haystack, needle)
関数が新しく追加されました。加えて、この関数を部分適用する単一引数の関数も追加されました。contains(haystack, needle)
関数はoccursin(needle, haystack)
のように動作します (#35132)。 - Ctrl-C で生じる
InterruptException
を制御するためのexit_on_sigint
関数が新しく追加されました (#29411)。 -
Vector
から任意の位置にある要素を削除するpopat!(vector, index, [default])
関数が追加されました (#35513, #36070)。
新しいライブラリ機能
- 関数合成が単一引数に対しても動作するようになりました。
∘(f) = f
が成り立ちます (#34251)。 - 単一引数を受け取る
startswith(x)
とendswith(x)
が追加されました。それぞれ部分適用されたバージョンの関数を返します。この振る舞いは既存のisequal(x)
と同様です (#33193)。 -
isapprox
(≈
) に単一の引数を受け取る「カリー化された」メソッドisapprox(x)
が追加されました。isapprox(x)
はisequal
(==
) と同様に関数を返します (#32305)。 -
NamedTuple
の宣言を簡単にするための@NamedTuple{key1::Type1, ...}
マクロが追加されました (#34548)。 -
ccall
におけるPtr{T}
とRef{T}
にRef{NTuple{N,T}}
を渡せるようになりました (#34199)。 - 整数のビット型に対する
x::Signed % Unsigned
とx::Unsigned % Signed
がサポートされました。 - 整数のビット型に対する
signed(unsigned_type)
とunsigned(signed_type)
がサポートされました。 -
accumulate
,cumsum
,cumprod
がTuple
(#34654) と任意の反復子 (#34656) をサポートしました。 -
replacemenet
を指定せずにsplice!
を使うとき、削除される値を (UnitRange
に限らない) 任意の反復可能オブジェクトを使って指定できるようになりました (#34524)。 -
@view
マクロと@views
マクロが Julia 1.4 で導入されたa[begin]
の構文をサポートしました (#35289)。 - ファイルに対する
open
にキーワード引数lock
が追加されました。lock
は複数スレッドからのアクセスにおける安全性を保証するロックをファイル操作時に取得するかどうかを制御します。lock
をfalse
に設定すると性能が向上しますが、ファイルにアクセスできるスレッドは一つだけとなります (#35426)。 -
@which
や@code_typed
などの関数呼び出しの情報を取得するマクロがdo
ブロック構文 (#35283) とドット構文 (#35522) に対応しました。 -
count
がdims
キーワードを受け取るようになりました。 sum!
に似たインプレースのcount!
関数が追加されました2。-
peek
が公開されました。この関数はストリームからデータを覗き見て、それを指定された型の値として返します (#28811)。
標準ライブラリの変更
- 空の区間同士の比較が開始地点とステップに関わらず
true
を返すようになりました #32348。 - 一次元 (
Base.IteratorSize
がBase.HasShape{1}()
を返す) かつ長さn
のZip
反復子がサイズ(n,)
を持つようになりました (#29927)。 -
@timed
マクロがNamedTuple
を返すようになりました (#34149)。 - 型
T
の全ての上位型を含んだタプルを返すsupertypes(T)
関数が新しく追加されました (#34419)。 - 組み込みの範囲に対するビューは
SubArray
ではなく (添え字を使った場合と同じように) 再計算された区間となりました (#26872)。 - キーワード引数
lt
,rev
,order
,by
を受け取るsort
をはじめとしたソート関連の関数は、by
またはlt
が渡されたときorder
を無視しないようになりました。by
が渡されたときはorder
が定める順序を使ってby(element)
の値が比較され、lt
が渡されたときはorder
がForward
またはReverse
でないと順序が曖昧であることを示すエラーが発生します。 - ファイル (
IOStream
) に対するclose
は、バッファされたデータをディスクに書き出すときにエラーが起こった場合に例外を送出するようになりました (#35303)。 -
StridedArray
型 (実体は大きなUnion
) を出力するとき、特別な出力関数を使って型全体が出力されるのを防ぐようになりました (#31149)。
線形代数
- BLAS サブモジュールがレベル 2 の BLAS サブルーチン
hpmv!
をサポートしました (#34211)。 -
normalize
が多次元配列をサポートしました (#34239)。 - LQ 分解を使って劣決定系の最小ノルム解を計算できるようになりました (#34350)。
-
sqrt(::Hermitian)
がほぼ半正定値の行列の小さな負の固有値を 0 とみなすようになり、この許容範囲を定めるキーワード引数rtol
を受け取るようになりました (#35057)。 - BLAS サブモジュールがレベル 2 の BLAS サブルーチン
spmv!
をサポートしました3 (#34320)。 - BLAS サブモジュールがレベル 1 の BLAS サブルーチン
rot!
をサポートしました4 (#35124)。 - 総称関数
rotate!(x,y,c,s)
とreflect!(x,y,c,s)
が新しく追加されました5 (#35124)。
Markdown
- docstring において、 "Extended help" という名前をしたレベル 1 の Markdown ヘッダーが「簡単なヘルプ」と「完全なヘルプ」を分けるマーカーとして解釈されるようになりました。デフォルトで REPL は簡単なヘルプ ("Extended Help" ヘッダーの前にある文章) だけを表示します。'?' をもう一つ (ヘルプモードに入るための '?' とは別に) 先頭へ加えれば完全な docstring を閲覧できます (#25930)。
乱数
-
randn!(::MersenneTwister, ::Array{Float64})
が高速になりました。この結果として、任意の RNG の状態が生成する乱数が変わります (#35078)。 -
randn!(::MersenneTwister, ::Array{Bool})
が高速になりました。この結果として、任意の RNG の状態が生成する乱数が変わります(#33721)。 - 特定の区間に含まれる乱数を生成するアルゴリズムが高速に (ほぼ除算を使わないように) なりました (#29240)。この結果として、
rand(1:9)
のような区間およびrand([1, 2, 3])
のようなコレクションからの選択で生成される乱数の列が変わります。また、Int
型のa, b
に対するrand(a:b)
がシードに関わらず 32 ビットアーキテクチャと 64 ビットアーキテクチャで同じストリームを生成するという (ドキュメントされていなかった) 性質が失われました。
疎配列
-
lu!
がシンボリックな分解を利用するための引数としてUmfpackLU
を受け取るようになりました。 - 関数
fkeep!
,tril!
,droptol!
,dropzeros!
,dropzeros
からキーワード引数trim
が取り除かれ、必ず削除を行うようになりました。以前のバージョンでこれらの関数をtrim=false
として呼び出すと、疎配列が不正になる可能性がありました。
日時
ソケット
-
UDPSocket
に対する UDP マルチキャストグループへの追加と削除がjoin_multicast_group
とleave_multicast_group
を通じてサポートされました6 (#35521)。
分散計算
外部依存ライブラリ
- OpenBLAS が v0.3.9 に更新されました (#35113)。