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)。